查看:4137|回复:2
- 硬件
- esp8266开发板(ch340g)其它也差不多
- lcd1602
- 代码(lcd1602四线驱动接法,省线,速度不如八线驱动)
-
复制代码
- # include< LiquidCrystal.h>
- // 对应gpio5,4,0,2,14,12口,5 ----> rs,4 ----> en,d4-d7 ----> 0,2,14,12
- LiquidCrystal lcd(5,4,0,2,14,12);//实例化,并初始化引脚
- void setup() {
- lcd.begin(16,2);//设置行列
-
lcd.print("hello,word!");//打印信息
- }
- void loop() {
- lcd.setCursor(0,1);//设置光标位置
- lcd.print("time:");
-
lcd.print(millis()/1000);//计算运行时间
- }
- # include< LiquidCrystal.h>
调用了arduino的库 ----> LiquidCrystal
4位数据线接法:LiquidCrystal(rs,enable,d4,d5,d6,d7)
-
LiquidCrystal(rs,rw,enable,d4,d5,d6,d7)
- LiquidCrystal(rs,enable,d0,d1,d2,d3,d4,d5,d6,d7)
-
LiquidCrystal(rs,rw,enable,d0,d1,d2,d3,d4,d5,d6,d7)
- rs,连接到RS的Arduino引脚。
- rw,连接到R/W的Arduino引脚。
- enable,连接到E的Arduino引脚。
- d0,d1,d2,d3,d4,d5,d6,d7数据引脚。
-
LiquidCrystal(rs,rw,enable,d4,d5,d6,d7)
- 接线
-
- 注释:最后把背光接上,因为esp8266输出是3.3v,lcd1602需要5v才显示清楚,所以显示效果会很淡
- 或者,直接把lcd1602的vdd接到esp8266的vin,因为vin输出是5v。如果屏幕显示不清晰,把lcd1602的v0(vee)和esp8266的gnd串联一个可调电阻,调一下就清晰了
- 运行效果
评分
- 附上代码二,在上面的基础上。添加 心知天气 (api申请)的显示,增加一点实用性
- 主要代码来自于 太极创客,
-
复制代码
-
/**********************************************************************
- 项目名称/Project : 零基础入门学用物联网
- 程序名称/Program name : weather_now
- 团队/Team : 太极创客团队 / Taichi-Maker
- 作者/Author : CYNO朔
- 日期/Date(YYYYMMDD) : 20200602
- 程序目的/Purpose :
- 通过心知天气免费服务获取实时天气信息。
-
-----------------------------------------------------------------------
- 其它说明 / Other Description
- 心知天气API文档说明:
- 本程序为太极创客团队制作的免费视频教程《零基础入门学用物联网 》中一部分。该教程系统的
- 向您讲述ESP8266的物联网应用相关的软件和硬件知识。
-
***********************************************************************/
- #include< ArduinoJson.h>
- #include< ESP8266WiFi.h>
- #include< LiquidCrystal.h>
- const char* ssid = "bonfire"; // 连接WiFi名(此处使用taichi-maker为示例)
- // 请将您需要连接的WiFi名填入引号中
- const char* password = "1234567800"; // 连接WiFi密码(此处使用12345678为示例)
- // 请将您需要连接的WiFi密码填入引号中
- const char* host = "api.知心天气的服务器"; // 将要连接的服务器地址
- const int httpPort = 80; // 将要连接的服务器端口
- // 心知天气HTTP请求所需信息
- String reqUserKey = "xxxxxxxxxxxxxx"; // 私钥
- String reqLocation = "22.98486:114.7199"; // 城市
- String reqUnit = "c"; // 摄氏/华氏
- LiquidCrystal lcd(5, 4, 0, 2, 14, 12); // 实例化lcd驱动
- void setup() {
- lcd.begin(16, 2); //设置行列
- lcd.print("Hello Joie ^v^");//打印信息
- Serial.begin(9600);
- Serial.println("");
- // 连接WiFi
- connectWiFi();
- }
- void loop() {
- // 建立心知天气API当前天气请求资源地址
-
String reqRes = "/v3/weather/now.json?key=" + reqUserKey +
- + "&location=" + reqLocation +
- "&language=en&unit=" + reqUnit;
- // 向心知天气服务器服务器请求信息并对信息进行解析
- httpRequest(reqRes);
- delay(3000);
- // lcd.clear();
- // lcd.setCursor(0, 1); //设置光标位置
- // lcd.print("time:");
- // lcd.print(millis() / 1000); //计算运行时间
- }
- // 向心知天气服务器服务器请求信息并对信息进行解析
- void httpRequest(String reqRes) {
- WiFiClient client;
- // 建立http请求信息
- String httpRequest = String("GET ") + reqRes + " HTTP/1.1\r\n" +
- "Host: " + host + "\r\n" +
- "Connection: close\r\n\r\n";
- Serial.println("");
- Serial.print("Connecting to "); Serial.print(host);
- // 尝试连接服务器
- if (client.connect(host, 80)) {
- Serial.println(" Success!");
- // 向服务器发送http请求信息
-
client.print(httpRequest);
- Serial.println("Sending request: ");
-
Serial.println(httpRequest);
- // 获取并显示服务器响应状态行
-
String status_response = client.readStringUntil('\n');
-
Serial.print("status_response: ");
-
Serial.println(status_response);
- // 使用find跳过HTTP响应头
- if (client.find("\r\n\r\n")) {
- Serial.println("Found Header End. Start Parsing.");
- }
- // 利用ArduinoJson库解析心知天气响应信息
- parseInfo(client);
- } else {
- Serial.println(" connection failed!");
- }
- //断开客户端与服务器连接工作
- client.stop();
- }
- // 连接WiFi
- void connectWiFi() {
- WiFi.begin(ssid, password); // 启动网络连接
- Serial.print("Connecting to "); // 串口监视器输出网络连接信息
- Serial.print(ssid); Serial.println(" ..."); // 告知用户NodeMCU正在尝试WiFi连接
- int i = 0; // 这一段程序语句用于检查WiFi是否连接成功
- while (WiFi.status() != WL_CONNECTED) { // WiFi.status()函数的返回值是由NodeMCU的WiFi连接状态所决定的。
- delay(1000); // 如果WiFi连接成功则返回值为WL_CONNECTED
- Serial.print(i++); Serial.print(' '); // 此处通过While循环让NodeMCU每隔一秒钟检查一次WiFi.status()函数返回值
- lcd.setCursor(0,1);
- lcd.print(i++);
- } // 同时NodeMCU将通过串口监视器输出连接时长读秒。
- // 这个读秒是通过变量i每隔一秒自加1来实现的。
- Serial.println(""); // WiFi连接成功后
-
Serial.println("Connection established!"); // NodeMCU将通过串口监视器输出"连接成功"信息。
- Serial.print("IP address: "); // 同时还将输出NodeMCU的IP地址。这一功能是通过调用
-
Serial.println(WiFi.localIP()); // WiFi.localIP()函数来实现的。该函数的返回值即NodeMCU的IP地址。
- }
- // 利用ArduinoJson库解析心知天气响应信息
- void parseInfo(WiFiClient client) {
- const size_t capacity = JSON_ARRAY_SIZE(1) + JSON_OBJECT_SIZE(1) + 2 * JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(6) + 230;
- DynamicJsonDocument doc(capacity);
- deserializeJson(doc, client);
- JsonObject results_0 = doc["results"][0];
- JsonObject results_0_now = results_0["now"];
- const char* results_0_now_text = results_0_now["text"]; // "Sunny"
- const char* results_0_now_code = results_0_now["code"]; // "0"
-
const char* results_0_now_temperature = results_0_now["temperature"]; // "32"
-
const char* results_0_last_update = results_0["last_update"]; // "2020-06-02T14:40:00+08:00"
- // 通过串口监视器显示以上信息
-
String results_0_now_text_str = results_0_now["text"].as<String>();
-
int results_0_now_code_int = results_0_now["code"].as<int>();
-
String results_0_now_temperature_str = results_0_now["temperature"].as<String>();
-
String results_0_last_update_str = results_0["last_update"].as<String>();
-
Serial.println(F("======Weahter Now======="));
- Serial.print(F("Weather Now: "));
-
Serial.print(results_0_now_text_str);
- Serial.print(F(" "));
-
Serial.println(results_0_now_code_int);
-
Serial.print(F("Temperature: "));
-
Serial.print(results_0_now_temperature_str);
- Serial.println(F(" C"));
- Serial.print(F("Last Update: "));
-
Serial.println(results_0_last_update_str);
-
Serial.println(F("========================"));
- // 设置lcd1602显示信息
- lcd.clear();
- // delay(1000);
- lcd.setCursor(0, 0);
-
lcd.print(results_0_now_text_str + " " + results_0_now_temperature_str + "c");
- lcd.setCursor(0, 1);
-
lcd.print(results_0_last_update_str);
- }
-
/**********************************************************************