Hackster Inc.
Avtor: stevetearle
2020_290_
WiFi komunicira z vašo Arduino napravo od kjer koli s pomočjo serijskega terminala.
Kaj vse potrebujemo?
Hardverske komponente
- Arduino Nano R3………………………………………….× 1
- DT-06 Wireless WiFi module TTL To WiFi……..× 1
- Espressif ESP8266 ESP-01…………………………….× 1
Softverske aplikacije in spletne storitv
- Zip datoteka, ki vsebuje Jee Labs ESP Link Firmware V3.0.14 in Expressif Flash orodje
Zgodba
Arduino serijski UART je glavna pot do spremljanja in nadzora dejavnosti v Arduinu. Uporaben je za odpravljanje napak, spremljanje vrednosti podatkov, konfiguriranje nastavitev in RTC-ja ter pošiljanje nadzornih ukazov v Arduino.
Do serijskih vrat običajno dostopate tako, da odprete okno Arduino IDE Monitorja ali uporabite ustrezen terminalski program. Fizična povezava se lahko izvede neposredne preko kabelske povezave z USB Arduino vtičnico ali s povezavo preko Rx & Tx Arduino priključkov in z uporabo serijskega TTL v USB pretvornika (npr. proizvajalca FTDI).
Brezžični dostop do Arduino serijskih vrat je pogosto bolj priročen in uporaben kot USB žična povezava.
Dostop do serijskih vrat za upravljanje vašega Arduina na daljavo od koder koli prek internetne povezave odpira veliko aplikacij in idej. Za začetnike je tukaj prikazan preprost terminalski vmesnik tipa »ukaz / odziv«, je enostaven za uporabo, enostaven za prilagajanje in uporabniku prijazen z uporabo nekaterih lepih serijskih terminalskih aplikacij v Androidu..
Z uporabo WiFi serijskega modula, kot je DT-06, lahko podatke o serijskih vratih transparentno prenesemo prek Wi-Fi. Do serijskih vrat lahko nato dostopate iz katere koli mobilne naprave ali osebnega računalnika, ki je povezan z vašim lokalnim brezžičnim omrežjem, s pomočjo ustreznega terminalskega programa.
Z nekaj manjšimi konfiguracijskimi preobrati v vašem usmerjevalniku je kmalu mogoče dostopati do serijskih vrat vašega Arduina iz internetne povezave kjer koli na Zemlji. To je lahko zelo koristno in predstavlja verjetno najpreprostejše izhodišče za ustvarjanje in dostop do IoT – “interneta stvari”.
V tem primeru uporabljam DT-06 WiFi to Serial modul za oddaljeni dostop do LoadMaster PV solarnega regulatorja tople vode ali Arduino Nano. Nastavitev strojne opreme in koda serijskega WiFi-ja (obe kodi sta priloženi: Primer kode in projektna koda Full LoadMaster) zlahka prilagodite in prenesete v druge aplikacije.
Začetek; serijska komunikacija preko Bluetooth Low Energy(HM-10).
Moje “potovanje” po brezžičnih serijskih vratih se je pričelo z nizkoenergijskim Bluetooth modulom HM-10 v kombinaciji z odlično serijsko aplikacijo Android Bluetooth avtorja Kai Moriche.
To je delovalo izjemno dobro, saj je zagotovilo povezavo na oddaljenosti več kot 40 m na prostem in ni veliko manjkalo, da bi bil moj Arduino (v zunanji opečni garaži) dostopen iz skoraj vseh prostorov naše sosednje hiše.
Tukaj predstavljene metode serijskega terminala veljajo tudi za uporabo BLE HM-10. Namesto WiFi različice morate preprosto uporabiti različico Bluetooth aplikacije serijskega terminala.
Nato sem naletel na serijski WiFi modul DT-06. Kot lahko vidite na sliki, ima ta modul enak razpored priključkov kot BLE HM-10. Je poceni in temelji na ESP-8285. Za razliko od uporabe ES8266-01S modulov, DT-06 vključuje vgrajeni 3V3 regulator za napajanje ESP modula. Kot razumem, sta kodi ESP8266 in 8285 združljivi, čeprav morate med programiranjem upoštevati velikost dejanske naprave in položaj naslova naloženih datotek.
Čeprav obstajajo Arduino WiFi in Arduino serijski WiFi primeri (ki so se začeli v prejšnji veji ESP-Link aplikacije), sem kasneje ugotovil, da je Jee Labs kodo esp-povezave lažje nastaviti.
Z nekaj iskanja po spletu lahko ugnezdeno ESP-Link programsko opremo programiramo v ESP8266-01S modul. Izdelati morate 1k2k / 2k2 pretvornik napetostnih nivojev, da zmanjšate 5V Arduino (tj. Nano) Tx linije do 3V3 ravni, ustrezne za ESP. ESP8266 bo zahteval tudi 3V3 regulator, če uporabljate 5V Arduino Nano, … pravzaprav je DT-06 bolj primeren, saj vam olajša življenje in brez težav zamenja HM-10 BLE.
Naložimougnezdeno programsko opremo
Uporabil sem Esp-Link V3.0.14 ugnezdeno programsko opremo, ki sem jo prenesel iz spletnega naslova [1] (ali lažje iz stisnjene datoteke Flash programskega orodja v razdelku Aplikacije in storitve tega projekta).
Na spletni povezavi poiščite stisnjeno datoteko TGZ v Downloads mapi:
Odprite datoteko z zip programom, kot je 7-Zip za Microsoft trgovino. Pomaknite se do prenesene datoteke tgz v mapi za prenose.
Dvokliknite na to in zdaj boste videli, da ta stisnjena datoteka vsebuje drugo compressed.tar datoteko.
Izberite datoteko in kliknite Extract.
Zdaj bi morali imeti pridobljene datoteke ugnezdene programske opreme pripravljene za programiranje.
Zdaj potrebujemo programska orodja
Če želite programirati ESP 8285 modul, iz spleta prenesite Expressif ‘Flash Download Tools (ESP8266 & ESP32)’ (ali uporabite stisnjen paket datotek v tem projektu za aplikacije in storitve).
Programiranje hardverskih povezav
Za programiranje modula bomo s 5V USB-RS232TTL (npr. FTDI) ploščo povezali Tx in RX liniji DT-06 modula na USB vrata vašega računalnika. Iskanje v Googlu bo tudi pokazalo, kako je mogoče uporabiti Arduino s kodo „serijsko programsko opremo“.
Podatkovni listi kažejo, da ima DT-06 serijski upor na svoji Rx liniji zato, da je odporen na 5V. Nekateri pravijo, da je to narobe, modul ima oznako ‘Level 3V3’, kako torej? Kakorkoli že, da bi se izognili kakršnemu koli dimu, je enostavno uporabiti upore 1k2 in 2k2 za napetostni delilnik in zagotoviti varno pretvorbo s 5V na 3V3. 3 V Tx nivo iz DT-06 dobro deluje z Arduino 5 V Rx nivojem.
Programiranje
Iz prenesenih Expressif programskih datotek zaženite Flash_download_tools_v3.6.7.exe – Počakajte nekaj sekund in izberite »ESP8285 download Tool«.
Kliknite ‘…’ tipko in izberite spodaj prikazane datoteke ugnezdene programske opreme na mestu DT-06. Naredite to za vse štiri datoteke ugnezdene programske opreme.
Vnesite šestnajstiške naslove pomnilnika, kot je prikazano v desnih poljih, nato na levi strani označite vsa štiri polja za izbiro datoteke.
Povežite FTDI adapter z DT-06 in ga vklopite v USB na svojem PC-ju in izberite COM vrata.
In zdaj pomemben del (kjer sem se jaz zmotil!)
DT-06 morate nastaviti v “Boot mode”. Da bi to storili natančno sledite navodilom:
Pritisnite in DRŽITE S1. Medtem ko držite S1, začasno pritisnite in spustite S2, da ponastavite ploščo, ki se bo zdaj postavila v Boot način. Zdaj lahko sprostite S1 in ste pripravljeni na brisanje ali ponovno programiranje plošče.
V Expressif Download aplikaciji pritisnite Erase tipko. Na FTDI plošči bi morali videti utripajoče lučke Rx& Tx (če jih imate!). Aplikacija bo po dokončanju prikazala napis »FINISHED«
Zdaj je čas za za programiranje ugnezdene programske opreme
Ponovite zaporedje pritiskov tipk, kot prej! DT-06 je spet pripravljen za nalaganje ugnezdene programske opreme.
Pritisnite tipko Start in si oglejte nalaganje ugnezdene programske opreme. Ko končate, odstranite in ponovno vklopite USB napajanje ali pritisnite S2, da ponastavite modul.
Nastavitve WiFi
Za Android napravo priporočam, da naložite Serial WiFi Terminal aplikacijo avtorja Kai Morich v trgovini Google Play [2].
V Android napravi poiščite brezžična omrežja. DT-06 bi zdaj moral oddajati SSID AP (dostopne točke) “ESP _ ?????”. Povežite se s tem WiFi-jem (ignorirajte „dostop do WiFihasnointernet“).
Odprite brskalnik in v naslovno vrstico vnesite 192.168.4.1 in pritisnite Enter.
Morali bi videti, DT-06 spletno stran:
Na tem zaslonu se boste morda želeli pomakniti navzdol in spremeniti ‘Pin Assignments”Conn LED’ v gpio4 in kliknite ‘Change’.
Pritisnite trivrstično tipko »meni« levo zgoraj in izberite »uC Consol«. Za delovanje z Loadmaster ali Arduino ‘Command Response Terminal’ kodo nastavite module na 9600 Baud-ov.
Pritisnite trivrstično »meni« tipko, izberite WiFi Station in nato preklopite v STA + AP način.
Zdaj bi morali videti seznam SSID WiFi omrežij, izberite svoj WiFi, vnesite geslo in pritisnite Connect. Po približno petih sekundah mora WiFi okence stanja pokazati, da je DT-06 zdaj uspešno povezan z vašim “konfiguriranim omrežjem” in LED-ica DT-06 bi morala svetiti.
Začasno si zapišite WiFi IP naslov: – ???. ???. ???. ???
Ko se modul poveže z vašim omrežjem, preklopi postaja v “ST” način in zapre WiFi oddajo »Dostopna točka«. Ker AP omrežja zdaj ni več, bi se morala Android naprava samodejno znova povezati z običajnim WIFi omrežjem, s katerim je zdaj povezan tudi DT-06.
Zdaj pojdite v naslovno vrstico brskalnika in vnesite IP naslov, ki ste ga zabeležili, še enkrat bi se morala prikazati DT-06 spletna stran.
Poskusite odpreti »UC Console« možnost menija. Na PC zaprite orodje za prenos in odprite Arduino IDE. Odprite serijski monitor, izberite pravilno številko COM vrat na 9600 Baud. Zdaj bi moralo biti možno serijsko sporočilo pošiljati iz ene naprave v drugo. Vse deluje!
Opomba: DT-06 Tx in Rx priključki morata biti nastavljena tako, da uporabljata enako baudno hitrost kot naprava, na katero je povezan modul. To nastavite v meniju “uC Console” v vmesniku spletnega strežnika.
V Android napravi odprite Serial WiFi Terminal aplikacijo. V meniju Naprave izberite dodaj (+). Nastavite »Host« na omenjeni IP naslov, vrata pa na 23. Nastavitev Display naj bo nastavljena na »Terminal«.
Zdaj bi morali biti sposobni pošiljati sporočila med Arduino IDE zaslonom serijskega monitorja in Android aplikacijo. Če se povezava iz kakršnega koli razloga izgubi, se znova povežite z ikono za povezavo v zgornji vrstici aplikacije.
Nastavitev IP naslova modula
OK, zaenkrat je vse dobro.
Naslov IP naprave, ki ste ga zabeležili, je bil modulu dodeljen iz vašega usmerjevalnika s postopkom, znanim kot DCHP. Njegov “Dynamic” pomeni, da bo naslednjič, ko se modul poveže z vašim omrežjem, zlahka dobil popolnoma drug IP naslov. To otežuje življenje in v idealnem primeru potrebujemo, da vaš usmerjevalnik vedno poveže isti IP naslov vsakič, ko se vaš modul poveže na usmerjevalnik.
Vsi usmerjevalniki so različni, tukaj bom razložil osnovne korake za domače BT vozlišče, čeprav bi moral biti osnovni koncept podoben tudi pri drugih znamkah.
Logirajte se v svoj Ruter, za BT je to običajno 192.168.1.254.
Vnesite geslo za vstop v način »Advanced Settings« in nato pojdite na »Home Network«. Tu bi morali videti seznam vseh naprav, ki so trenutno povezane z vašim omrežjem, med tem seznamom pa bi morali najti ESP napravo:
Kliknite esp-link napravo. Naslednji meni prikazuje možnosti naslavljanja in za to napravo morate zdaj izbrati možnost »Always use this IP address«
Prav tako je mogoče določiti fiksni IP naslov na esp-link spletni strani, VENDAR, morate s tem pristopom biti prepričani, da izberete naslov izven obsega naslavljanja DHCP usmerjevalnikov. Morda se obrnite na svojega IT prijatelja.
- Vaš DT-06 esp-link modul bo zdaj vedno na voljo na istem IP naslovu v vašem omrežju … zato si zapišite ta naslov!
Zdaj bi lahko imeli serijski dostop do DT-06 iz katere koli druge naprave v omrežju z ustreznim terminalskim programom. Če želite do svojih WiFi serijskih vrat kdaj dostopati samo znotraj svojega omrežja, se lahko ustavite tukaj.
Kaj pa dostop do vašega omrežja od zunaj, od koder koli preko interneta?
DDNS
Tako kot DT-06 modul dinamično pridobi prost IP naslov s strani DHCP usmerjevalnika, večina ponudnikov internetnih storitev rezidenčnim strankam naključno dodeli dinamični IP naslov vsakič (tudi v večini primerov), ko se usmerjevalnik ponovno poveže z internetom. Če uporabite Whatsmyip [3], bodo usmerjevalniki prikazali trenutni domači zunanji IP naslov.
Spreminjanje zunanjega IP naslova otežuje uporabo vašega privatnega IP naslova z drugimi storitvami (tj. varnostnimi kamerami, termostati ali serijskim ESP modulom itd.), saj se lahko naslov spremeni brez predhodnega obvestila.
Dinamični DNS ali »DDNS« rešuje problem nenehnega spreminjanja IP naslovov tako, da dinamično dodeljen IP naslov poveže s konsistentnim imenom domene.
Vaš usmerjevalnik mora imeti stran za DDNS nastavitev. Določiti boste morali, katere DDNS storitve podpira, in se nato z eno od njih registrirati na DDNS račun. Obstajajo različne brezplačne storitve (FreeDNS, DynDNS, afraid.org, DuckDNS, No-IP etc.). Nekatere brezplačne storitve zahtevajo, da račun vsak mesec potrdite z e-poštnimi povezavami ali pa plačate pristojbino za več DDNS imen in druge napredne storitve.
V BT HomeHub se DDNS namestitev nahaja v meniju Advanced Settings, Broadband, Dynamic DNS.
Vaš DDNS račun bo imel povezana uporabniško ime, geslo in ime gostitelja. Še enkrat jih shranite na varno!
Po nastavitvi, osvežitvi in čakanju nekaj minut se prijavite pri DDNS ponudniku. IP naslov, ki ga prikažejo glede na ime DDNS gostitelja, se mora ujemati z imenom WhatsmyIP [3] storitve.
Zdaj lahko vzpostavimo stik z dinamičnim IP naslovom vašega usmerjevalnika s fiksnim DDNS imenom gostitelja od kjer koli v internetu.
V vašem omrežju poznamo fiksni naslov za DT-06 ESP-Link in serijsko napravo. Iz varnostnih razlogov ne morete preprosto dostopati do notranjih IP naslovov iz zunanjega interneta! Zdaj moramo nastaviti “Port forwarding”.
Posredovanje vrat (angl. Port Forwarding)
Posredovanje vrat je postopek prestrezanja podatkovnega prometa, usmerjenega v kombinacijo IP naslovov in številk vrat računalnika, in preusmeritev na drug IP naslov in / ali vrata. Ta preusmeritev se običajno izvede v nastavitvah požarnega zidu usmerjevalnika – nastavitve posredovanja vrat.
Predstavljajte si vrata kot končno točko komunikacije, ki opredeljujejo določen postopek programske opreme ali vrsto omrežne storitve. V primeru ESP-Link privzeto vaš promet serijskih vrat po omrežju (Telnet) servisirajo Port 23 moduli. Spletna stran A.P. je podprta na standardnih vratih 80 spletnega strežnika.
Posredovanje vrat si predstavljajte kot način, ki se uporablja za preslikavo določene številke vrat storitve, ki prispe na IP naslov vašega usmerjevalnika, na določen IP naslov interne naprave in uporablja bodisi enako ali drugačno številko vrat.
V BT hub-u se prijavite v meniju Napredne nastavitve. Posredovanje vrat najdete v meniju Požarni zid.
Najprej je treba ustvariti novo pravilo za preslikavo vrat. V BT vozlišču se to imenuje Dodajanje nove igre ali aplikacije:
V zgornjem primeru smo pravilo za preslikavo poimenovali ESP-Link Telnet in ustvarili pravilo, ki pravi: ‘Vsak prispel internetni promet, ki želi uporabiti storitev Port 23, bo skozi usmerjevalnik prešel v notranje omrežje in bo še vedno označen za uporabo vrat 23. Če imate v svojem omrežju dve ESP-Link zaporedni napravi, morate do njih dostopati z različnimi zunanjimi številkami vrat, tj. ena lahko še vedno uporablja vrata 23, za druga pa lahko zunaj dostopate tako, da nastavite aplikacijo Telnet terminala na uporabo recimo vrat 4750 in nato preslikavo vhodnega prometa vrat 4750 do vrat 23.
Končno moramo zdaj pravilu preslikave vrat dodeliti ustrezno notranjo napravo / IP naslov.
Po dodajanju tega pravila bo zunanji promet, označen za storitev na vratih 23, posredovan na notranji IP naslov 192.168.1.183 in bo ostal označen za uporabo storitve vrat 23 na tej napravi. Ne pozabite shraniti nastavitev.
Demo in serijska WiFi terminalnaaplikacija
Naložite demo kodo v Arduino Nano. Rx priključek Arduino Nano plošče povežite s Tx priključkom DT-06 modula, Tx priključek Arduino Nano plošče pa prek prilagodilnika napetostnega nivoja 1k2 – 2k2 na Rx priključek DT-06 modula.
OPOMBA!! – Pri nalaganju ugnezdene programske opreme je treba, da se izognete konfliktom na komunikacijah, začasno odklopiti Tx linijo DT-06 modula (prek mostička P2 na Loadmaster) ali preprosto odklopiti DT-06 modul.
Priklopite 5V napajanje na Arduino (ne iz USB vtičnice, če so USB podatkovne linije spet povezane z osebnim računalnikom – prišlo bi do kolizije s podatkovnimi linijami Rx / Tx DT-06 modula!).
V Android Serial WiFi Terminal aplikaciji povežite napravo. Morali bi prejeti sporočilo ob uspešni povezavi.
Če pošljete ‘?’ bi se Arduino moral odzvati s seznamom Interface menijev.
Pošljite ‘L 1’, da vklopite vgrajeno LED-ico. Pošljite ‘L 2’ za izklop vgrajene LED-ice.
S sporočilom ‘S 12 34 56 -678’ bo ponazorjeno, kako podatkovne spremenljivke v programu zdaj vsebujejo ločene številke. LoadMaster uporablja ta pristop za hkratno pošiljanje in nastavljanje več (HH: MM DD MM LLLL) RTC vrednosti itd.
Če v aplikaciji pritisnete in držite menijske tipke, jih lahko nastavite z imenom tipke in znakom, ki ga bodo poslali ob pritisku. To ustvari hiter, preprost, zanesljiv in prilagodljiv dvosmerni komunikacijski vmesnik do oddaljene naprave. Čeprav je stran spletnega strežnika morda bolj privlačna, bo njena implementacija trajala 20-krat dlje!
Viri:
1: https://github.com/jeelabs/esp-link/releases/tag/V3.0.14
2: https://play.google.com/store/apps/details?id=de.kai_morich.serial_wifi_terminal&gl=GB
3: https://www.whatsmyip.org/
Povzeto po: https://www.hackster.io/stevetearle/remote-serial-terminal-connectivity-from-anywhere-dt-06-wifi-16fbb0
https://www.hackster.io/
Programska koda
Demo ukazi – odgovor terminalskega vmesnika
Arduino
Krmilnik za vročo vodo LoadMaster MPPT PV je mogoče na daljavo krmilit s serijskim ukazomOdgovor terminalskega vmesnika. Ta Demo ponuja osnovno idejo o uporabljenih konceptih kode. Oglejte si Loadmaster projektno kodo, da vidite, kako lahko s to metodo vmesnika nastavite RTC vrednosti itd.
/*This is an Example of a Serial Command-response interface.
Arduino’s Serial data can be transparently carried over Wifi using a DT-06 (or ESP8266-01)
Wifi Modules are loaded with esp-link firmware
BLE (HM-10) wireless links also work well.
Check Baud on the WifI module is set to match this program
Tested using excellent Android ‘Serial WiFI Terminal’ and ‘Serial Bluetooth Apps’ by Kai Moriche.
Sending a ‘?’ +(CRLF) character will cause the Arduino to display a list of serial menu options
Sending a ‘L 1’ Turns the Nanos onboard LED On, L 2 turns it Off (COMMANDS USE CAPITAL LETTERS)
Sending ‘W 23’ would save a new Temperature setting of 23 to the EEPROM
Dated : 10th Jam 2020
V1.01
Hardware //////////////////////////////////////////////////////////////////////////
This code uses the main serial port of the Arduino – shared by the USB socket on a Nano.
When programming you MUST disconnect the DT-06 Wifi module connected to Tx & Rx to avoid data conflicts
For the Demo, Power the Arduino from its 5V pins or use a USB ‘power only’ source.
*/ #include<EEPROM.h> //1024 Byte EEPROM byteLED=13; //The Nano's on-board LED intVolts_ADC=A1; //We will display volts on A1 when requested floatVolts=0; byteTempSet=0; //Illustrating a non volatile setting configured via the serial connection unsignedlongmsec=0; unsignedlongLastmsec=0; unsignedlongUpdateInterval=1000; booleanOutputData=false; //Variables used in Serial CLI and Message Parsing constbytenumChars=30; // Maximum Char length of received serial messages terminated in a Linefeed. charreceivedChars[numChars]; charRxdSerialMessage[numChars] = {0}; // variables to hold the parsed data intRxdInt1=0; intRxdInt2=0; floatRxdFloat2=0; // Option to receive and use float values within command strings intRxdInt3=0; intRxdInt4=0; intRxdInt5=0; charCommandChar=0; booleanNewData=false; //************************************ MAIN PROGRAM START - SETUP ******************************* voidsetup() { Serial.begin(9600); // Configue Hardware Serial. Serial.flush(); // Clears the Serial RX buffer TempSet=EEPROM.read(2); //Reads a saved setup value from EEPROM address location 2 pinMode(LED, OUTPUT); digitalWrite(LED, LOW); //Set Nanos onboard LED initially off } //*********************************** MAIN PROGRAM LOOP ************************************** voidloop() { SerialRxWithEndMarker(); //Check for data message in serial buffer //messages seperated by NewLine char if (NewData==true) { parseData(); // Function to Split message into command and space seperated values //showParsedData(); // FOR TEST ONLY! see what Character command and values are received HandleCommand(); //Routine to identify & manage different received command characters } msec=millis(); // We use the millis millisecond runtime counter to schedule specific tasks if ((msec-Lastmsec) >UpdateInterval) { //The Code below is executed evert MPPT update interval - 100ms) if (OutputData==true) { Serial.print(F("Volts on A1 = ")); Serial.print(0.004887*analogRead(Volts_ADC)); // read the Volts input A1 Serial.println("Volts"); } Lastmsec=msec; } } //****************************PROGRAM MAIN LOOP END ************************************ //****************************SUBROUTINES FOLLOW *************************************** voidHandleCommand (void) // The first character within a received serial message (from SerialRxWithEndMarker CR/LF) is extracted by the ParseData Subroutine // this routine identifies and handles the specific command request. { switch (CommandChar) { case'?':// receiving a ? character will display the Serial Terminal command Menu ClearTerminal (); Serial.println(F("Serial Command Response Demo V1.0")); Serial.println(F("--- Command list: ---")); Serial.println(""); Serial.println(F("? - Show this Menu!")); Serial.println(F("V - Stream A1 Voltage")); Serial.println(F("L - Control LED")); Serial.println(F("S - Show Rxd message 'S 123 -456 54 67'etc")); Serial.print(F("W - Set Limit")); Serial.print(F(" (Currently ")); Serial.print(TempSet); Serial.println(F("°C )")); break; case'V'://Turns on streaming of Voltage reading on A1 ClearTerminal (); Serial.println(F("Request to Output Voltage has been Received")); OutputData=true; break; case'L'://Calls routine to turn LED on or OFF depending on Rxint1 value SetLED(); break; case'S'://Calls routine to display all values in Receive command string showParsedData(); break; case'W'://Calls routine to set temp limit 0 to 70C and save in EEPROM SetTemp(); break; } } //******************************************************************************************************************************************************** // Serial print commands used to Clear Telnet Terminal Screen and position Cursor to Home position voidClearTerminal (void) { Serial.write(27); // ESC command Serial.print("[2J"); // Clear Screen...actually fills screen with carriage returns so earlier terminal data is not lost. Serial.write(27); Serial.print("[H"); // Cursor to Home position } //**************************************************************************************** voidSetTemp(void) // Serial command W sets and stores the target temperaturein EEPROM { ClearTerminal (); //Clears Serial Terminal Screen and positions Cursor at Home position if (RxdInt1==0) { Serial.print(F(" Current Temp limit is ")); Serial.print(TempSet); Serial.println(F("°C")); Serial.println(F("Set the °C limit using 'W HW' where HW= 1 to 70")); } else { if (RxdInt1>0&&RxdInt1<71) { TempSet=RxdInt1; Serial.print(F(" Temperature limit has been set to ")); Serial.print(TempSet); Serial.println(F("°C")); EEPROM.write(2, TempSet); //Save temperature threshold to EEPROM address 2. } Serial.print("Temperature Limit = "); Serial.print(TempSet); Serial.println("°C"); } } //************************* voidSetLED (void) // Serial command sets and stores the target water temperature { ClearTerminal (); //Clears Serial Terminal Screen and positions Cursor at Home position if (RxdInt1==2) { Serial.print(F("Turn LED off")); digitalWrite(LED, LOW); //LED off } elseif (RxdInt1==1){ Serial.print(F("Turn LED On")); digitalWrite(LED, HIGH); //LED On } else{ Serial.println(F("To Turn the LED ON send 'L 1'")); Serial.println(F("To Turn LED off send 'L 2'")); } } //******************************************************************************************************************************************* voidSerialRxWithEndMarker() { //("expects to receive strin of characters terminated in a LF. Max buffer size is currently 30 chars, text or Integer and an optional floating point value seperated by a comma"); //("Enter data in this style "C/I 24.7 CRLF " C/I maybe a text command String or Integer value, after the space should be a float value ); // You can ommit the comma and Float value if not required //Note the parsing methods are now implemented in the functions specific to commands staticbytendx=0; charendMarker='n'; charrc; // if (Serial.available() > 0) { while (Serial.available() >0&&NewData==false) { //reads in new characters from serial buffer rc=Serial.read(); if (rc!=endMarker) { //Looks for a new line code to end the message receivedChars[ndx] =rc; ndx++; if (ndx>=numChars) { ndx=numChars-1; } } else { receivedChars[ndx] =' '; // terminate the string a new serial message has been received ndx=0; NewData=true; } } } //**************************************************************************************************** voidparseData() { // split the data into its parts char*strtokIndx; // this is used by strtok() as an index strtokIndx=strtok(receivedChars, ""); // get the first part of string before the first space Char strcpy(RxdSerialMessage, strtokIndx); // copy it to RxdSerial message - extracts text string at start of a message if required CommandChar=receivedChars[0]; //First Char in the initial command string is used to identify the Command strtokIndx=strtok(NULL, ""); // this continues where the previous call left off RxdInt1=atoi(strtokIndx); // convert the next part of command upto next space to an integer strtokIndx=strtok(NULL, ""); RxdInt2=atoi(strtokIndx); // convert this part to an Int - NOTE Currently Float values are not used in any commands //RxdFloat2 = atof(strtokIndx); // If you want to recieve Floats, - NOTE Currently Float values are not used in any commands strtokIndx=strtok(NULL, ""); RxdInt3=atoi(strtokIndx); // convert this part to a float - NOTE Currently Float values are not used in any commands strtokIndx=strtok(NULL, ""); RxdInt4=atoi(strtokIndx); // convert this part to a float - NOTE Currently Float values are not used in any commands strtokIndx=strtok(NULL, ""); RxdInt5=atoi(strtokIndx); // convert this part to a float - NOTE Currently Float values are not used in any commands NewData=false; // The last received message has been identified handled OutputData=false; // Stop Outputting Data values if a new message is received, } //******************************************************************************************************************* voidshowParsedData() { // Used for testing only to see how command and integer values are extracted Serial.print("Initial CommandChar "); Serial.println(CommandChar); Serial.print("RxdInt1 = "); Serial.println(RxdInt1); Serial.print("RxdInt2 = "); Serial.println(RxdInt2); Serial.print("RxdInt3 = "); Serial.println(RxdInt3); Serial.print("RxdInt4 = "); Serial.println(RxdInt4); Serial.print("RxdInt5 = "); Serial.println(RxdInt5); }