ประกอบร่าง ESP32-Nano-I2C เป็น datalogger อย่างเซียน ตอนที่ 1

บทความนี้เกิดจากความต้องการสร้างระบบ  Datalogger ที่ต้องวัดค่าฝุ่น  ค่าแอมโมเนีย โดยจะต้องแสดงผล  ที่เครื่องมือวัด  และส่งค่าผ่านไปยัง server ด้วย
ส่วนประกอบของงาน

  1. เครื่องวัดฝุ่น PM2.5 ของ Sharp รุ่น ….(มาเติมใหม่อีกทีนะ เขียนเนื้อหายาวๆ ไปก่อน)
  2. เครื่องวัดแกสแอมโมเนีย   MQ137  (ตัวนี้ราคาไม่เบาทีเดียว  และเล่นไม่ง่ายเลย)
  3. จอ LCD 16×2
  4. ESP32
  5. ATMega2560
  6. Arduino Nano


แต่ก่อนจะจบลงด้วยรายการตามข้างต้นนั้น  เดิมทีตั้งใจจะใช้  ESP32  เพียงตัวเดียว  เพราะ IO มันน่าจะพอ  แต่ประเด็นปัญหาก็คือ
ผลการวัดค่า  PM2.5 และ MQ137  นั้น  ต้องวัดผ่าน  ADC   และจะมีปัญหาเมื่อมีการเปิดใช้  WiFi  โดยค่าวัดจะเพี้ยนไปอย่างมโหฬาร

ประกอบกับ  จะต้องมีการแสดงผลออกจอ  LCD16x2 ที่จะต้องใช้ port SDA, SCL ด้วยนั้น  ก็จะต้องออกแบบการเชื่อมต่อใหม่ทั้งหมด กล่าวคือ

  • ใช้ Arduino Nano เป็นบอร์ดจัดการการวัดแอมโมเนีย และทำหน้าที่เป็น  Slave ส่งข้อมูลให้ Master อีก
  • ใช้ ATMega 2560 แทน Arduino Nano ไปก่อน  สิ้นเปลืองหน่อยแต่ก็เอาให้สำเร็จก่อน (สุดท้ายควรเปลี่ยนมาใช้  Nano แทนจะดีกว่า ประหยัดตังก์และพื้นที่น้อยกว่า)
  • ใช้  ESP เป็น Master  ที่จะรับข้อมูลการวัด จาก ATMega และ Arduino Nano  และส่งข้อมูลขึ้น Server ด้วย WiFi และให้ ESP32 แสดงผลออกจอ LCD16x2 ได้ด้วย
  • สำหรับการรับส่งข้อมูล จะต้องส่งด้วย I2C  ซึ่งงานนี้จะต้องใช้อุปกรณ์  Slave ถึง 3 ตัวด้วยกัน

โครงงานนี้จึงเป็นตัวอย่างการทดสอบการสื่อสาร I2C ได้เป็นอย่างดี เหมาะสำหรับเป็นตัวอย่างนำไปดัดแปลงใช้งานได้

และต้องขอขอบคุณที่มาของโค้ด ต่างๆ ที่จะได้อ่างอิง  รวมทั้งคำอธิบายอย่างละเอียดที่สุด
ก่อนอื่นจะต้องดำเนินการดังนี้

  • สร้างโค้ดสำหรับการทดสอบ port address ของ slave ทั้ง 3 ตัว  คือ จอ (1)LCD,  (2)ATMega และ (3)Nano
  • ทำให้บอร์ด และอุปกรณ์วัด PM2.5  ทำงานได้ก่อน
  • ทำให้บอร์ดและอุปกรณ์วัด แอมโมเนีย MQ137 ทำงานได้่ก่อนด้วย
  • ทำให้ ESP32 คุยกับ WiFi  ให้ได้  แสดงผลออกจอได้ และส่งผลขึ้น server ให้ได้ก่อน
  • สุดท้ายก็นำมายำรวมกัน  และทดสอบผล  เปรียบเทียบค่าวัดฝุ่นและแอมโมเนียกับเครื่อวัดจริง ๆ

เราจึงจะนำเสนอเรื่องราวเป็น   5 ตอน  แต่ละตอนก็จะเล่าปัญหาที่เจอกันแบบมันส์  เป็นบันทึกสำหรับตัวเอง และทุกท่านที่แวะมาอ่านกันนะครับ
เริ่มกันที่
สร้างโค้ดสำหรับการทดสอบ port address ของ slave ทั้ง 3 ตัว  คือ จอ (1)LCD,  (2)ATMega และ (3)Nano
 
โค้ดสำหรับการทดสอบ  Address ตามนี้เลย  คัดมาจากหนังสือตัวอย่างตามแนบ

#include <Wire.h>
void setup(){
  Wire.begin();
  Serial.begin(9600);
  while(!Serial);
  Serial.println("\nI2C Scanner");
}
void loop(){
  Serial.println("Scanning ...");
  byte count = 0;
  for (byte i=8;i<120;i++){
    Wire.beginTransmission(i);
    if(Wire.endTransmission()==0){
      Serial.print ("I2C device found at address : ");
      Serial.print(i,DEC);
      Serial.print(" (0x");
      Serial.print(i,HEX);
      Serial.println(")");
      count++;
    }
  }
  Serial.println("Done.");
  Serial.print("Found ");
  Serial.print(count,DEC); แสดงค่า address ที่พบเป็นเลขฐาน 10
  Serial.println(" device(s).\n");
  delay(5000);
}

การทดสอบตอนแรก ๆ ก็ทดสอบ  คู่เดียวก่อน  (เพราะก่อนหน้านี้เคย ประกอบหลายตัว และประกอบผิดมั้ง  เจ๊งเลย  555 ) แต่ตอนหลังก็ทดสอบพร้อมกันเลย  แต่ต้องระมัดระวังการต่อขา SDA  SCL  และไฟเลี้ยงต่างๆ กันให้แม่นๆ ละกัน  และมีตารางสรุปไว้อ้างอิงดังนี้นะฮะ
และหากทำการเชื่อมต่ออุปกรณ์ทั้งหมดคือ ESP32 (run โปรแกรมทดสอบด้านบน) และเชือมต่อ ATMega, Nano, LCD  ให้ถูกต้อง  และไม่ต้องลงโค้ดใด ๆ ใน Slave ก่อน
ผลการทดสอบก็จะได้ว่า

  • LCD 16×2  จะใช้ port 34
  • ATMega  จะใช้ port  24
  • Nano จะใช้ port 39

ตาราง การเชื่อมต่อขา  SDA, SCL
 

Arduino Board or Chip SDA SCL
Uno A4 A5
Mega2560 20 21
Nano A4 A5
Pro Mini A4 A5
Leonardo 2 3
Due (has two I2C) 20 + SDA1 20 + SCL1
ATTiny85 & ATTiny45 5 7
ATmega328P 27 28

และสำหรับ ESP32  ่ต่อขา GIO21 เป็น SDA,  และ GIO22 เป็น SCL

 
ส่งท้ายด้วยคลิปสำหรับการทำความเข้าใจ การสื่อสารทาง  port I2C