3. novembra, 2020

Oddaljena serijska terminalska povezava od koder koli z DT-06 WiFi modulom

ha 300x80 - Oddaljena serijska terminalska povezava od koder koli z DT-06 WiFi modulomHackster 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.

s1 5 300x225 - Oddaljena serijska terminalska povezava od koder koli z DT-06 WiFi modulomDo 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.

s2 300x134 - Oddaljena serijska terminalska povezava od koder koli z DT-06 WiFi modulom

Slika prikazuje HM-10 BLE modul in DT-06 WiFi modul

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:

esp-link-v3.0.14-g963ffbb.tgz

Odprite datoteko z zip programom, kot je 7-Zip za Microsoft trgovino. Pomaknite se do prenesene datoteke tgz v mapi za prenose.

s3 300x66 - Oddaljena serijska terminalska povezava od koder koli z DT-06 WiFi modulomDvokliknite na to in zdaj boste videli, da ta stisnjena datoteka vsebuje drugo compressed.tar datoteko.

s4 300x80 - Oddaljena serijska terminalska povezava od koder koli z DT-06 WiFi modulomIzberite 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“.

S5 300x197 - Oddaljena serijska terminalska povezava od koder koli z DT-06 WiFi modulom

Slika prikazuje povezavo modulov na razvojni plošči

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.S6 300x254 - Oddaljena serijska terminalska povezava od koder koli z DT-06 WiFi modulom

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.

S7 300x273 - Oddaljena serijska terminalska povezava od koder koli z DT-06 WiFi modulomV 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:S8 225x300 - Oddaljena serijska terminalska povezava od koder koli z DT-06 WiFi modulom

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:

S9 300x106 - Oddaljena serijska terminalska povezava od koder koli z DT-06 WiFi modulomKliknite esp-link napravo. Naslednji meni prikazuje možnosti naslavljanja in za to napravo morate zdaj izbrati možnost »Always use this IP address«

S10 300x90 - Oddaljena serijska terminalska povezava od koder koli z DT-06 WiFi modulomPrav 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.

  1. 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!

S11 300x221 - Oddaljena serijska terminalska povezava od koder koli z DT-06 WiFi modulomPo 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.

S12 300x219 - Oddaljena serijska terminalska povezava od koder koli z DT-06 WiFi modulomS13 300x88 - Oddaljena serijska terminalska povezava od koder koli z DT-06 WiFi modulomPo 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] ='\0'; // 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);

}