Bygga din egen Wifi-radion (9 / 14 steg)
Steg 9: kod
När du programmera din Atmega, bör du också inaktivera JTAG i fusebits och ställa den interna oscillatorn till 8MHz.
Koden kommer att passa in i en Atmega16 men jag använde en Atmega32 som jag vill lägga till några extra funktioner senare.
$regfile = "m32def.dat"
$crystal = 8000000
$baud = 9600
Config Serialin = buffrat, storlek = 255
Config Serialout = buffrat, storlek = 100
Config Graphlcd = 240 * 128, Dataport = Porta, Controlport = Portc, Ce = 5, Cd = 4, Wr = 7, Rd = 6, återställa = 2, Fs = 3, Mode = 8
Config Scl = Portc.0
Config Sda = Portc.1
Cha Alias Pind.3
CHB Alias Pind.4
Config Cha = ingång
Config Chohung bank = ingång
CONST Ds1307w = & HD0 "skriva DS1307
CONST Ds1307r = & HD1 ' läsa ds1307
CONST Adsecs = & H00 ' adress sekunder
CONST Admins = & H01 ' adress minuter
Dim räknas som Byte
Dim jag som Byte
Dim J som Byte
Dim Pos som Byte
Dim Oldpos som Byte
Dim Maxpos som Byte
Dim staten som Byte
Dim volym som Byte
Dim Temp som Byte
Dim Uart_in som Byte
Dim Uart_buffer som Byte
Dim timmar som Byte
Dim Mins som Byte
Dim SEK som Byte
Dim längd som Byte
Dim Boxx som Byte
Dim Boxx2 som Byte
Dim Tube(4) som Byte
Dim X som Byte
Dim Uart_in_str som sträng * 255
Dim Stationname som sträng * 60
Dim titel som sträng * 60
Dim Station_pos som Byte
Dim Title_pos som Byte
Dim pekaren som Byte
Dim Station_length som Byte
Dim Title_length som Byte
Dim Temp_str som sträng * 4
Dim Volumestr som sträng * 3
Dim Station(20) som sträng * 30
På Int0 0int
Aktivera Int0
Aktivera avbrott
' Ange Chohung bank
På Int1 1int,
Aktivera Int1
Aktivera avbrott
Vänta 1
CLS
Init:
ShowPic 0, 0, Intro
Box (115, 90)-(200, 104), 255
För I = 118 till 194 steg 4
J = I + 3
Boxfill (i, 92) - j, 102, 255
Vänta 3
Nästa
Skriva ut Chr(13)
Vänta 2
Skriva ut "mpc klart"
För I = 0 till 3
Stationname = Lookupstr (i, Tunerlist2)
Skriva ut "mpc add"; Stationname
Nästa
Print "mpc volym 50"
Print "mpc play"
Volym = 20
GOSUB Empty_buffer
Jag = 1
Count = 1
Main:
State = jag
CLS
Om statliga = 1 så gå till Radio
Om statliga = 2 sedan Goto Tuning
Om statliga = 3 sedan Goto Vol
Om statliga = 4 så gå till Setup
Radio:
Maxpos = 6
POS = 1
Oldpos = 1
Boxx = 0
Boxx2 = 40
ShowPic 0, 88, spela
ShowPic 40, 88, paus
ShowPic 80, 88, Stopp
ShowPic 120, 88, volym
ShowPic 160, 88, Tuner
ShowPic 200, 88, klocka
Box (0, 88)-(40, 127), 255
Göra
Om jag <> Ange sedan Goto Main
Om Pos <> Oldpos sedan
Box (boxx, 88)-(boxx2, 127), 0
Boxx = Pos - 1
Boxx = Boxx * 40
Boxx2 = Boxx + 40
Box (boxx, 88)-(boxx2, 127), 255
Oldpos = Pos
Slut om
Skriva ut "echo"; Chr(34); "låt"; Chr(34); " | NC localhost 6600 | grep -e "; Chr(34); "^ Titel:"; Chr(34); " -e " ; Chr(34); "^ Namn:"; Chr(34); ">/dev/tts/0"; Chr(13)
Waitms 500
GOSUB Getuart
GOSUB Parser
CLS Text
Leta upp 5, 1
LCD-Stationname
Leta upp 8, 1
LCD-titel
GOSUB Readclock
Loop
Tuning:
CLS
Count = 1
Göra
CLS Text
Om jag <> Ange sedan Goto Main
GOSUB Readclock
För J = 1 till 4
Station(j) = Lookupstr (j, Tunerlist)
Nästa
J = Count
Leta upp 5, 5
LCD-Station(j)
J = antal + 1
Leta upp 6, 5
LCD-Station(j)
J = Count + 2
Leta upp 7, 5
LCD-Station(j)
Waitms 500
Loop
Volymprocent:
CLS
Göra
GOSUB Readclock
Om jag <> Ange sedan Goto Main
Skriva ut "echo"; Chr(34); "status"; Chr(34); " | NC localhost 6600 | grep -e "; Chr(34); "^ volym:"; Chr(34); ">/dev/tts/0"; Chr(13)
Waitms 100
GOSUB Getuart
GOSUB Volumeparser
CLS Text
Leta upp 6, 10
Volym = Val(volumestr)
LCD "volym:"; Volym
Loop
Setup:
J = 1
Om J = 1 sedan Count = timmar annat Count = Mins
CLS
Göra
CLS
Om jag <> Ange sedan Goto Main
"Gosub Readclock
Om J = 1 sedan timmar = räkna annat minuter = Count
Tube(2) = minuter / 10 "delas i timmar och minuter till
Temp = Tube(2) * 10 ' 4 siffror så att den kan visas
Tube(1) = minuter - Temp
Tube(4) = timmar / 10
Temp = Tube(4) * 10
Tube(3) = timmar - Temp
Temp = Tube(4)
X = 48
GOSUB Clockpic
Temp = Tube(3)
X = 72
GOSUB Clockpic
Temp = 11
X = 96
GOSUB Clockpic
Temp = Tube(2)
X = 120
GOSUB Clockpic
Temp = Tube(1)
X = 144
GOSUB Clockpic
Leta upp 8, 8
LCD jag
Waitms 100
Loop
Slutet
0int:
Om jag = 1 och Pos = 1 sedan Skriv "mpc play"
Om jag = 1 och Pos = 2 sedan Skriv "mpc paus"
Om jag = 1 och Pos = 3 sedan Skriv "mpc stopp"
Om jag = 1 och Pos = 4 då jag = 3
Om jag = 1 och Pos = 6 då jag = 4
Om statliga = 2 sedan
Print "mpc play"; Greve
Jag = 1
Slut om
Om jag = 1 och Pos = 5 då jag = 2
Waitms 100
Om statliga = 3 då jag = 1
Om jag = 4 och J = 2 då
GOSUB Setclock
Jag = 1
Slut om
Om jag = 4 och J = 1 då
GOSUB Setclock
J = 2
Slut om
Returnera
1int:
Waitms 1
Om Cha = 1 och jag <> 3 sedan
Om Chohung bank = 0 då Incr räkna annat Decr Count
Slut om
Om Cha = 1 och jag = 3 då
Om Chohung bank = 0 sedan Skriv "mpc volym + 5" annat Print "mpc volym -5"
Slut om
POS = Count
Om Pos > Maxpos då Pos = Maxpos
Om Pos < 1 sedan Pos = 1
Returnera
Getuart:
Uart_in_str = ""
Göra
Uart_buffer = Ischarwaiting()
Om Uart_buffer > 0 då
Uart_in = Inkey()
Om Len(uart_in_str) < 254 då Uart_in_str = Uart_in_str + Chr(uart_in)
Om Len(uart_in_str) = 254 sedan Uart_in_str = Uart_in_str + Chr(13)
Slut om
Loop tills Uart_buffer = 0
GOSUB Empty_buffer
Returnera
Volumeparser:
Volumestr = ""
Temp = Instr (uart_in_str, "volym:")
Temp = Temp + 8
Volumestr = Mid (uart_in_str, Temp, 3)
Returnera
Parser:
Stationname = ""
Title = ""
Station_pos = Instr (uart_in_str, "namn:")
Title_pos = Instr (uart_in_str, "titel:")
Station_pos = Station_pos + 6
Längd = 0
Göra
INCR längd
Pekaren = Station_pos + längd
Temp_str = Mid (uart_in_str, pekare, 1)
Loop tills Temp_str = Chr(13) eller Temp_str = ""
Om längd > 60 då längd = 60
Stationname = Mid (uart_in_str, Station_pos, längd)
Title_pos = Title_pos + 7
Längd = 0
Göra
INCR längd
Pekaren = Title_pos + längd
Temp_str = Mid (uart_in_str, pekare, 1)
Loop tills Temp_str = Chr(13) eller Temp_str = ""
Om längd > 60 då längd = 60
Titel = Mid (uart_in_str, Title_pos, längd)
Om Station_pos = 6 då Stationname = "Namn hittades inte!"
Om Title_pos = 7 sedan titel = "Titel hittades inte!"
Returnera
Empty_buffer:
Göra
Uart_in = Inkey()
Uart_buffer = Ischarwaiting()
Loop tills Uart_buffer = 0
Returnera
Readclock:
I2cstart
I2cwbyte Ds1307w
I2cwbyte Admins
I2cstop
I2cstart
I2cwbyte Ds1307r
I2crbyte minuter, Ack
I2crbyte timmar, Nack
Timmar = timmar och & B00111111 "tar bort bit6 & bit7
Timmar = Makedec(hours) ' omvandlar BCD till Decimal
Minuter = Makedec(mins)
Tube(2) = minuter / 10 "delas i timmar och minuter till
Temp = Tube(2) * 10 ' 4 siffror så att den kan visas
Tube(1) = minuter - Temp
Tube(4) = timmar / 10
Temp = Tube(4) * 10
Tube(3) = timmar - Temp
Temp = Tube(4)
X = 48
GOSUB Clockpic
Temp = Tube(3)
X = 72
GOSUB Clockpic
Temp = 11
X = 96
GOSUB Clockpic
Temp = Tube(2)
X = 120
GOSUB Clockpic
Temp = Tube(1)
X = 144
GOSUB Clockpic
Returnera
Setclock:
Minuter = Makebcd(mins)
Timmar = Makebcd(hours)
Återställa Hours.6
I2cstart
I2cwbyte Ds1307w
I2cwbyte Adsecs
I2cwbyte & B00000000
I2cwbyte minuter
I2cwbyte timmar
I2cstop
Timmar = timmar och & B00111111 "tar bort bit6 & bit7
Timmar = Makedec(hours) ' omvandlar BCD till Decimal
Minuter = Makedec(mins)
Returnera
Clockpic:
Om Temp = 1 sedan Showpic X, 0, 1
Om Temp = 2 sedan Showpic X, 0, 2
Om Temp = 3 sedan Showpic X, 0, 3
Om Temp = 4 sedan Showpic X, 0, 4
Om Temp = 5 sedan Showpic X, 0, 5
Om Temp = 6 sedan Showpic X, 0, 6
Om Temp = 7 sedan Showpic X, 0, 7
Om Temp = 8 sedan Showpic X, 0, 8
Om Temp = 9 sedan Showpic X, 0, 9
Om Temp = 0 då Showpic X, 0, 0
Om Temp = 11 sedan Showpic X, 0, Dp
Returnera
Intro:
$bgf "wifiradio.bgf"
Spela:
$bgf "play.bgf"
Paus:
$bgf "pause.bgf"
Stopp:
$bgf "stop.bgf"
Volym:
$bgf "volume.bgf"
Tuner:
$bgf "tuner.bgf"
Klocka:
$bgf "clock.bgf"
0:
$bgf "0.bgf"
1:
$bgf "1.bgf"
2:
$bgf "2.bgf"
3:
$bgf "3.bgf"
4:
$bgf "4.bgf"
5:
$bgf "5.bgf"
6:
$bgf "6.bgf"
7:
$bgf "7.bgf"
8:
$bgf "8.bgf"
9:
$bgf "9.bgf"
DP:
$bgf "dp.bgf"
Streep:
$bgf "streep.bgf"
Tunerlist:
Data "", "1920 nätverk", "KCEA", "FM Tango Junin Argentina", "TANGOCLUB"
Tunerlist2:
Data "http://64.5.130.43:80", "http://198.182.76.2:8000", "http://200.58.116.222:10580", http://190.245.64.194:8000