设备
-
LCD 1602A显示屏
-
合宙Air 551G导航模块
-
DFRobot Beetle ESP32-C3开发板
-
杜邦线若干
连接方式
跟之前的连接一样。
-
ESP32-C3通过自制一分二的线分别给LCD屏幕和Air 551G供电。
-
ESP32-C3的Pin 8(SDA)和9(SCL)与LCD屏幕连接。
-
ESP32-C3的Pin 20(RX)和21(TX)与Air 551G连接。
功能设计
利用ESP32-C3控制GNSS模块,获取当前UTC时间和经纬度等时间和坐标信息,同时连接WIFI获取所在位置的天气信息。
在LCD屏幕上对时间、坐标以及天气信息等进行显示。
实现效果
基本上完成了设计功能。
后期升级主要是用更好的屏幕,现在用的LCD1602A显示太差,不知道为什么显示很不清晰。
现在时间和坐标信息与天气信息是切换显示的,如果屏幕更大一点,可以加入可视化显示和同屏显示。
最重要的是,如果把几个模块设计到一个模块中,套个好看的外壳,摆在车里面当挂件,是不是也很不错?
代码实现
#include
#include
#include
#include
#include
const char* ssid = "**";
const char* password = "**";
String openWeatherMapApiKey = "***";
double time_utc=0;
double lat=34;
double lon=113;
unsigned long lastTime = 0;
unsigned long timerDelay = 10000;
LiquidCrystal_PCF8574 lcd(0x27);
String jsonBuffer;
String lineData="";
int show = -1;
String comdata="";
void setup()
{
int error;
Serial.begin(115200);
Serial.println("LCD...");
Serial1.begin(115200,SERIAL_8N1,20,21);
while (!Serial&&!Serial1)
;
WiFi.begin(ssid, password);
Serial.println("Connecting WIFI...");
while(WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());
Serial.println("Timer set to 10 seconds (timerDelay variable), it will take 10 seconds before publishing the first reading.");
Serial.println("Dose: check for LCD");
Wire.begin();
Wire.beginTransmission(0x27);
error = Wire.endTransmission();
Serial.print("Error: ");
Serial.print(error);
if (error == 0) {
Serial.println(": LCD found.");
show = 0;
lcd.begin(16, 2);
} else {
Serial.println(": LCD not found.");
}
lcd.setBacklight(0);
delay(400);
lcd.setBacklight(255);
lcd.home();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("WIFI&SCREEN&GNSS");
lcd.setCursor(0, 1);
lcd.print("IS READY!");
lcd.noBlink();
lcd.noCursor();
delay(1000);
}
void loop()
{
while(Serial1.available()>0)
{
lineData=char(Serial1.read());
comdata+=lineData;
delay(2);
}
if (comdata.length()>0)
{
Serial.println(comdata);
int ic=comdata.indexOf('*');
String tmp=comdata.substring(1,ic);
if(tmp.substring(0,5)==("GNGGA"))
{
lcd.home();
lcd.clear();
lcd.setCursor(0, 0);
time_utc=tmp.substring(6,16).toDouble()+80000;
if (time_utc>240000)
time_utc-=240000;
Serial.println("T="+String(time_utc));
lcd.print("T="+String(time_utc));
lat=tmp.substring(17,19).toDouble()+tmp.substring(19,27).toDouble()/60;
lon=tmp.substring(30,33).toDouble()+tmp.substring(33,41).toDouble()/60;
Serial.println("Lat="+String(lat));
Serial.println("Lon="+String(lon));
lcd.setCursor(0, 1);
lcd.print("B="+String(lat).substring(0,6)+" L="+String(lon).substring(0,7));
}
comdata="";
}
if ((millis() - lastTime) > timerDelay) {
if(WiFi.status()== WL_CONNECTED){
String serverPath = "http://api.openweathermap.org/data/2.5/weather?lat=" + String(lat) + "&lon=" + String(lon) + "&appid=" + openWeatherMapApiKey;
jsonBuffer = httpGETRequest(serverPath.c_str());
Serial.println(jsonBuffer);
JSONVar myObject = JSON.parse(jsonBuffer);
if (JSON.typeof(myObject) == "undefined") {
Serial.println("Parsing input failed!");
return;
}
Serial.print("JSON object = ");
Serial.println(myObject);
Serial.print("Temperature: ");
double c = myObject["main"]["temp"];
c = c-273.15;
Serial.println(c);
lcd.home();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("T="+String(c)+" ");
Serial.print("Pressure: ");
Serial.println(myObject["main"]["pressure"]);
Serial.print("Humidity: ");
Serial.println(myObject["main"]["humidity"]);
double pres=myObject["main"]["pressure"];
lcd.print("P="+String(pres));
Serial.print("Wind Speed: ");
Serial.println(myObject["wind"]["speed"]);
lcd.setCursor(0, 1);
double wind=myObject["wind"]["speed"];
lcd.print("Wind="+String(wind)+" ");
double Hu=myObject["main"]["humidity"];
lcd.print("H="+String(Hu));
}
else {
Serial.println("WiFi Disconnected");
}
lastTime = millis();
}
}
String httpGETRequest(const char* serverName) {
WiFiClient client;
HTTPClient http;
http.begin(client, serverName);
int httpResponseCode = http.GET();
String payload = "{}";
if (httpResponseCode>0) {
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
payload = http.getString();
}
else {
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
http.end();
return payload;
}
|
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
相关推荐
首先是ESP32-C3只支持BLE,也就是数据是以packet出现的。不支持普通的蓝牙,也就是数据的处理的时候是可以字符串去操作的。
发表于 01-26 11:10
•1221次阅读
ESP32-C3在智能充电桩上的应用,性价比爆棚!
发表于 01-20 08:03
•376次阅读
这样的季节,有人赞秋叶之静美,有人叹秋风之悲凉,我们的工程师朋友则是连连催货忙~刚到手合宙CC表,又来催上市一年多仍风头不减的“DIY神器”合宙ESP32-C3开发板。今天不仅补货到了,还要特别
发表于 10-21 08:04
•540次阅读
这样的季节,有人赞秋叶之静美,有人叹秋风之悲凉,我们的工程师朋友则是连连催货忙~刚到手 合宙CC表 ,又来催上市一年多仍风头不减的 “DIY神器” 合宙ESP32-C3开发板。 今天不仅补货到了
发表于 10-20 14:55
•872次阅读
小结
本文通过环境搭建、外设编程、WiFi程序的演示,大致的描述了ESP32-C3的编程方式。总的说起来,采用ESP-IDF的集成开发环境,很大程度上可以减少环境搭建的烦恼,可以非常顺利的做上层业务
发表于 08-16 06:57
DFRobot提供的这款 FireBeetle 2 ESP32-S3 开发板,从官方WiKi上,可以了解到详细的硬件信息:
处理器:Xtensa® 双核32位LX7微处理器
主频:240 MHz
发表于 08-02 09:55
、FireBeetle 2 Board ESP32 S3引脚示意该开发板相关资料在官方页面都有提供,内容非常详细,对开发者非常友好。开发板参
发表于 07-29 22:22
第1章
开发板开箱以及开发环境搭建
感谢电子发烧友社区提供的测评机会,参加DFRobot 的FireBeetle 2 ESP32-S3开发板
发表于 07-29 21:40
/esp32-hal-adc.c.o
Compiling .pio/build/dfrobot_firebeetle2_esp32s3/FrameworkArduino/esp32-hal-bt.c.o
Compiling .p
发表于 07-29 10:04
和8MB PSRAM,可以存储更多的代码和数据,模组搭载的ESP32-S3芯片拥有强大的神经网络运算能力和信号处理能力,适用于图像识别、语音识别等项目。
现在开发板也都是板均Type-c
发表于 07-28 11:43
【FireBeetle 2 ESP32-S3开发板测评】MicroPython开发体验
发表于 07-23 09:02
•1268次阅读
ESP32
YS YYDS
发布于 :2023年07月07日 19:40:50
ESP32-C2开发板开发演示
发表于 07-06 13:38
•251次阅读
ESP32-C3开发板开发演示
发表于 06-29 14:13
•525次阅读
current ESP-ID,使用本地SDK,也就是前面自定义IDF的路径
4、如下图创建工程
5、选择芯片类型,我们需要选择esp32-c2
6、使用usb数据线连接PC与开发板,选择
发表于 06-09 13:34
评论