$regfile = "m2560def.dat"
$crystal = 16000000 'zewnętrzny rezonator kwarcowy 16MHz - standard Arduino
$hwstack = 64
$swstack = 16
$framesize = 64
Config Submode = New
'--- UART PC ---
Config Com1 = 115200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Open "Com1:" For Binary As #1 : Const Pc = 1
Config Serialin0 = Buffered , Size = 250 , Bytematch = 13
Config Input = Cr , Echo = Cr : Echo Off
Dim Com1_str As String * 250
'--- UART ESP ---
Config Com2 = 115200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Open "Com2:" For Binary As #2 : Const Esp = 2
Config Serialin1 = Buffered , Size = 250 , Bytematch = 10
Config Input1 = Crlf , Echo = Crlf : Echo Off
Dim Com2_str As String * 250
'--- TIMER ---
Config Timer0 = Timer , Prescale = 1024 , Clear_timer = 1 : Compare0a = 155 '10ms @16MHz/1024
'--- czas ---
Dim 100ms As Byte , 1s As Byte , 1m As Byte
'--- PC ---
Dim Pc_nadaje As Byte
Dim Bufor As Byte
Dim Pc_dane(2) As String * 20
'--- ESP8266 ---
Dim Esp_nadaje As Byte
Dim Send_time As Byte
Dim Cmd As String * 250
Dim Cmd_len As String * 25
Dim Lenght As Byte
Dim State As Byte
Dim Mem_state As Byte
Const Startup = 0
Const Waiting = 1
Const Send_len = 2
Const Sending = 3
'--- obsługa PC ---
Sub Pc_uart
Bufor = Split(com1_str , Pc_dane(1) , " ")
Select Case Pc_dane(1)
Case "halo"
Print #pc , "hej"
Case "123"
Print #pc , "abc"
Case "haha"
Print #pc , "hi hi"
Case Else 'jeżeli odebrany znak to żaden z powyższych to wyczyść bufor
Print #pc , "ehhh... cos poszlo nie tak..."
Pc_dane(1) = ""
Pc_dane(2) = ""
End Select
'wyczyść bufor i wyjdź
Pc_dane(1) = ""
Pc_dane(2) = ""
End Sub
'--- obsługa ESP8266 ---
Sub Esp_uart
Select Case State
Case Startup
If Instr(com1_str , "WIFI GOT IP") > 0 Then
Cmd = "AT+CIPSTART={034}TCP{034},{034}192.168.1.2{034},80"
Print #esp , Cmd
Cmd = "GET /receiver.php?key=1234"
Cmd = Cmd + "&&id=1;11;2;22;3;33"
Cmd = Cmd + "&type=water;volt;gas;volt;elec;volt"
Cmd = Cmd + "&value=0.001;1.11;0.01;2.22;0.0005;3.33"
Cmd = Cmd + "¤t=1;---;2;---;3;---"
Cmd = Cmd + "&device=ip&name=PiCount_2_"
Cmd = Cmd + "{032}HTTP/1.1{013}{010}"
Cmd = Cmd + "Host:{032}192.168.1.2"
Cmd = Cmd + "{013}{010}{013}{010}"
Mem_state = State 'zapamiętaj, że zaczynamy
State = Waiting
End If
Case Waiting 'jeśli czekamy na odpowiedź
Select Case Com1_str
Case "OK" 'jeśli zobaczymy OK
Select Case Mem_state
Case Startup 'Poprzedni był auto-start, więc to pierwszy "OK"
Mem_state = Send_len
Lenght = Len(cmd) : Cmd_len = Str(lenght)
Cmd_len = "AT+CIPSEND=" + Cmd_len
Print #esp , Cmd_len
Case Send_len 'drugie „OK”, więc wysyłamy Len danych, które chcemy wysłać
Print #esp , Cmd
State = Sending
Mem_state = Sending 'zapamiętaj, że wysyłamy dane do serwera
'do obsługi błędów
End Select
Case "ERROR" 'błąd połączenia
State = Startup : Send_time = 0
Case "CLOSED" 'połączenie zamknięte
State = Startup : Send_time = 0
End Select
Case Sending 'wysyłka danych
Select Case Com1_str
Case "SEND OK" 'wysyłanie powiodło się
State = Startup : Send_time = 0
Case "CLOSED" 'połączenie zamknięte
State = Startup : Send_time = 0
Case "SEND FAIL" 'wysyłanie nie powiodło się
State = Startup : Send_time = 0
End Select
End Select
End Sub
Enable Interrupts
'**********************
'*** PROGRAM GŁÓWNY ***
Do
If Tifr0.ocf0a = 1 Then 'minęło 10ms - flagę ustawia Timer
Tifr0.ocf0a = 1 'kasuj flagę
If 100ms < 9 Then
Incr 100ms
Else 'minęło 100ms
100ms = 0
If 1s < 9 Then
Incr 1s
Else 'minęła 1s
1s = 0
If 1m < 59 Then
Incr 1m
Else 'minęła 1m
1m = 0
Print #esp , "AT+RST" 'budź ESP i ślij dane na serwer
End If
End If
End If
End If
If Pc_nadaje = 1 Then
Pc_nadaje = 0
Call Pc_uart
End If
If Esp_nadaje = 1 Then
Esp_nadaje = 0
Call Esp_uart
End If
Loop
End
'*** KONIEC GŁÓWNEJ PĘTLI ***
'****************************
'--- przerwanie UART ---
Serial0charmatch:
$asm
!PUSH R6
!PUSH R16
!PUSH R17
!PUSH R18
!PUSH R19
!PUSH R22
!PUSH R24
!PUSH R25
!PUSH R26
!PUSH R27
!PUSH R30
!IN R24, SREG
!PUSH R24
$end asm
$timeout = 3000
Input#pc , Com1_str
Clear Serialin0
Pc_nadaje = 1
' Tuned with NoSave Tool 1.10
$asm
!POP R24
!OUT SREG, R24
!POP R30
!POP R27
!POP R26
!POP R25
!POP R24
!POP R22
!POP R19
!POP R18
!POP R17
!POP R16
!POP R6
$end Asm
Return
Serial1charmatch:
$asm
!PUSH R6
!PUSH R16
!PUSH R17
!PUSH R18
!PUSH R19
!PUSH R22
!PUSH R24
!PUSH R25
!PUSH R26
!PUSH R27
!PUSH R30
!IN R24, SREG
!PUSH R24
$end asm
$timeout = 3000
Input #esp , Com2_str
Clear Serialin1
Esp_nadaje = 1
' Tuned with NoSave Tool 1.10
$asm
!POP R24
!OUT SREG, R24
!POP R30
!POP R27
!POP R26
!POP R25
!POP R24
!POP R22
!POP R19
!POP R18
!POP R17
!POP R16
!POP R6
$end Asm
Return