Heltec-ESP32-Serial-Nano

Project : Read Serial from Nano
Nano read : RS485
Heltec-esp32
RX2 = 16
TX2 =  17
Nano
RX=10
TX=11
heltec esp32 code : โค้ดในขณะนี้ยังเป็นโหมด  esp32- ยังไม่ได้ใช้งานโหมด LoRa  ที่จะต้องกลับไปใช้งาน  ไฟล์ OLED-LoRa-Receiver
ที่ทำงานเป็น  LoRa ตัวรับและใช้ WiFi ในการส่งไปยัง  Server

/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
//Libraries
#include <Arduino.h>
#include <Wire.h>
#include <WiFi.h>
/*
 * There are three serial ports on the ESP known as U0UXD, U1UXD and U2UXD.
 *
 * U0UXD is used to communicate with the ESP32 for programming and during reset/boot.
 * U1UXD is unused and can be used for your projects. Some boards use this port for SPI Flash access though
 * U2UXD is unused and can be used for your projects.
 *
*/
#define RXD2 16
#define TXD2 17
/////
#include <math.h>
#include <ArduinoJson.h>
//======
#include <Adafruit_Sensor.h>
#include <DHT.h>  // กรณีนี้ต้องใช้คู่กันกับ  DHT_U.h
#include <DHT_U.h>
#define DHTPIN 6 // Pin which is connected to the DHT sensor.
// Uncomment the type of sensor in use:
//#define DHTTYPE           DHT11     // DHT 11
#define DHTTYPE           DHT22     // DHT 22 (AM2302)
//#define DHTTYPE           DHT21     // DHT 21 (AM2301)
DHT_Unified dht(DHTPIN, DHTTYPE);
uint32_t delayMS;
////
String master_state;
String led1;
String led2;
String led3;
String url;
////
char* host = "xxxxx.xxx";
char* code = "SMT2xxxx-1xxxxRIX";
char* dID = "1xx";
float dustDensity = 35;
String response ="0";
String response_c = "0";
String a ;
float temp_0 = 0;
float tempF_0 = 0;
float humid_0 = 0;
float vHumidity = 0;
float vTemperature = 0;
String data1 ;
String data2 ; // standard
String data3 ;
String data4 ;
float data5 = 0;
float data6 = 0;
float data7 = 0;
float data8 = 0;
float data9 = 0;
float data10 = 0;
float data11 = 0;
float data12 = 0;
float data13 = 0;
float data14 = 0;
float data15 = 0;
float data16 = 0;
float data17 = 0;
float data18 = 0;
float data19 = 0;
String data20 = "0";
float temperatureC = 0;
float temperatureF = 0;
int counter = 1;
int sentcount = 0;
/////////////////////////////////////////////////////////////////////////////
void master_i2c_setup() {
  Wire.begin();
  Serial.println("I2C Master Demonstration");
}
/////////////////////////////////////////////////////////////////////////////
// Arduino setup function.
///////////////
const char* ssid      = "Arsenxxxx_2.4G";
const char* password  = "kb75xxxxx";
const char* ssid1     = "Arsenaxxxxx_2.4G";
const char* password1 = "kb7xxxxx";
const char* ssid2     = "Arsenxxxxx_2.4G";
const char* password2 = "kb75xxxxxx";
// Helper functions to print a data value to the serial monitor.
void WiFisetup()
{
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid1);
  WiFi.begin(ssid1, password1);
  delay(1000);
  if (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("Failed to connected and WiFi setup ");
    WiFi.begin(ssid2, password2);
    delay(1000);
    if (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.println("Failed to connected and WiFi setup ");
    }
    else{
       ssid = ssid2;
       password = password2;
    }
  }
  else{
  ssid = ssid1;
  password = password1;
  Serial.println("");
  Serial.println("WiFi connected OK");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  }
}
///
void AM2302_setup() {
  dht.begin();
  Serial.println("DHTxx Unified Sensor Example");
  // Print temperature sensor details.
  sensor_t sensor;
  dht.temperature().getSensor(&sensor);
  Serial.println("------------------------------------");
  Serial.println("Temperature");
  Serial.print  ("Sensor:       "); Serial.println(sensor.name);
  Serial.print  ("Driver Ver:   "); Serial.println(sensor.version);
  Serial.print  ("Unique ID:    "); Serial.println(sensor.sensor_id);
  Serial.print  ("Max Value:    "); Serial.print(sensor.max_value); Serial.println(" *C");
  Serial.print  ("Min Value:    "); Serial.print(sensor.min_value); Serial.println(" *C");
  Serial.print  ("Resolution:   "); Serial.print(sensor.resolution); Serial.println(" *C");
  Serial.println("------------------------------------");
  // Print humidity sensor details.
  dht.humidity().getSensor(&sensor);
  Serial.println("------------------------------------");
  Serial.println("Humidity");
  Serial.print  ("Sensor:       "); Serial.println(sensor.name);
  Serial.print  ("Driver Ver:   "); Serial.println(sensor.version);
  Serial.print  ("Unique ID:    "); Serial.println(sensor.sensor_id);
  Serial.print  ("Max Value:    "); Serial.print(sensor.max_value); Serial.println("%");
  Serial.print  ("Min Value:    "); Serial.print(sensor.min_value); Serial.println("%");
  Serial.print  ("Resolution:   "); Serial.print(sensor.resolution); Serial.println("%");
  Serial.println("------------------------------------");
  // Set delay between sensor readings based on sensor details.
  delayMS = sensor.min_delay / 1000;
}
///
void setup()
{
  delay(10000);
  //
  pinMode(23,OUTPUT);
  digitalWrite(23,HIGH);
  pinMode(21,OUTPUT);
  digitalWrite(21,LOW);
  ///
  Serial.begin(9600);
  Serial2.begin(9600, SERIAL_8N1, RXD2, TXD2); // original 8N1
  Serial.println("Serial Txd is on pin: "+String(TX));
  Serial.println("Serial Rxd is on pin: "+String(RX));
///
  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFisetup();
  //WiFi.begin(ssid1, password1);
  delay(1000);
  if (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("Failed connected setup ");
  }
  else{
  Serial.println("");
  Serial.println("WiFi OK connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  // We start by connecting to a WiFi network
  }
}
int value = 0;
void serverloop()
{
    delay(1000);
     ++value;
    data1 = String(data1);
    data2 = String(data2);
    //AM2302_loop();
    //data3 = temp_0;
    //data4 = humid_0;
    Serial.print("data1 rain mm = ");Serial.println(data1);
    Serial.print("data2 soil    = ");Serial.println(data2);
    Serial.print("data3 temp    = ");Serial.println(data3);
    Serial.print("data4 humid   = ");Serial.println(data4);
    Serial.print("connecting to ");
    Serial.println(host);
    // Use WiFiClient class to create TCP connections
    WiFiClient client;
    const int httpPort = 80;
    if (!client.connect(host, httpPort)) {
        Serial.println("connection failed");
        return;
    }
    // We now create a URI for the request
     String url = "/api/insertData?device_id=" + String(dID)+"&code="+String(code)+"&data1=" +String(data1) +"&data2="
   + String(data2)+"&data3=" +String(data3)+"&data4=" +String(data4)+"&data5=" +String(data5)
   +"&data6=" +String(data6)+"&data7=" +String(data7)+"&data8=" +String(data8)+"&data9=" +String(data9)
   +"&data10=" +String(data10)+"&data11=" +String(data11)+"&data12=" +String(data12)+"&data13=" +String(data13)
   +"&data14=" +String(data14)+"&data15=" +String(data15)+"&data16=" +String(data16)+"&data17=" +String(data17)
   +"&data18=" +String(data18)+"&data19=" +String(data19)+"&data20=" +String(data20);
    Serial.print("Requesting URL: ");
    Serial.println(url);
    // This will send the request to the server
    client.print(String("GET ") + url + " HTTP/1.1\r\n" +
                 "Host: " + host + "\r\n" +
                 "Connection: close\r\n\r\n");
    //unsigned long timeout = millis();
    delay(1000);
    while (client.available() == 0) {
            Serial.println(">>> Client Timeout !");
            client.stop();
            return;
           }
    // Read all the lines of the reply from server and print them to Serial
    while(client.available()) {
        String line = client.readStringUntil('\r');
        //Serial.print(line);  ถอดคอมเม้น? ออก เพื่อดูการตอบสนองจาก Server
    }
    Serial.println();
    Serial.println("endloop server ");
    delay(1000);
}
//====
void loop()
{
    if (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.println("Failed to connected and WiFi setup ");
        WiFisetup();
    }
  serial_loop();
  read_master_status_FromServer();
  serverloop();
  data1 = "";
  data2 = "";
}
void serial_loop()
{
Serial.println("Please wait Serial..");
/// #1
  while (a == "") {
    Serial2.print("Input1"); // ส่งหัวข้อคำถาม ว่า Question1 ไปยัง Arduino
    a = Serial2.readString();  // อ่าน Serial และนำไปเก็บในตัวแปร A
    delay(100);
    Serial.print(".");
  }
  Serial.print(" Answer 1 ");Serial.println(a);
  data1 = String(a);
  delay(1000);
  a="";
///#2
  while (a == "") {
    Serial2.print("Input2"); // ส่งหัวข้อคำถาม ว่า Question1 ไปยัง Arduino
    a = Serial2.readString();  // อ่าน Serial และนำไปเก็บในตัวแปร A
    delay(100);
    Serial.print(".");
  }
  Serial.print(" Answer 2 ");Serial.println(a);
  data2=String(a);
  a="";
///#3
    while (a == "") {
    Serial2.print("Input3"); // ส่งหัวข้อคำถาม ว่า Question1 ไปยัง Arduino
    a = Serial2.readString();  // อ่าน Serial และนำไปเก็บในตัวแปร A
    delay(100);
    Serial.print(".");
  }
  Serial.print(" Answer 3 ");Serial.println(a);
  data3 = String(a);
  delay(1000);
  a="";
///#4
  while (a == "") {
    Serial2.print("Input4"); // ส่งหัวข้อคำถาม ว่า Question1 ไปยัง Arduino
    a = Serial2.readString();  // อ่าน Serial และนำไปเก็บในตัวแปร A
    delay(100);
    Serial.print(".");
  }
  Serial.print(" Answer 4 ");Serial.println(a);
  data4=String(a);
  a="";
}
void read_master_status_FromServer()
{
 Serial.print("Read control command from Server ... connecting to ");
 Serial.println(host);
WiFiClient client;
if (client.connect(host, 80))
  {
    Serial.println("reconnecting...");
         //url = "/api/readLast/IOT_API_KEY_BY_ADMIN/136/PTLCB-2020";
         url = "/api/readLast/IOT_API_KEY_BY_ADMIN/"+ String(dID)+"/"+String(code);
         Serial.print("Requesting URL: ");
         Serial.println(url);
         client.print(String("GET ") + url + " HTTP/1.1\r\n" +
                 "Host: " + host + "\r\n" +
                 "Connection: close\r\n\r\n");
         delay(2000);
         String section="header";
         while(client.available())
         {
            //Serial.println("Connection available ");
            String line = client.readStringUntil('\r');
            //Serial.print(line);
            // we’ll parse the HTML body here
            if (section=="header")
              { // headers..
                  if (line=="\n")
                    { // skips the empty space at the beginning
                      section="json";
                    }
              }
            else if (section=="json")
              {  // print the good stuff
                  section="ignore";
                  String result = line.substring(1);
                  // Parse JSON
                  int size = result.length() + 1;
                  char json[size];
                  result.toCharArray(json, size);
                  StaticJsonBuffer<1500> jsonBuffer;
                  JsonObject& json_parsed = jsonBuffer.parseObject(json);
                  if (!json_parsed.success())
                    {
                      Serial.println("parseObject() failed");
                      return;
                    }
                      Serial.println("parseObject() OK ...");
                      ///Serial.println(result); // show all json found
                      //String led = json_parsed["led"][0]["status"];
                      String master_state = json_parsed["result"]["deviceData"]["master_status"];
                      String led1 = json_parsed["result"]["deviceData"]["data18"];
                      String led2 = json_parsed["result"]["deviceData"]["data19"];
                      String led3 = json_parsed["result"]["deviceData"]["data20"];
                      data20=String(master_state);
                      // string led = json_parsed["table name""][array number]["value of field"]
                      Serial.print("Master state = ");
                      Serial.println(master_state);
                      if (master_state == "0")
                      { digitalWrite(23,LOW);
                        digitalWrite(21,HIGH);
                      }
                      else
                      {
                        digitalWrite(23,HIGH);
                        digitalWrite(21,LOW);
                      }
                      Serial.println(led1);
                      Serial.println(led2);
                      Serial.println(led3);
             } // if found json
          } // end while client available
    }
    // end if host connected
    else
    {
      // if you couldn't make a connection:
      ///Serial.println("connection failed read server 1");
    }
}

Nano Code

#include <EEPROM.h>
#include <SoftwareSerial.h>
SoftwareSerial chat(10, 11); // RX, TX
////////  AM2302
#include <math.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>  // กรณีนี้ต้องใช้คู่กันกับ  DHT_U.h
#include <DHT_U.h>
#define DHTPIN 6 // Pin which is connected to the DHT sensor.
// Uncomment the type of sensor in use:
//#define DHTTYPE           DHT11     // DHT 11
#define DHTTYPE           DHT22     // DHT 22 (AM2302)
//#define DHTTYPE           DHT21     // DHT 21 (AM2301)
DHT_Unified dht(DHTPIN, DHTTYPE);
uint32_t delayMS;
////////
int i;
int sensorValue;
float rainmm ;
float dustDensity = 35;
String response ="0";
String response_c = "0";
String a ;
float temp_0 = 0;
float tempF_0 = 0;
float humid_0 = 0;
float vHumidity = 0;
float vTemperature = 0;
String data1 ;
String data2 ; // standard
float data3 = 0;
float data4 = 0;
float data5 = 0;
float data6 = 0;
float data7 = 0;
float data8 = 0;
float data9 = 0;
float data10 = 0;
float data11 = 0;
float data12 = 0;
float data13 = 0;
float data14 = 0;
float data15 = 0;
float data16 = 0;
float data17 = 0;
float data18 = 0;
float data19 = 0;
float data20 = 0;
float temperatureC = 0;
float temperatureF = 0;
int counter = 1;
int sentcount = 0;
//////////////////////////////
void AM2302_setup() {
  dht.begin();
  Serial.println("DHTxx Unified Sensor Example");
  // Print temperature sensor details.
  sensor_t sensor;
  dht.temperature().getSensor(&sensor);
  Serial.println("------------------------------------");
  Serial.println("Temperature");
  Serial.print  ("Sensor:       "); Serial.println(sensor.name);
  Serial.print  ("Driver Ver:   "); Serial.println(sensor.version);
  Serial.print  ("Unique ID:    "); Serial.println(sensor.sensor_id);
  Serial.print  ("Max Value:    "); Serial.print(sensor.max_value); Serial.println(" *C");
  Serial.print  ("Min Value:    "); Serial.print(sensor.min_value); Serial.println(" *C");
  Serial.print  ("Resolution:   "); Serial.print(sensor.resolution); Serial.println(" *C");
  Serial.println("------------------------------------");
  // Print humidity sensor details.
  dht.humidity().getSensor(&sensor);
  Serial.println("------------------------------------");
  Serial.println("Humidity");
  Serial.print  ("Sensor:       "); Serial.println(sensor.name);
  Serial.print  ("Driver Ver:   "); Serial.println(sensor.version);
  Serial.print  ("Unique ID:    "); Serial.println(sensor.sensor_id);
  Serial.print  ("Max Value:    "); Serial.print(sensor.max_value); Serial.println("%");
  Serial.print  ("Min Value:    "); Serial.print(sensor.min_value); Serial.println("%");
  Serial.print  ("Resolution:   "); Serial.print(sensor.resolution); Serial.println("%");
  Serial.println("------------------------------------");
  // Set delay between sensor readings based on sensor details.
  delayMS = sensor.min_delay / 1000;
}
void setup()  {
  Serial.begin(9600);
  chat.begin(9600);
}
void loop() {
  AM2302_loop();
  input1_loop();
  //input2_loop();
  if (chat.readString()){
     // chat.print(1);
     if(chat.readString()== "Input1"){ //มีการถามคำถาม Question1 ส่งข้อมูลตัวแปร a ออกไป
      chat.print(String(sensorValue));
     }
     if(chat.readString()== "Input2"){ //มีการถามคำถาม Question2 ส่งข้อมูลตัวแปร b ออกไป
     chat.print(String(rainmm));
     }
     if(chat.readString()== "Input3"){ //มีการถามคำถาม Question1 ส่งข้อมูลตัวแปร a ออกไป
      chat.print(String(data3));
     }
     if(chat.readString()== "Input4"){ //มีการถามคำถาม Question2 ส่งข้อมูลตัวแปร b ออกไป
     chat.print(String(data4));
     }
     Serial.print("Send = ");
     Serial.println(i);
  }
  i++;
  delay(1000);
}
void input1_loop() {
  // read the value from the sensor:
  sensorValue = analogRead(A0);
  //Serial.print(" Analog read := ");Serial.println(sensorValue);
  if (sensorValue > 580) {
    rainmm = 80.437-0.0977*sensorValue;
  }
  else {
    if (sensorValue > 509) {
      rainmm = 443.6-0.717*sensorValue;
    }
    else
    {
      if (sensorValue > 466) {
        rainmm = 903.74-1.6059*sensorValue;
      }
      else{
      rainmm = 770.06-1.3314*sensorValue;
      }
    }
  }
  delay(1000);
  //answer=String(255);
  Serial.print("A0 signal : ");Serial.println(sensorValue);
  Serial.print("Rain mm : ");Serial.println(rainmm);
}
void input2_loop() {
  // read the value from the sensor:
  sensorValue = analogRead(A0);
  //Serial.print(" Analog read := ");Serial.println(sensorValue);
  if (sensorValue > 580) {
    rainmm = 80.437-0.0977*sensorValue;
  }
  else {
    if (sensorValue > 509) {
      rainmm = 443.6-0.717*sensorValue;
    }
    else
    {
      if (sensorValue > 466) {
        rainmm = 903.74-1.6059*sensorValue;
      }
      else{
      rainmm = 770.06-1.3314*sensorValue;
      }
    }
  }
  delay(1000);
  //answer=String(255);
}
void AM2302_loop() {
  // Delay between measurements.
  delay(delayMS);
  // Get temperature event and print its value.
  sensors_event_t event;
  dht.temperature().getEvent(&event);
  if (isnan(event.temperature)) {
    Serial.println("Error reading temperature!");
  }
  else {
    Serial.print("Temperature: ");
    Serial.print(event.temperature);
    Serial.println(" *C");
    temp_0 = event.temperature;
    data3 = temp_0;
  }
  // Get humidity event and print its value.
  dht.humidity().getEvent(&event);
  if (isnan(event.relative_humidity)) {
    Serial.println("Error reading humidity!");
  }
  else {
    Serial.print("Humidity: ");
    Serial.print(event.relative_humidity);
    Serial.println("%");
    humid_0 = event.relative_humidity;
    data4 = humid_0;
  }
}

การทำงาน  Heltec  ส่งคำขอข้อมูล ตามลำดับ  และ Nano ส่งข้อมูลกลับ
การนำไปใช้งาน
ใช้  Nano  run  Modebuslibrary อ่านค่า  RS485 และเก็บเป็นตัวแปลนำส่ง   Heltec  ทาง  Serial  ก่อนนำส่งต่อไปตามลำดับ
สิ่งที่ควรดำเนินการต่อไปคือ ให้  Heltec run Modbuslibrary โดยตรง