poniedziałek, 15 lipca 2019

[4] ESP32 - Konwerter Wifi UART

W tym poście chciałbym przedstawić zmodyfikowany projekt konwertera UART na WIFI jako TCP Serwer.

Znalezione obrazy dla zapytania arduino esp32
[Źródło: http://paulobrien.co.nz/2017/03/16/esp32-programming-with-arduino-on-windows/]

Oryginalny projekt na którym opierałem tą modyfikację można pobrać z serwisu Github od użytkownika AlphaLima.

Program:


Na samym początku przetestuję samą komunikację po RS485:

  1. #define RXD2  16
  2. #define TXD2  17
  3. #define RDE   26
  4. #define TXE   27
  5. void setup() {
  6.   Serial.begin(115200);
  7.   pinMode(RDE, OUTPUT);
  8.   pinMode(TXE, OUTPUT);
  9.   delay(20);
  10.   digitalWrite(26, HIGH);
  11.   digitalWrite(27, HIGH);
  12.   delay(5);
  13.   Serial2.begin(115200, SERIAL_8N1, RXD2, TXD2);
  14.   Serial.println("Test Serial Send");
  15.   Serial2.println("Test Serial2 Send");
  16.   delay(10);
  17.    
  18.   digitalWrite(26, LOW);
  19.   digitalWrite(27, LOW);
  20. }
  21. void loop() {
  22.   while (Serial2.available()) {
  23.     Serial.print(char(Serial2.read()));
  24.   }
  25.   while (Serial.available()) {
  26.     digitalWrite(26, HIGH);
  27.     digitalWrite(27, HIGH);
  28.     delay(2);
  29.     Serial2.print(char(Serial.read()));
  30.     delay(2);
  31.     digitalWrite(26, LOW);
  32.     digitalWrite(27, LOW);
  33.     delay(2);
  34.   }
  35. }

Wynik działania programu powinien przesyłać dane pomiędzy UART2 a UART0. Dane przesłane przez UART0 przekazywane są na UART2, dane nadane na UART2 są przesyłane na UART0.

Dodatkowo posiadany prze zemnie konwerter jest 5V. Co oznaczało konieczność zastosowania konwertera poziomów logicznych z 3V3 na 5V. Ponieważ ESP32 akceptuje i operuje na napięciach 3V3.

Poniżej znajduje się projekt podstawowy pozwalający na podłączenie do sieci zdefiniowanej w programie:

  1. //-------------------------------------------------------------
  2. #include "config.h"
  3. #include <esp_wifi.h>
  4. #include <WiFi.h>
  5. #include <WiFiClient.h>
  6. //-------------------------------------------------------------
  7. #ifdef OTA_HANDLER
  8. #include <ArduinoOTA.h>
  9. #endif // OTA_HANDLER
  10. //-------------------------------------------------------------
  11. HardwareSerial* COM[NUM_COM] = {&Serial, &Serial1};
  12. //-------------------------------------------------------------
  13. WiFiServer server_0(SERIAL0_TCP_PORT);
  14. WiFiServer *server[NUM_COM]={&server_0};
  15. WiFiClient TCPClient[NUM_COM][1];
  16. //-------------------------------------------------------------
  17. uint8_t buf1[NUM_COM][bufferSize];
  18. uint16_t i1[NUM_COM]={0};
  19. uint8_t buf2[NUM_COM][bufferSize];
  20. uint16_t i2[NUM_COM]={0};
  21. //-------------------------------------------------------------
  22. void setup() {
  23.   delay(500);
  24.   Start_Uart_0();
  25.   Start_Uart_1();
  26.   EnableWifiStationMode();
  27.   WifiStart();
  28.   ArduinoOta_Setup();
  29.   EnableAndSetDefaultRS485Pins();
  30. }
  31. void loop()
  32. {
  33.   ArduinoOTA_Handle_Loop();
  34.   ClientConnection_Loop();
  35.   WriteRS485Data();
  36. }
  37. //------------------------------------------------------
  38. static void SetRS485ControlPinsDirection()
  39. {
  40.   #ifdef RS485_ENABLE
  41.   pinMode(RE_PIN, OUTPUT);
  42.   pinMode(DE_PIN, OUTPUT);
  43.   #endif
  44. }
  45. static void SetRS485PinToSendData()
  46. {
  47.   #ifdef RS485_ENABLE
  48.   digitalWrite(RE_PIN, HIGH);
  49.   digitalWrite(DE_PIN, HIGH);
  50.   #endif
  51. }
  52. static void SetRS485PinToReceiveData()
  53. {
  54.   #ifdef RS485_ENABLE
  55.   digitalWrite(RE_PIN, LOW);
  56.   digitalWrite(DE_PIN, LOW);
  57.   #endif
  58. }
  59. static void Start_Uart_0(void)
  60. {
  61.   COM[0]->begin(UART_BAUD0, SERIAL_PARAM0, SERIAL0_RXPIN, SERIAL0_TXPIN);
  62. }
  63. static void Start_Uart_1(void)
  64. {
  65.   COM[1]->begin(UART_BAUD1, SERIAL_PARAM1, SERIAL1_RXPIN, SERIAL1_TXPIN);
  66. }
  67. //------------------------------------------------------
  68. //Initialization functions
  69. static void EnableAndSetDefaultRS485Pins(void)
  70. {
  71.   #ifdef RS485_ENABLE
  72.   SetRS485ControlPinsDirection();
  73.   delay(5);
  74.   SetRS485PinToReceiveData();
  75.   delay(3);
  76.   #endif
  77. }
  78. static void EnableWifiStationMode(void)
  79. {
  80.   if(debug) COM[DEBUG_COM]->println("Open ESP Station mode Test Project v1.0");
  81.   WiFi.mode(WIFI_STA);
  82.   WiFi.begin(ssid, pw);//ssidArray, passwordArray);
  83.   if(debug) { COM[DEBUG_COM]->print("try to Connect to Wireless network: "); }
  84.   if(debug) { COM[DEBUG_COM]->println(ssid); }
  85.   while (WiFi.status() != WL_CONNECTED) {
  86.     delay(500);
  87.     if(debug) COM[DEBUG_COM]->print(".");
  88.   }
  89.   if(debug) COM[DEBUG_COM]->println("\nWiFi connected");
  90. }
  91. static void WifiStart()
  92. {
  93.   if(debug) COM[DEBUG_COM]->println("Starting TCP Server 1");
  94.   server[0]->begin(); // start TCP server
  95.   server[0]->setNoDelay(true);
  96. }
  97. static void ArduinoOta_Setup()
  98. {
  99.   #ifdef OTA_HANDLER
  100.   ArduinoOTA
  101.     .onStart([]() {
  102.       String type;
  103.       if (ArduinoOTA.getCommand() == U_FLASH)
  104.         type = "sketch";
  105.       else // U_SPIFFS
  106.         type = "filesystem";
  107.       // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
  108.       Serial.println("Start updating " + type);
  109.     })
  110.     .onEnd([]() {
  111.       Serial.println("\nEnd");
  112.     })
  113.     .onProgress([](unsigned int progress, unsigned int total) {
  114.       Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
  115.     })
  116.     .onError([](ota_error_t error) {
  117.       Serial.printf("Error[%u]: ", error);
  118.       if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
  119.       else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
  120.       else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
  121.       else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
  122.       else if (error == OTA_END_ERROR) Serial.println("End Failed");
  123.     });
  124.   // if DNSServer is started with "*" for domain name, it will reply with
  125.   // provided IP to all DNS reques
  126.   ArduinoOTA.begin();
  127.   #endif // OTA_HANDLER
  128. }
  129. //------------------------------------------------------
  130. static void ArduinoOTA_Handle_Loop(void)
  131. {
  132.   #ifdef OTA_HANDLER
  133.   ArduinoOTA.handle();
  134.   #endif // OTA_HANDLER
  135. }
  136. static void ClientConnection_Loop()
  137. {
  138.   if(server[0]->hasClient())
  139.   {
  140.       if (!TCPClient[0][0] || !TCPClient[0][0].connected())
  141.       {
  142.         if(TCPClient[0][0])
  143.         {
  144.           TCPClient[0][0].stop();
  145.         }
  146.         TCPClient[0][0] = server[0]->available();
  147.        
  148.         if(debug) COM[DEBUG_COM]->print("New client for COM");
  149.         if(debug) COM[DEBUG_COM]->print(0);
  150.         if(debug) COM[DEBUG_COM]->println(0);
  151.        }
  152.     //no free/disconnected spot so reject
  153.     WiFiClient TmpserverClient = server[0]->available();
  154.     TmpserverClient.stop();
  155.   }
  156. }
  157. static void WriteRS485Data(void)
  158. {
  159.     if(COM[1] != NULL)        
  160.   {        
  161.       if(TCPClient[0][0])
  162.       {
  163.         while(TCPClient[0][0].available())
  164.         {
  165.           buf1[1][i1[1]] = TCPClient[0][0].read(); // read char from client (LK8000 app)
  166.           if(i1[1]<bufferSize-1)
  167.           {
  168.             i1[1]++;
  169.           }
  170.         }
  171.         if(i1[1] != 0x00)
  172.         {
  173.           SetRS485PinToSendData();
  174.           delay(5);
  175.           COM[1]->write(buf1[1], i1[1]); // now send to UART(num):
  176.           delay(5);
  177.           SetRS485PinToReceiveData();
  178.           i1[1] = 0;
  179.         }
  180.       }
  181.    
  182.       if(COM[1]->available())
  183.       {
  184.         while(COM[1]->available())
  185.         {  
  186.           buf2[1][i2[1]] = COM[1]->read(); // read char from UART(num)
  187.           if(i2[1]<bufferSize-1)
  188.           {
  189.             i2[1]++;
  190.           }
  191.         }
  192.      
  193.         if(TCPClient[0][0])  
  194.         {              
  195.           TCPClient[0][0].write(buf2[1], i2[1]);
  196.         }
  197.         i2[1] = 0;
  198.       }
  199.    }
  200. }

Powyższy program pobiera i przesyłane odebrane ramki danych pomiędzy portem 8880 TCP Serwer a RS485. Dodatkowo umieszczona jest w nim obsługa ArduinoOta tak aby można było wgrać program bez konieczności podłączania urządzenia do komputera.

Kolejnym elementem jest przesyłanie ustawień sieciowych tak aby można było przełączyć sieć wifi bez konieczności przeprogramowania urządzenia. Tutaj można rozwiązać problem na dwa sposoby.
Pierwszy z nich to wpisywanie danych przez UART do układu gdzie w ramce podawana jest nazwa sieci oraz hasło. Drugi sposób polega na uruchomieniu ESP jako AP po nim wyświetlana jest strona internetowa lub przez program jako TCP Serwer. Po połączeniu wprowadza się dane na stronie lub jako klient podłączony do serwera TCP.

Poniżej przedstawię rozwiązanie opierające się na ustawieniu parametrów przez port UART0. Uruchomienie wprowadzania ustawień następuje przez zwarcie pinu 18 do masy i zresetowaniu konwertera.

Zacznijmy od ustawiania parametrów za pomocą ramki danych. Przykładowy format ramki:

Ramka służąca do ustawienia SSID sieci:
  • Bajt Startu - 0x01
  • Kod Rozkazu - 0xB6
  • Dlugość SSID - od 1 do 255
  • SSID[Długość SSID] - bajty w kodzie ASCII zawierające nazwę sieci z którą zamierzamy się połączyć.

Ramka służąca do ustawienia hasła sieci:
  • Bajt Startu - 0x01
  • Kod Rozkazu - 0xA5
  • Dlugość hasła - od 1 do 255
  • Hasło[Długość hasła] - bajty w kodzie ASCII z hasłem do sieci

Podobnie można wykonać inne rozkazy. Do powyższych rozkazów dołożyłem jeszcze następujące ustawienia:
  • wybór portu dla serwera - 0xD8;
  • wybór prędkości dla RS485 - 0xE7;

Odpowiedzią na powyższe funkcję będzie retransmisja otrzymanej ramki danych tak aby ewentualny program ustawiający parametry mógł zweryfikować poprawność nadawanych i odebranych danych.

Poniżej znajduje się cały projekt odpowiadający za pełną obsługę powyższego konwertera:

  1. //ESP32 UART -> TCP Server Converter V1.0
  2. //-------------------------------------------------------------
  3. #include "config.h"
  4. #include <esp_wifi.h>
  5. #include <WiFi.h>
  6. #include <WiFiClient.h>
  7. #include <Preferences.h>
  8. //-------------------------------------------------------------
  9. #ifdef OTA_HANDLER
  10. #include <ArduinoOTA.h>
  11. #endif // OTA_HANDLER
  12. //-------------------------------------------------------------
  13. HardwareSerial* COM[NUM_COM] = {&Serial, &Serial1};
  14. //-------------------------------------------------------------
  15. String wifiSSID;
  16. String wifiPassword;
  17. uint32_t Baudrate_RS485;
  18. uint32_t ConnectionPort;
  19. //-------------------------------------------------------------
  20. WiFiServer server_0(SERIAL0_TCP_PORT);
  21. WiFiServer *server[NUM_COM]={&server_0};
  22. WiFiClient TCPClient[NUM_COM][1];
  23. Preferences preferences;      /* For NVS with contains SSID and Password*/
  24. //-------------------------------------------------------------
  25. uint8_t buf1[NUM_COM][bufferSize];
  26. uint16_t i1[NUM_COM]={0};
  27. uint8_t buf2[NUM_COM][bufferSize];
  28. uint16_t i2[NUM_COM]={0};
  29. //-------------------------------------------------------------
  30. uint8_t specialSettingProgramFlag = 0;
  31. //-------------------------------------------------------------
  32. void setup() {
  33.   delay(300);
  34.   EnableTestWriteSettingsPin();
  35.   delay(200);
  36.   if(digitalRead(WRITE_SETTINGS_PIN_NUM) == LOW)    //Start special program with setting network/rs485 parameters
  37.   {
  38.     Start_Uart_0();
  39.     NonVolatileStorageRead();
  40.     if(debug) COM[DEBUG_COM]->println(wifiSSID);
  41.     if(debug) COM[DEBUG_COM]->println(wifiPassword);
  42.     NonVolatileStorageReadPort();
  43.     NonVolatileStorageReadBaudrate();
  44.     Serial.println(ConnectionPort,HEX);
  45.     Serial.println(Baudrate_RS485,HEX);
  46.    
  47.     specialSettingProgramFlag = 1;
  48.   }
  49.   else                          //Start normal program execution
  50.   {
  51.     Start_Uart_0();
  52.     NonVolatileStorageRead();
  53.     if(debug) COM[DEBUG_COM]->println(wifiSSID.c_str());
  54.     if(debug) COM[DEBUG_COM]->println(wifiPassword.c_str());
  55.    
  56.     NonVolatileStorageReadPort();
  57.     NonVolatileStorageReadBaudrate();
  58.     if(debug) COM[DEBUG_COM]->println(ConnectionPort,HEX);
  59.     if(debug) COM[DEBUG_COM]->println(Baudrate_RS485,HEX);
  60.    
  61.     Start_Uart_1();
  62.     EnableWifiStationMode();
  63.     WifiStart();
  64.     ArduinoOta_Setup();
  65.     EnableAndSetDefaultRS485Pins();
  66.   }
  67. }
  68. void loop()
  69. {
  70.   if(specialSettingProgramFlag == 1)    //Special program for settings
  71.   {
  72.     SetParametersFrameAnalyse();
  73.   }
  74.   else                                  //Standard conversion program
  75.   {
  76.     ArduinoOTA_Handle_Loop();
  77.     ClientConnection_Loop();
  78.     WriteRS485Data();  
  79.   }
  80. }
  81. //------------------------------------------------------
  82. static void Start_Uart_0(void)
  83. {
  84.   COM[0]->begin(UART_BAUD0, SERIAL_PARAM0, SERIAL0_RXPIN, SERIAL0_TXPIN);
  85. }
  86. static void Start_Uart_1(void)
  87. {
  88.   COM[1]->begin(SelectBaudrate((uint8_t)Baudrate_RS485),
  89.               SERIAL_PARAM2,
  90.               SERIAL2_RXPIN,
  91.               SERIAL2_TXPIN);
  92. }
  93. //------------------------------------------------------
  94. //Initialization functions
  95. void EnableAndSetDefaultRS485Pins(void)
  96. {
  97.   #ifdef RS485_ENABLE
  98.   SetRS485ControlPinsDirection();
  99.   delay(5);
  100.   SetRS485PinToReceiveData();
  101.   delay(3);
  102.   #endif
  103. }
  104. void SetRS485ControlPinsDirection()
  105. {
  106.   #ifdef RS485_ENABLE
  107.   pinMode(RE_PIN, OUTPUT);
  108.   pinMode(DE_PIN, OUTPUT);
  109.   #endif
  110. }
  111. static void SetRS485PinToSendData()
  112. {
  113.   #ifdef RS485_ENABLE
  114.   digitalWrite(RE_PIN, HIGH);
  115.   digitalWrite(DE_PIN, HIGH);
  116.   #endif
  117. }
  118. static void SetRS485PinToReceiveData()
  119. {
  120.   #ifdef RS485_ENABLE
  121.   digitalWrite(RE_PIN, LOW);
  122.   digitalWrite(DE_PIN, LOW);
  123.   #endif
  124. }
  125. void EnableTestWriteSettingsPin(void)
  126. {
  127.   pinMode(18, INPUT_PULLUP);
  128. }
  129. static void EnableWifiStationMode(void)
  130. {
  131.   if(debug) COM[DEBUG_COM]->println("Open ESP Station mode Test Project v1.0");
  132.   WiFi.mode(WIFI_STA);
  133.   WiFi.begin(wifiSSID.c_str(), wifiPassword.c_str());//ssidArray, passwordArray);
  134.   if(debug) { COM[DEBUG_COM]->print("try to Connect to Wireless network: "); }
  135.   if(debug) { COM[DEBUG_COM]->println(wifiSSID); }
  136.   while (WiFi.status() != WL_CONNECTED) {
  137.     delay(500);
  138.     if(debug) COM[DEBUG_COM]->print(".");
  139.   }
  140.   if(debug) COM[DEBUG_COM]->println("\nWiFi connected");
  141. }
  142. static void WifiStart()
  143. {
  144.   if(debug) COM[DEBUG_COM]->println("Starting TCP Server 1");
  145.    
  146.   if(ConnectionPort == 0x00){ server[0]->begin(); }
  147.   else { server[0]->begin(ConnectionPort); }
  148.   server[0]->begin(ConnectionPort); // start TCP server
  149.   server[0]->setNoDelay(true);
  150. }
  151. static void ArduinoOta_Setup()
  152. {
  153.   #ifdef OTA_HANDLER
  154.   ArduinoOTA
  155.     .onStart([]() {
  156.       String type;
  157.       if (ArduinoOTA.getCommand() == U_FLASH)
  158.         type = "sketch";
  159.       else // U_SPIFFS
  160.         type = "filesystem";
  161.       // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
  162.       Serial.println("Start updating " + type);
  163.     })
  164.     .onEnd([]() {
  165.       Serial.println("\nEnd");
  166.     })
  167.     .onProgress([](unsigned int progress, unsigned int total) {
  168.       Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
  169.     })
  170.     .onError([](ota_error_t error) {
  171.       Serial.printf("Error[%u]: ", error);
  172.       if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
  173.       else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
  174.       else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
  175.       else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
  176.       else if (error == OTA_END_ERROR) Serial.println("End Failed");
  177.     });
  178.   // if DNSServer is started with "*" for domain name, it will reply with
  179.   // provided IP to all DNS reques
  180.   ArduinoOTA.begin();
  181.   #endif // OTA_HANDLER
  182. }
  183. //------------------------------------------------------
  184. static void ArduinoOTA_Handle_Loop(void)
  185. {
  186.   #ifdef OTA_HANDLER
  187.   ArduinoOTA.handle();
  188.   #endif // OTA_HANDLER
  189. }
  190. static void ClientConnection_Loop()
  191. {
  192.   if(server[0]->hasClient())
  193.   {
  194.       if (!TCPClient[0][0] || !TCPClient[0][0].connected())
  195.       {
  196.         if(TCPClient[0][0])
  197.         {
  198.           TCPClient[0][0].stop();
  199.         }
  200.         TCPClient[0][0] = server[0]->available();
  201.        
  202.         if(debug) COM[DEBUG_COM]->print("New client for COM");
  203.         if(debug) COM[DEBUG_COM]->print(0);
  204.         if(debug) COM[DEBUG_COM]->println(0);
  205.        }
  206.     //no free/disconnected spot so reject
  207.     WiFiClient TmpserverClient = server[0]->available();
  208.     TmpserverClient.stop();
  209.   }
  210. }
  211. static void WriteRS485Data(void)
  212. {
  213.   if(COM[1] != NULL)        
  214.   {        
  215.       if(TCPClient[0][0])
  216.       {
  217.         while(TCPClient[0][0].available())
  218.         {
  219.           buf1[1][i1[1]] = TCPClient[0][0].read(); // read char from client (LK8000 app)
  220.           if(i1[1]<bufferSize-1)
  221.           {
  222.             i1[1]++;
  223.           }
  224.         }
  225.         if(i1[1] != 0x00)
  226.         {
  227.           SetRS485PinToSendData();
  228.           delay(5);
  229.           COM[1]->write(buf1[1], i1[1]);
  230.           COM[1]->flush();


  231. delay(3);
  232.           //delay(7);
  233.           SetRS485PinToReceiveData();
  234.           i1[1] = 0;
  235.         }
  236.       }
  237.    
  238.       if(COM[1]->available())
  239.       {
  240.         while(COM[1]->available())
  241.         {  
  242.           buf2[1][i2[1]] = COM[1]->read(); // read char from UART(num)
  243.           if(i2[1]<bufferSize-1)
  244.           {
  245.             i2[1]++;
  246.           }
  247.         }
  248.      
  249.         if(TCPClient[0][0])  
  250.         {              
  251.           TCPClient[0][0].write(buf2[1], i2[1]);
  252.         }
  253.         i2[1] = 0;
  254.       }
  255.    }
  256. }
  257. //None volatile storage read & write */
  258. void NonVolatileStorageRead(void)
  259. {
  260.   preferences.begin("wifi", false);
  261.   wifiSSID = preferences.getString("ssid", "none");          
  262.   wifiPassword = preferences.getString("password", "none");
  263.   preferences.end();
  264. }
  265. void NonVolatileStorageWrite(void)
  266. {
  267.   preferences.clear();
  268.   preferences.begin("wifi", false);
  269.   preferences.putString("ssid", wifiSSID);
  270.   preferences.putString("password", wifiPassword);
  271.   preferences.end();
  272. }
  273. //-------------------------------------------------
  274. void NonVolatileStorageWriteBaudrate(void)
  275. {
  276.   preferences.clear();
  277.   preferences.begin("Baudrate", false);
  278.   preferences.putUInt("baudrate", Baudrate_RS485);
  279.   preferences.end();
  280. }
  281. void NonVolatileStorageReadBaudrate(void)
  282. {
  283.   preferences.begin("Baudrate", false);
  284.   Baudrate_RS485 = preferences.getUInt("baudrate", 0x0);          
  285.   preferences.end();
  286. }
  287. //-------------------------------------------------
  288. void NonVolatileStorageWritePort(void)
  289. {
  290.   preferences.clear();
  291.   preferences.begin("Port", false);
  292.   preferences.putUInt("port", ConnectionPort);
  293.   preferences.end();
  294. }
  295. void NonVolatileStorageReadPort(void)
  296. {
  297.   preferences.begin("Port", false);
  298.   ConnectionPort = preferences.getUInt("port", 0);          
  299.   preferences.end();
  300. }
  301. uint32_t SelectBaudrate(uint8_t baudrate)
  302. {
  303.   if(baudrate == 0x01) { return 9600; }
  304.   else if(baudrate == 0x02) { return 14400; }
  305.   else if(baudrate == 0x03) { return 19200; }
  306.   else if(baudrate == 0x04) { return 28800; }
  307.   else if(baudrate == 0x05) { return 38400; }
  308.   else if(baudrate == 0x05) { return 56000; }
  309.   else if(baudrate == 0x06) { return 57600; }
  310.   else if(baudrate == 0x07) { return 115200; }
  311.   else if(baudrate == 0x08) { return 128000; }
  312.   else if(baudrate == 0x09) { return 256000; }
  313. }
  314. /*
  315.   * Protocol:
  316.   * 0x01 0xB6 <LEN> [data]  Set SSID
  317.   * 0x01 0xA5 <LEN> [data]  Set Password
  318.   * 0x01 0xE7 0x02 0xXX 0xXX  Set Baudrate
  319.   * 0x01 0xD8 0x01 0xXX  Set PortNum
  320. */
  321. void SetParametersFrameAnalyse()
  322. {
  323.   if(COM[0] != NULL)
  324.   {
  325.       if(COM[0]->available())
  326.       {
  327.         while(COM[0]->available())
  328.         {  
  329.           buf2[1][i2[1]] = COM[0]->read(); // read char from UART(num)
  330.           if(i2[1]<bufferSize-1)
  331.           {
  332.             i2[1]++;
  333.           }
  334.         }
  335.         if(buf2[1][0] == _SOH)
  336.         {
  337.           uint8_t sendResponseFrame = 0;
  338.          
  339.           if(buf2[1][1] == _SET_SSID)
  340.           {
  341.             if(debug) COM[DEBUG_COM]->print("_SET_SSID");
  342.             String testname = "";
  343.            
  344.             for(uint8_t i=0; i<buf2[1][2]; i++)
  345.             {
  346.                testname += char(buf2[1][+ 3]);
  347.                wifiSSID = testname;
  348.             }
  349.             NonVolatileStorageWrite();
  350.           }
  351.           else if(buf2[1][1] == _SET_PASSWORD)
  352.           {
  353.             if(debug) COM[DEBUG_COM]->print("_SET_PASSWORD");
  354.             String testname = "";
  355.            
  356.             for(uint8_t i=0; i<buf2[1][2]; i++)
  357.             {
  358.                testname += char(buf2[1][+ 3]);
  359.                wifiPassword = testname;
  360.             }
  361.             NonVolatileStorageWrite();
  362.           }
  363.           else if(buf2[1][1] == _SET_BUAURATE)
  364.           {
  365.             if(debug) COM[DEBUG_COM]->print("_SET_BUAURATE");
  366.             Baudrate_RS485 = (uint32_t)buf2[1][3];
  367.             NonVolatileStorageWriteBaudrate();
  368.           }
  369.           else if(buf2[1][1] == _SET_PORT)
  370.           {
  371.             if(debug) COM[DEBUG_COM]->print("_SET_PORT");
  372.             ConnectionPort = (buf2[1][3] << 8) | buf2[1][4];
  373.             NonVolatileStorageWritePort();
  374.           }
  375.           if(sendResponseFrame == 1)
  376.           {
  377.             if(i2[1] != 0x00)
  378.             {
  379.               COM[0]->write(buf2[1], i2[1]); // now send to UART(num):
  380.             }
  381.           }
  382.         }
  383.         i2[1] = 0;
  384.       }
  385.   }
  386. }


Poniżej znajduje się plik .h zawierający ustawienia kody rozkazów itp:

  1. #define OTA_HANDLER
  2. #define RS485_ENABLE
  3. #define PROTOCOL_TCP
  4. const bool debug = true;
  5. const char *ssid = "ssid";
  6. const char *pw = "password";
  7. #define SSID_BUFFER_SIZE      32
  8. #define PASSWORD_BUFFER_SIZE  64
  9. #define NEW_SETTINGS_PIN      22
  10. #define RESET_PIN             13
  11. #define RE_PIN  26
  12. #define DE_PIN  27
  13. #define WRITE_SETTINGS_PIN_NUM  18
  14. #define NUM_COM   2                 // total number of COM Ports
  15. #define DEBUG_COM 0                 // debug output to COM0
  16. /*************************  COM Port 0 ON ESP BOARD *******************************/
  17. #define UART_BAUD0 115200           // Baudrate
  18. #define SERIAL_PARAM0 SERIAL_8N1    // Data/Parity/Stop
  19. #define SERIAL0_RXPIN 3             // receive Pin
  20. #define SERIAL0_TXPIN 1             // transmit Pin
  21. #define SERIAL0_TCP_PORT 8880       // Wifi Port
  22. /*************************  COM Port 2 ON ESP BOART *******************************/
  23. #define UART_BAUD2 115200           // Baudrate
  24. #define SERIAL_PARAM2 SERIAL_8N1    // Data/Parity/Stop
  25. #define SERIAL2_RXPIN 16            // receive Pin
  26. #define SERIAL2_TXPIN 17            // transmit Pin
  27. #define SERIAL2_TCP_PORT 8881       // Wifi Port
  28. #define bufferSize 1024
  29. /* Set network Parameters */
  30. #define _SOH            0x01
  31. #define _SET_SSID       0xB6
  32. #define _SET_PASSWORD   0xA5
  33. #define _SET_STATIC_IP  0xC5
  34. #define _SET_BUAURATE   0xE7
  35. #define _SET_PORT       0xD8
  36. //////////////////////////////////////////////////////////////////////////

Projekty opisane w tym poście można pobrać z dysku Google pod tym linkiem.