ชื่อโปรเจกต์: Bus Arriving Project
ทุกคนเกลียดการพลาดรถบัส และการติดตั้งแอปที่ไร้ประโยชน์บนมือถือที่คุณจะใช้แค่ครั้งเดียวในชีวิต เพื่อแก้ปัญหานี้ ผมได้พัฒนาระบบใหม่ที่จะสอบถาม API Rest Service ว่ารถบัสคันต่อไปจะมาถึงเมื่อไหร่ เมื่อ API Rest Service ตอบกลับ เวลาที่เหลือสำหรับรถบัสคันต่อไปจะแสดงบน LCD Screen ESP8266 จะเป็นบอร์ดที่รับผิดชอบในการสอบถาม API REST Service และ LCD Screen จะถูกควบคุมโดย Arduino Uno ผมได้ปรับแต่งโปรเจกต์นี้สำหรับ Zaragoza API API นี้ให้ข้อมูลเกี่ยวกับเวลาที่รถบัสคันต่อไปจะมาถึง หรือพิกัดทางภูมิศาสตร์ของป้ายรถบัส เป็นต้น ในกรณีของผม ผมมีรถบัส 2 สายที่สนใจคือ 39 และ CI2 ดังนั้น ผมจึงได้เตรียมระบบสำหรับเลือกสายรถบัสที่ผมสนใจในแต่ละช่วงเวลา และเวลาจะแสดงบน LCD Screen หากผมไม่ต้องการไปถึงป้ายรถบัสสาย ผมต้องออกจากบ้าน 5 นาทีก่อนรถบัสมาถึง เนื่องจากสถานการณ์นี้ บัซเซอร์จะส่งเสียงทุกครั้งที่มีเวลาเหลือ 5 นาทีสำหรับรถบัสคันต่อไป
คำอธิบายการพัฒนาโปรเจกต์
โปรเจกต์ประกอบด้วยโค้ด 2 ส่วน ส่วนหนึ่งจะจัดการ Arduino Uno และอีกส่วนหนึ่งรับผิดชอบในการจัดการบอร์ด ESP8266
เราจะเริ่มต้นด้วยการอธิบายโค้ดของ ESP8266:
ดังที่ได้อธิบายไปข้างต้น บอร์ดนี้จะสอบถาม API อย่างต่อเนื่อง การตอบกลับของ API จะอยู่ในรูปแบบ JSON ซึ่งจะต้องมีการ parse ข้อมูลให้เป็น object สำหรับการ parse JSON เราจะใช้ ArduinoJson Library ซึ่งสามารถจัดการการ parse และ serialization ได้อย่างง่ายดาย
ขอแนะนำให้ใช้ API Client เช่น Postman เพื่อตรวจสอบว่าข้อความที่คุณส่งไปยัง API (GET/POST, Headers และ Params) นั้นถูกต้อง คุณสามารถดูตัวอย่างได้จากรูปด้านล่าง:

ArduinoJson Library (เวอร์ชัน 6) มีผู้ช่วยออนไลน์ให้บริการ ด้วยวิธีนี้ หากคุณป้อนตัวอย่างการตอบกลับ ระบบจะสร้างโค้ดสำหรับ serialization หรือการ parse JSONs ให้ คุณสามารถค้นหาผู้ช่วยนี้ได้จากลิงก์นี้:
https://arduinojson.org/v6/assistant/

ดังนั้น หากคุณป้อนตัวอย่าง JSON ของคุณ ผู้ช่วยนี้จะให้แนวทางแก้ไขที่เป็นไปได้สำหรับการ parse และการทำงานกับโครงสร้างเหล่านี้ ในกรณีของผม ผมจะทำงานกับโครงสร้างที่แตกต่างกันสองแบบ เนื่องจากป้ายรถบัสหนึ่งป้ายมีรถบัสเพียงคันเดียว และอีกป้ายหนึ่งมีรถบัสสองคันให้บริการ
สำหรับการเตรียมส่วน GET เราจะสร้าง WifiClient จาก ESP8266WifiMulti Library ถัดไป ให้เชื่อมต่อ client ไปยัง API host และเริ่มส่ง GET Request, params และ headers ตัวอย่างถัดไปจากโค้ดของผม:
WiFiClient client;
String server = "www.zaragoza.es";
// This will send the request to the server
if (client.connect(server,80)) {
//Serial.println("Conectado");
if (selectbus == 39) {
client.print("GET /api/recurso/urbanismo-infraestructuras/transporte-urbano/poste/tuzsa-508?");
client.println(" HTTP/1.0");
client.println("Host: www.zaragoza.es");
client.println("Content-Type: application/json");
client.println("Accept: application/json");
client.println();
} else {
client.print("GET /api/recurso/urbanismo-infraestructuras/transporte-urbano/poste/tuzsa-3022?");
client.println(" HTTP/1.0");
client.println("Host: www.zaragoza.es");
client.println("Content-Type: application/json");
client.println("Accept: application/json");
client.println();
}
} else {
//Serial.println("Connection Failed!!!");
}
ปรับแต่งโค้ดของคุณสำหรับ API ที่คุณกำลังเรียกใช้
เมื่อเราทราบวิธีรับและประมวลผลการตอบกลับ JSON แล้ว ก็เหลืออีกงานเดียวที่ต้องทำให้เสร็จ: ส่งส่วนหนึ่งของการตอบกลับผ่าน Serial Protocol ไปยังบอร์ด Arduino Uno
เมื่อบอร์ด ESP8266 ได้รับการโปรแกรมอย่างถูกต้องแล้ว เราจะมุ่งเน้นไปที่โค้ดของบอร์ด Arduino Uno โดยตรง หน้าที่ของ Arduino Uno คือ:
- รับและประมวลผลข้อความที่ส่งโดย ESP8266
- ควบคุม LCD Screen และอัปเดตเวลาที่เหลือสำหรับรถบัสคันต่อไป
- เลือกสายรถบัสที่เราสนใจ
- ทำให้บัซเซอร์ส่งเสียงเมื่อมีเวลาเหลือ 5 นาทีสำหรับรถบัสคันต่อไป
สำหรับการรับและประมวลผลข้อความที่ส่งโดย ESP8266 จะมีการสร้าง object SoftwareSerial ขึ้น (ในกรณีของผม พอร์ต Rx จะเป็น 2 และ Tx pin คือ 11) ด้วยวิธีนี้ ในแต่ละรอบการทำงาน client จะสอบถามข้อมูลบางอย่าง จะได้รับข้อมูลอัปเดตจาก ESP8266 และจะแสดงข้อมูลอัปเดตใหม่บน LCD Screen
String payload;
// listen for communication from the ESP8266 and then write it to the serial monitor
while ( ESPserial.available() > 0 ) {
lcd.clear();
//Serial.write( ESPserial.read() );
char c = ESPserial.read();
payload +=c;
}
[...]
lcd.print(payload);
สำหรับการควบคุม LCD Screen จะใช้ LiquidCrystal Library สำหรับการควบคุมหน้าจอ จะใช้ขา 7, 6, 4, 3 และ 8 ข้อมูลเพิ่มเติมเกี่ยวกับ LCD Screen และการเชื่อมต่อ สามารถดูได้จาก Schema ด้านล่าง
โดยอัตโนมัติ ทุกครั้งที่ Arduino Uno และ ESP8266 เริ่มทำงาน ระบบจะถูกกำหนดค่าให้สอบถามเวลาที่เหลือสำหรับรถบัสสาย 39 คันต่อไป หากผมต้องการสอบถามเวลาที่เหลือสำหรับรถบัสสาย CI2 คันต่อไป คุณจะต้องกดปุ่มที่ติดตั้งไว้ ด้วยวิธีนี้ Arduino Uno จะส่งคำสำคัญผ่าน SerialPort Tx#11 ไปยัง ESP8266 ทำให้ ESP8266 ทราบว่าต้องเปลี่ยนเงื่อนไขการเรียกใช้และสอบถามข้อมูลป้ายรถบัส CI2
สุดท้ายแต่ไม่ท้ายสุด ระบบจะทำให้บัซเซอร์ส่งเสียงทุกครั้งที่มีเวลาเหลือ 5 นาทีสำหรับรถบัสคันต่อไป เพื่อไม่ให้พลาดรถบัส ด้วยวิธีนี้ ผมจะมั่นใจว่าจะไปถึงรถบัสคันต่อไปและทุกคนจะมีความสุข!!!
ต่อไปนี้คือโค้ดที่จัดการตรรกะที่อธิบายไว้ข้างต้น:
void loop()
{
String payload;
// listen for communication from the ESP8266 and then write it to the serial monitor
while ( ESPserial.available() > 0 ) {
lcd.clear();
//Serial.write( ESPserial.read() );
char c = ESPserial.read();
payload +=c;
}
//delay(3000);
// listen for user input and send it to the ESP8266
if ( Serial.available() ) { ESPserial.write( Serial.read() ); }
int sensorVal = digitalRead(PIN_PULSADOR);
// Serial.println(sensorVal);
if (sensorVal != estado_anterior) {
if (sensorVal == HIGH) {
digitalWrite(PIN_LED, LOW);
}
else {
digitalWrite(PIN_LED, HIGH);
ESPserial.write("CI");
if (selbus == 39) {
selbus = 50;
} else {
selbus = 39;
}
//Serial.println("CI");
}
}
if (selbus == 39) {
lcd.home();
lcd.print("El 39 llega en");
} else {
lcd.home();
lcd.print