×

公交到站提醒开源项目

消耗积分:0 | 格式:zip | 大小:0.42 MB | 2022-12-20

李霞

分享资料个

描述

每个人都讨厌失去一辆公共汽车,并在手机上安装无用的应用程序,而这些应用程序是您一生中要使用一次的。为了解决这个问题,我开发了一个新系统,它会在下一班公交车到达时询问 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、标头和参数)是否正确。您可以在下图中看到一个示例:

 
poYBAGOSxT-AUzZSAADgLqAO8-E349.png
邮递员 API GET 示例
 

ArudinoJson Library(版本 6)提供在线助手。这样,如果您引入响应示例,它会生成用于序列化或解析 JSON 的代码。您可以在此链接中找到此助手:

https://arduinojson.org/v6/assistant/

 

 
poYBAGOhKrmAFExsAACtDiZxJLc289.png
解析和序列化程序示例
 

因此,如果您介绍 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发送的消息
  • 控制 LCD 屏幕和更新下一班车的时间
  • 选择我们感兴趣的总线
  • 距离下一班车还有5分钟时发出缓冲声

为了接收和处理 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)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !