ประกอบร่าง ESP32-Nano-I2C เป็น datalogger อย่างเซียน ตอนที่ 1
บทความนี้เกิดจากความต้องการสร้างระบบ Datalogger ที่ต้องวัดค่าฝุ่น ค่าแอมโมเนีย โดยจะต้องแสดงผล ที่เครื่องมือวัด และส่งค่าผ่านไปยัง server ด้วย
ส่วนประกอบของงาน
- เครื่องวัดฝุ่น PM2.5 ของ Sharp รุ่น ….(มาเติมใหม่อีกทีนะ เขียนเนื้อหายาวๆ ไปก่อน)
- เครื่องวัดแกสแอมโมเนีย MQ137 (ตัวนี้ราคาไม่เบาทีเดียว และเล่นไม่ง่ายเลย)
- จอ LCD 16×2
- ESP32
- ATMega2560
- 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