找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 157|回复: 1
打印 上一主题 下一主题
收起左侧

用8266开发板+心知天气制做一个实时天气数据显示器

[复制链接]
跳转到指定楼层
楼主
在心知天气网站上注册登陆获取一个API后就可利用8266开发板制做一个实时天气数据显示器,显示器右侧有一个按钮,按下一次就可显示室外当前天气状况30秒钟然后自动关机。该显示器还加装了一个DHT11温湿度传感器用于显示当前室内温湿度。下面提供了显示器图片及电路图和程序。
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
#include <ArduinoJson.h>
#include <Wire.h>  
#include <SPI.h>
#include <dht11.h>
#include <Arduino.h>
#include <U8g2lib.h>
const char* ssid = "。。。。。。";   //WIFI名称
const char* password = "。。。。。。"; //WIFI密码
const char* host     = "api.seniverse com";
String apiKey = "。。。。。。";  // 注册后获取
String location      = "shanghai"; // 城市标识
String unit          = "c";       // 摄氏度
//U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); //使用OLED显示
U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R0, /* clock=*/ 0, /* data=*/ 2, /* CS=*/ 1, /* reset=*/ 16); //使用ST7920显示
dht11 DHT11;
#define DHT11PIN 14

void setup() {
  u8g2.begin(); // 初始化OLED
  u8g2.enableUTF8Print(); // 启用UTF-8中文打印
  Serial.begin(9600);
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
// WiFi连接
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  u8g2.clearBuffer(); // 清显存
u8g2.setFont(u8g2_font_wqy16_t_gb2312);
   u8g2.setCursor(20, 40); // 坐标(x,y),y是基线位置
  u8g2.print("心 知 天 气"); // UTF-8中文   
  u8g2.sendBuffer(); // 显存数据推送到显示器显示   
  }
}

void loop() {

    WiFiClient client;
    HTTPClient http;
  // 构建API请求URL
    String url = "http://" + String(host) + "/v3/weather/now.json?key=" + apiKey +
                 "&location=" + location + "&language=zh-Hans&unit=" + unit;

   // Serial.print("Request URL: ");
   // Serial.println(url);

    if(http.begin(client, url)) {
      int httpCode=http.GET();

          String payload=http.getString();
         // Serial.println("Payload: " + payload);

          // 解析JSON
StaticJsonDocument<200> doc;
         DeserializationError error=deserializeJson(doc, payload);

           String weather=doc["results"][0]["now"]["text"].as<String>();
            int temp=doc["results"][0]["now"]["temperature"].as<float>();
          int windSpeed=doc["results"][0]["now"]["wind_speed"];
         const char* windDir=doc["results"][0]["now"]["wind_direction"];
         float f= windSpeed/3.6;

          int chk = DHT11.read(DHT11PIN);
int t= (float)DHT11.temperature;
int h=(float)DHT11.humidity;
  u8g2.clearBuffer(); // 清显存     
// 设置字体(必须选支持中文的字体,这里用u8g2_font_wqy12_t_gb2312)
  u8g2.setFont(u8g2_font_wqy12_t_gb2312);
  u8g2.setCursor(0, 20);
  u8g2.print("室内;");
   u8g2.setCursor(38, 20);
  u8g2.print(t);
    u8g2.setCursor(56, 20);
  u8g2.print("C");
  u8g2.setCursor(68, 20);
  u8g2.print("湿度:");
  u8g2.setCursor(106, 20);
  u8g2.print(h);
  u8g2.setCursor(122, 20);
  u8g2.print("%");
  u8g2.setCursor(0, 40);
  u8g2.print("温度:");
u8g2.setCursor(38, 40);
  u8g2.print(temp);
  u8g2.setCursor(56, 40);
  u8g2.print("C");
  u8g2.setCursor(68, 40);
  u8g2.print("天气:");
  u8g2.setCursor(106, 40);
  u8g2.print(weather);
   u8g2.setCursor(0, 60);
  u8g2.print("风向:");
   u8g2.setCursor(38, 60);
  u8g2.print(windDir);
u8g2.setCursor(68, 60);
  u8g2.print("风速:");
  u8g2.setCursor(106, 60);
  u8g2.print(f,1);
  u8g2.sendBuffer();        

      http.end();
      }   else {
     // Serial.println("HTTP begin failed");
    }

   delay(30000);
   digitalWrite(13, LOW); 关机
}

3e5c3b876d13efeaa82827e5d9547130.jpg (348.86 KB, 下载次数: 0)

3e5c3b876d13efeaa82827e5d9547130.jpg

861e20e96eec23832797aa4859578b33.jpg (340.51 KB, 下载次数: 0)

861e20e96eec23832797aa4859578b33.jpg

EasyCapture12.png (16.46 KB, 下载次数: 0)

EasyCapture12.png

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:65237 发表于 2026-2-10 10:09 | 只看该作者
楼主你这有完整资料分享一下,想做一个,有你更精彩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表