ESP8266-Arduino Nano-Serial Data-Data logger

การเชื่อมต่อ สื่อสารระหว่าง ESP8266 กับ Arduino นอกจากจะทำการสื่อสารด้วย  I2C แล้ว  ยังสามารถสื่อสารด้วย Serial  โดยการใช้ Software Serial
ตัวอย่างการใช้งาน

  1. ใช้ ESP8266 เพียวตัวเดียว
  2. ใช้ Arduino Nano เพียงตัวเดียว   เพื่อวัดสัญญาณ  Analog A0-A7, และ วัด อุณหภูมิและความชื้นด้วย AM2302  ที่จะให้ค่าวัดออกมาอีก 2 รายการ

ครั้งก่อน  เราทำการทดสอบการอ่านข้อมูลด้วย I2C    ในครั้งนี้จะมาลองการสื่อสารอนุกรม
การเชื่อมต่อ
Arduino Nano       ESP8266
D11                            D5
D10                           D6

ขออภัยครับ  บนบอร์ดทดลอง  มีแุปกรณ์อื่นๆ ที่ไม่เกี่ยวกับเรื่องนี้มาเกะกะตาด้วย

/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
//Libraries
#include <Wire.h>
#include <ESP8266WiFi.h>
////
#include <SoftwareSerial.h>
SoftwareSerial chat(D5, D6); // RX, TX
/////
#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;
////
//
////
char* host = "xxxxxx.com";
char* code = "xxxxx";
char* dID = "xx";
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 master_i2c_setup() {
  Wire.begin();
  Serial.println("I2C Master Demonstration");
}
/////////////////////////////////////////////////////////////////////////////
// Arduino setup function.
///////////////
const char* ssid      = "76/151";
const char* password  = "xxxxxx";
const char* ssid1     = "76/151";
const char* password1 = "xxxxxx";
const char* ssid2     = "76/151";
const char* password2 = "xxxxxxx";
// 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);
  Serial.begin(9600);
  chat.begin(4800);
  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();
  serverloop();
  data1 = "";
  data2 = "";
}
void serial_loop()
{
Serial.println("Please wait Serial..");
  while (a == "") {
    chat.print("Input1");
    a = chat.readString();
    delay(100);
    Serial.print(".");
  }
  Serial.print(" Answer 1 ");Serial.println(a);
  data1 = String(a);
  delay(1000);
  a="";
  while (a == "") {
    chat.print("Input2");
    a = chat.readString();
    delay(100);
    Serial.print(".");
  }
  Serial.print(" Answer 2 ");Serial.println(a);
  data2=String(a);
  a="";
}

และโค้ดสำหรับ  Arduino Nano   กรณีนี้  ทำการทดลองเพียง 2  input ที่ A0, A1

#include <EEPROM.h>
#include <SoftwareSerial.h>
SoftwareSerial chat(10, 11); // RX, TX
int i;
int sensorValue;
float rainmm ;
void setup()  {
  Serial.begin(9600);
  chat.begin(4800);
}
void loop() {
  input1_loop();
  input2_loop();
  if (chat.readString()){
     // chat.print(1);
     if(chat.readString()== "Input1"){
      chat.print(String(sensorValue));
     }
     if(chat.readString()== "Input2"){
     chat.print(String(rainmm));
     }
     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);
}
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);
}

ขอบคุณ โค้ดที่มา (บางส่วน) จาก  Myarduino.net
จากตัวอย่าง  ESP8266 จะส่งคำสั่งขอค่า ผลลัพธ์  Input1, Input2  จาก Arduino Nano  โดย  Arduino Nano จะทำการวัดค่าและคำนวณต่างๆ ตามที่กำหนดในโปรแกรม  แล้วทะยอยส่งค่าผ่านทาง Serial Port ที่กำหนดด้วย SoftwareSerial  ได้อย่างง่ายดาย และแม่นยำ
ข้อดีของการสื่อสารวิธีนี้  คือ  ลดค่าความเพี้ยนในการใช้ งาน  WiFi บนบอร์ด ESP8266 โดยให้ค่าวัดที่แม่นยำ