每个人都讨厌失去一辆公共汽车,并在手机上安装无用的应用程序,而这些应用程序是您一生中要使用一次的。为了解决这个问题,我开发了一个新系统,它会在下一班公交车到达时询问 API Rest Service。一旦 API Rest 服务响应,到下一班车的剩余时间将显示在 LCD 屏幕上。ESP8266 将是负责请求 API REST 服务的板,LCD 屏幕将由 Arduino Uno 控制。我已经为 Zaragoza API 个性化了这个项目。例如,此 API 提供有关下一班公共汽车到达时间或公共汽车站地理坐标的信息。就我而言,我有 2 条感兴趣的公交线路,39 路和 CI2。于是,我准备了每时每刻选择我感兴趣的公交线路的系统,时间显示在液晶屏上。如果我不想赶公共汽车迟到,我必须在公共汽车到达前 5 分钟从家里出门。由于这种情况,每当下一班车还剩 5 分钟时,蜂鸣器就会响起。
项目由2个代码组成,一个管理arduino uno,另一个负责管理ESP8266板。
我们将开始解释 ESP8266 代码:
正如我在上面解释的那样,该板将不断询问 API。API 的响应是通过 JSON,这种方式需要将信息解析成一个对象。为了解析 JSON,我们将使用 ArduinoJson 库,它可以轻松处理解析和序列化。
建议使用 Postman 等 API 客户端来验证您发送到 API 的消息(GET/POST、标头和参数)是否正确。您可以在下图中看到一个示例:
ArudinoJson Library(版本 6)提供在线助手。这样,如果您引入响应示例,它会生成用于序列化或解析 JSON 的代码。您可以在此链接中找到此助手:
https://arduinojson.org/v6/assistant/
因此,如果您介绍 JSON 示例,该助手将为您提供解析和使用这些结构的可能解决方案。就我而言,我将使用两种不同的结构,因为一个公交车站只有 1 辆公交车,而另一个公交车站有 2 辆公交车。
为了准备 GET 部分,我们将从 ESP8266WifiMulti 库创建一个 WifiClient。接下来,将客户端连接到 API 主机并开始发送 GET 请求、参数和标头。接下来,来自 muy 代码的示例:
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 响应,就只需要完成一个任务:通过串行协议将部分响应发送到 Arduino Uno 开发板。
正确编程 ESP8266 板后,我们将直接关注 Arduino Uno 板代码。Arduino Uno 函数有:
为了接收和处理 ESP8266 发送的消息,将创建一个 SoftwareSerial 对象(在我的例子中,端口 Rx 为 2,Tx 引脚为 11)。这样,每次迭代客户端都会询问一些信息,它会收到 ESP8266 更新,并会在 LCD 屏幕上显示新的更新。
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 屏幕,将使用 LiquidCrystal 库。对于屏幕的控制,将使用 7、6、4、3 和 8 针脚。有关 LCD 屏幕及其连接的更多信息,请参见下面的示意图。
每次 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("El CI2 llega en");
}
lcd.setCursor(0,1);
lcd.print(payload);
if (payload[0] == '5') {
tone(12, 440,100);
}
estado_anterior = sensorVal;
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !