Arduino代碼
注意修改 WiFi 名稱和密碼
需要申請(qǐng)【心知天氣】API私鑰
心知天氣URL:https://www.seniverse.com
/*
參考:
https://blog.csdn.net/weixin_44668788/article/details/120643078
http://www.taichi-maker.com/homepage/iot-development/iot-platform/seniverse/esp8266-application/
OLED connect with ESP8266 NodeMCU
SCL -- D1
SDA -- D2
*/
//引入必要的頭文件
#include < ArduinoJson.h >
#include < ESP8266WiFi.h >
#include < SPI.h >
#include < U8g2lib.h >
#include < WiFiUdp.h >
#include < TimeLib.h >
#include < DNSServer.h >
#include < ESP8266WebServer.h >
WiFiUDP Udp;
unsigned int localPort = 8888; // 用于偵聽UDP數(shù)據(jù)包的本地端口
//網(wǎng)絡(luò)校時(shí)的相關(guān)配置
static const char ntpServerName[] = "ntp1.aliyun.com"; //NTP服務(wù)器,使用阿里云
int timeZone = 8; //時(shí)區(qū)設(shè)置,采用東8區(qū)
//保存斷網(wǎng)前的最新數(shù)據(jù)
int results_0_now_temperature_int_old;
String results_0_now_text_str_old;
int results_0_daily_1_high_int_old;
int results_0_daily_1_low_int_old;
String results_0_daily_1_text_day_str_old;
//函數(shù)聲明
time_t getNtpTime();
void sendNTPpacket(IPAddress &address);
void oledClockDisplay();
void sendCommand(int command, int value);
void initdisplay();
void connectWiFi();
void parseInfo_now(WiFiClient client,int i);
void parseInfo_fut(WiFiClient client,int i);
//
boolean isNTPConnected = false;
const unsigned char xing[] U8X8_PROGMEM = {
0x00, 0x00, 0xF8, 0x0F, 0x08, 0x08, 0xF8, 0x0F, 0x08, 0x08, 0xF8, 0x0F, 0x80, 0x00, 0x88, 0x00,
0xF8, 0x1F, 0x84, 0x00, 0x82, 0x00, 0xF8, 0x0F, 0x80, 0x00, 0x80, 0x00, 0xFE, 0x3F, 0x00, 0x00}; /*星*/
const unsigned char liu[] U8X8_PROGMEM = {
0x40, 0x00, 0x80, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00,
0x20, 0x02, 0x20, 0x04, 0x10, 0x08, 0x10, 0x10, 0x08, 0x10, 0x04, 0x20, 0x02, 0x20, 0x00, 0x00}; /*六*/
typedef struct
{ //存儲(chǔ)配置結(jié)構(gòu)體
int tz; //時(shí)間戳
} config_type;
config_type config;
WiFiClient clientNULL;
DNSServer dnsServer;
ESP8266WebServer server(80);
//----------WIFI連接配置----------
const char* ssid = "xxxxxx"; // WiFi名,需要更改
const char* password = "xxxxxx"; // WiFi密碼,需要更改
// 請(qǐng)將您需要連接的WiFi密碼填入引號(hào)中
//----------天氣API配置----------
const char* host = "api.seniverse.com"; // 將要連接的服務(wù)器地址
const int httpPort = 80; // 將要連接的服務(wù)器端口
// 心知天氣HTTP請(qǐng)求所需信息
String reqUserKey = "xxxxxxx"; // 私鑰,需要申請(qǐng)
String reqLocation = "Shanghai"; // 城市
String reqUnit = "c"; // 攝氏/華氏
//----------設(shè)置屏幕----------
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/U8X8_PIN_NONE);
int sta = 0;
//----------初始化OLED----------
void initdisplay()
{
u8g2.begin();
u8g2.enableUTF8Print();
}
//----------用于獲取實(shí)時(shí)天氣的函數(shù)(0)----------
void TandW(){
String reqRes = "/v3/weather/now.json?key=" + reqUserKey +
+ "&location=" + reqLocation +
"&language=en&unit=" +reqUnit;
// 向心知天氣服務(wù)器服務(wù)器請(qǐng)求信息并對(duì)信息進(jìn)行解析
httpRequest(reqRes,0);
//延遲,需要低于20次/分鐘
delay(5000);
}
void display_1(int results_0_now_temperature_int,String results_0_now_text_str);//聲明函數(shù),用于顯示溫度、天氣
//----------獲取3天預(yù)報(bào)(1)----------
void threeday(){
// 建立心知天氣API當(dāng)前天氣請(qǐng)求資源地址
String reqRes = "/v3/weather/daily.json?key=" + reqUserKey +
+ "&location=" + reqLocation + "&language=en&unit=" +
reqUnit + "&start=0&days=3";
// 向心知天氣服務(wù)器服務(wù)器請(qǐng)求信息并對(duì)信息進(jìn)行解析
httpRequest(reqRes,1);
delay(5000);
}
void clock_display(time_t prevDisplay){
server.handleClient();
dnsServer.processNextRequest();
if (timeStatus() != timeNotSet)
{
if (now() != prevDisplay)
{ //時(shí)間改變時(shí)更新顯示
prevDisplay = now();
oledClockDisplay();
}
}
}
void setup(){
Serial.begin(9600);
Serial.println("");
initdisplay();
// 連接WiFi
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_unifont_t_chinese2);
u8g2.setCursor(0, 14);
u8g2.print("Waiting for WiFi");
u8g2.setCursor(0, 30);
u8g2.print("connection...");
u8g2.sendBuffer();
connectWiFi();
Udp.begin(localPort);
setSyncProvider(getNtpTime);
setSyncInterval(300); //每300秒同步一次時(shí)間
}
time_t prevDisplay = 0; //當(dāng)時(shí)鐘已經(jīng)顯示
void loop(){
if (sta >=0 && sta<=250){
clock_display(prevDisplay);
}else if(sta == 251){
TandW();
}else{
threeday();
}
++sta;
if(sta==253){
sta = 0;
}
}
// 向心知天氣服務(wù)器服務(wù)器請(qǐng)求信息并對(duì)信息進(jìn)行解析
void httpRequest(String reqRes,int stat){
WiFiClient client;
// 建立http請(qǐng)求信息
String httpRequest = String("GET ") + reqRes + " HTTP/1.1rn" +
"Host: " + host + "rn" +
"Connection: closernrn";
Serial.println("");
Serial.print("Connecting to "); Serial.print(host);
// 嘗試連接服務(wù)器
if (client.connect(host, 80)){
Serial.println(" Success!");
// 向服務(wù)器發(fā)送http請(qǐng)求信息
client.print(httpRequest);
Serial.println("Sending request: ");
Serial.println(httpRequest);
// 獲取并顯示服務(wù)器響應(yīng)狀態(tài)行
String status_response = client.readStringUntil('n');
Serial.print("status_response: ");
Serial.println(status_response);
// 使用find跳過HTTP響應(yīng)頭
if (client.find("rnrn")) {
Serial.println("Found Header End. Start Parsing.");
}
if (stat == 0){
// 利用ArduinoJson庫(kù)解析心知天氣響應(yīng)信息(實(shí)時(shí)數(shù)據(jù))
parseInfo_now(client,1);
}else if(stat == 1){
parseInfo_fut(client,1);
}
}
else {
Serial.println(" connection failed!");
if (stat == 0){
// 利用ArduinoJson庫(kù)解析心知天氣響應(yīng)信息(實(shí)時(shí)數(shù)據(jù))
parseInfo_now(clientNULL,0);
}else if(stat == 1){
parseInfo_fut(clientNULL,0);
}
}
//斷開客戶端與服務(wù)器連接工作
client.stop();
}
// 連接WiFi
void connectWiFi(){
WiFi.begin(ssid, password); // 啟動(dòng)網(wǎng)絡(luò)連接
Serial.print("Connecting to "); // 串口監(jiān)視器輸出網(wǎng)絡(luò)連接信息
Serial.print(ssid); Serial.println(" ..."); // 告知用戶NodeMCU正在嘗試WiFi連接
int i = 0; // 這一段程序語(yǔ)句用于檢查WiFi是否連接成功
while (WiFi.status() != WL_CONNECTED) { // WiFi.status()函數(shù)的返回值是由NodeMCU的WiFi連接狀態(tài)所決定的。
delay(1000); // 如果WiFi連接成功則返回值為WL_CONNECTED
Serial.print(i++); Serial.print(' '); // 此處通過While循環(huán)讓NodeMCU每隔一秒鐘檢查一次WiFi.status()函數(shù)返回值
} // 同時(shí)NodeMCU將通過串口監(jiān)視器輸出連接時(shí)長(zhǎng)讀秒。
// 這個(gè)讀秒是通過變量i每隔一秒自加1來實(shí)現(xiàn)的。
Serial.println(""); // WiFi連接成功后
Serial.println("Connection established!"); // NodeMCU將通過串口監(jiān)視器輸出"連接成功"信息。
Serial.print("IP address: "); // 同時(shí)還將輸出NodeMCU的IP地址。這一功能是通過調(diào)用
Serial.println(WiFi.localIP()); // WiFi.localIP()函數(shù)來實(shí)現(xiàn)的。該函數(shù)的返回值即NodeMCU的IP地址。
}
// 利用ArduinoJson庫(kù)解析心知天氣響應(yīng)信息(實(shí)時(shí))
void parseInfo_now(WiFiClient client,int i){
if(i==1){
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"
// 通過串口監(jiān)視器顯示以上信息
String results_0_now_text_str = results_0_now["text"].as< String >();
int results_0_now_code_int = results_0_now["code"].as< int >();
int results_0_now_temperature_int = results_0_now["temperature"].as< int >();
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.println(results_0_now_temperature_int);
Serial.print(F("Last Update: "));
Serial.println(results_0_last_update_str);
Serial.println(F("========================"));
display_0(results_0_now_temperature_int,results_0_now_text_str);
results_0_now_text_str_old = results_0_now_text_str;
results_0_now_temperature_int_old = results_0_now_temperature_int;
}
else{
display_0(results_0_now_temperature_int_old,results_0_now_text_str_old);
}
}
//----------輸出實(shí)時(shí)天氣----------
void display_0(int results_0_now_temperature_int,String results_0_now_text_str){
//顯示輸出
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_wqy16_t_gb2312);
u8g2.setCursor(15, 14);
u8g2.print("上海實(shí)時(shí)天氣");
u8g2.setFont(u8g2_font_logisoso24_tr);
u8g2.setCursor(45, 44);
u8g2.print(results_0_now_temperature_int);
u8g2.setCursor(15, 61);
u8g2.setFont(u8g2_font_unifont_t_chinese2);
u8g2.print(results_0_now_text_str);
u8g2.sendBuffer();
}
// 利用ArduinoJson庫(kù)解析心知天氣響應(yīng)信息(預(yù)測(cè))
void parseInfo_fut(WiFiClient client,int i){
if(i==1){
const size_t capacity = JSON_ARRAY_SIZE(1) + JSON_ARRAY_SIZE(3) + JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(6) + 3*JSON_OBJECT_SIZE(14) + 860;
DynamicJsonDocument doc(capacity);
deserializeJson(doc, client);
JsonObject results_0 = doc["results"][0];
JsonArray results_0_daily = results_0["daily"];
JsonObject results_0_daily_0 = results_0_daily[0];
const char* results_0_daily_0_date = results_0_daily_0["date"];
const char* results_0_daily_0_text_day = results_0_daily_0["text_day"];
const char* results_0_daily_0_code_day = results_0_daily_0["code_day"];
const char* results_0_daily_0_text_night = results_0_daily_0["text_night"];
const char* results_0_daily_0_code_night = results_0_daily_0["code_night"];
const char* results_0_daily_0_high = results_0_daily_0["high"];
const char* results_0_daily_0_low = results_0_daily_0["low"];
const char* results_0_daily_0_rainfall = results_0_daily_0["rainfall"];
const char* results_0_daily_0_precip = results_0_daily_0["precip"];
const char* results_0_daily_0_wind_direction = results_0_daily_0["wind_direction"];
const char* results_0_daily_0_wind_direction_degree = results_0_daily_0["wind_direction_degree"];
const char* results_0_daily_0_wind_speed = results_0_daily_0["wind_speed"];
const char* results_0_daily_0_wind_scale = results_0_daily_0["wind_scale"];
const char* results_0_daily_0_humidity = results_0_daily_0["humidity"];
JsonObject results_0_daily_1 = results_0_daily[1];
const char* results_0_daily_1_date = results_0_daily_1["date"];
const char* results_0_daily_1_text_day = results_0_daily_1["text_day"];
const char* results_0_daily_1_code_day = results_0_daily_1["code_day"];
const char* results_0_daily_1_text_night = results_0_daily_1["text_night"];
const char* results_0_daily_1_code_night = results_0_daily_1["code_night"];
const char* results_0_daily_1_high = results_0_daily_1["high"];
const char* results_0_daily_1_low = results_0_daily_1["low"];
const char* results_0_daily_1_rainfall = results_0_daily_1["rainfall"];
const char* results_0_daily_1_precip = results_0_daily_1["precip"];
const char* results_0_daily_1_wind_direction = results_0_daily_1["wind_direction"];
const char* results_0_daily_1_wind_direction_degree = results_0_daily_1["wind_direction_degree"];
const char* results_0_daily_1_wind_speed = results_0_daily_1["wind_speed"];
const char* results_0_daily_1_wind_scale = results_0_daily_1["wind_scale"];
const char* results_0_daily_1_humidity = results_0_daily_1["humidity"];
JsonObject results_0_daily_2 = results_0_daily[2];
const char* results_0_daily_2_date = results_0_daily_2["date"];
const char* results_0_daily_2_text_day = results_0_daily_2["text_day"];
const char* results_0_daily_2_code_day = results_0_daily_2["code_day"];
const char* results_0_daily_2_text_night = results_0_daily_2["text_night"];
const char* results_0_daily_2_code_night = results_0_daily_2["code_night"];
const char* results_0_daily_2_high = results_0_daily_2["high"];
const char* results_0_daily_2_low = results_0_daily_2["low"];
const char* results_0_daily_2_rainfall = results_0_daily_2["rainfall"];
const char* results_0_daily_2_precip = results_0_daily_2["precip"];
const char* results_0_daily_2_wind_direction = results_0_daily_2["wind_direction"];
const char* results_0_daily_2_wind_direction_degree = results_0_daily_2["wind_direction_degree"];
const char* results_0_daily_2_wind_speed = results_0_daily_2["wind_speed"];
const char* results_0_daily_2_wind_scale = results_0_daily_2["wind_scale"];
const char* results_0_daily_2_humidity = results_0_daily_2["humidity"];
const char* results_0_last_update = results_0["last_update"];
// 從以上信息中摘選幾個(gè)通過串口監(jiān)視器顯示
String results_0_daily_0_date_str = results_0_daily_0["date"].as< String >();
String results_0_daily_0_text_day_str = results_0_daily_0["text_day"].as< String >();
int results_0_daily_0_code_day_int = results_0_daily_0["code_day"].as< int >();
String results_0_daily_0_text_night_str = results_0_daily_0["text_night"].as< String >();
int results_0_daily_0_code_night_int = results_0_daily_0["code_night"].as< int >();
int results_0_daily_0_high_int = results_0_daily_0["high"].as< int >();
int results_0_daily_0_low_int = results_0_daily_0["low"].as< int >();
String results_0_last_update_str = results_0["last_update"].as< String >();
int results_0_daily_1_high_int = results_0_daily_1["high"].as< int >();
int results_0_daily_1_low_int = results_0_daily_1["low"].as< int >();
String results_0_daily_1_text_day_str = results_0_daily_1["text_day"].as< String >();
Serial.println(F("======Today Weahter ======="));
Serial.print(F("DATE: "));
Serial.println(results_0_daily_0_date_str);
Serial.print(F("Day Weather: "));
Serial.print(results_0_daily_0_text_day_str);
Serial.print(F(" "));
Serial.println(results_0_daily_0_code_day_int);
Serial.print(F("Night Weather: "));
Serial.print(results_0_daily_0_text_night_str);
Serial.print(F(" "));
Serial.println(results_0_daily_0_code_night_int);
Serial.print(F("High: "));
Serial.println(results_0_daily_0_high_int);
Serial.print(F("LOW: "));
Serial.println(results_0_daily_0_low_int);
Serial.print(F("Last Update: "));
Serial.println(results_0_last_update_str);
Serial.println(F("=============================="));
display_1(results_0_daily_1_high_int,results_0_daily_1_low_int,results_0_daily_1_text_day_str);
results_0_daily_1_high_int_old=results_0_daily_1_high_int;
results_0_daily_1_low_int_old=results_0_daily_1_low_int;
results_0_daily_1_text_day_str_old=results_0_daily_1_text_day_str;
}else{
display_1(results_0_daily_1_high_int_old,results_0_daily_1_low_int_old,results_0_daily_1_text_day_str_old);
}
}
//----------預(yù)測(cè)明天天氣----------
void display_1(int results_0_daily_1_high_int,int results_0_daily_1_low_int,String results_0_daily_1_text_day_str){
//顯示輸出
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_wqy16_t_gb2312);
u8g2.setCursor(15, 14);
u8g2.print("上海明天天氣");
u8g2.setFont(u8g2_font_logisoso24_tr);
u8g2.setCursor(20, 46);
u8g2.print(results_0_daily_1_low_int);
u8g2.setCursor(56, 46);
u8g2.print("~");
u8g2.setCursor(75, 46);
u8g2.print(results_0_daily_1_high_int);
u8g2.setCursor(30, 62);
u8g2.setFont(u8g2_font_unifont_t_chinese2);
u8g2.print(results_0_daily_1_text_day_str);
u8g2.sendBuffer();
}
/*-------- NTP 代碼 ----------*/
const int NTP_PACKET_SIZE = 48; // NTP時(shí)間在消息的前48個(gè)字節(jié)里
byte packetBuffer[NTP_PACKET_SIZE]; // 輸入輸出包的緩沖區(qū)
time_t getNtpTime()
{
IPAddress ntpServerIP; // NTP服務(wù)器的地址
while (Udp.parsePacket() > 0)
; // 丟棄以前接收的任何數(shù)據(jù)包
Serial.println("Transmit NTP Request");
// 從池中獲取隨機(jī)服務(wù)器
WiFi.hostByName(ntpServerName, ntpServerIP);
Serial.print(ntpServerName);
Serial.print(": ");
Serial.println(ntpServerIP);
sendNTPpacket(ntpServerIP);
uint32_t beginWait = millis();
while (millis() - beginWait < 1500)
{
int size = Udp.parsePacket();
if (size >= NTP_PACKET_SIZE)
{
Serial.println("Receive NTP Response");
isNTPConnected = true;
Udp.read(packetBuffer, NTP_PACKET_SIZE); // 將數(shù)據(jù)包讀取到緩沖區(qū)
unsigned long secsSince1900;
// 將從位置40開始的四個(gè)字節(jié)轉(zhuǎn)換為長(zhǎng)整型,只取前32位整數(shù)部分
secsSince1900 = (unsigned long)packetBuffer[40] < < 24;
secsSince1900 |= (unsigned long)packetBuffer[41] < < 16;
secsSince1900 |= (unsigned long)packetBuffer[42] < < 8;
secsSince1900 |= (unsigned long)packetBuffer[43];
Serial.println(secsSince1900);
Serial.println(secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR);
return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR;
}
}
Serial.println("No NTP Response :-("); //無(wú)NTP響應(yīng)
isNTPConnected = false;
return 0; //如果未得到時(shí)間則返回0
}
// 向給定地址的時(shí)間服務(wù)器發(fā)送NTP請(qǐng)求
void sendNTPpacket(IPAddress &address)
{
memset(packetBuffer, 0, NTP_PACKET_SIZE);
packetBuffer[0] = 0b11100011; // LI, Version, Mode
packetBuffer[1] = 0; // Stratum, or type of clock
packetBuffer[2] = 6; // Polling Interval
packetBuffer[3] = 0xEC; // Peer Clock Precision
// 8 bytes of zero for Root Delay & Root Dispersion
packetBuffer[12] = 49;
packetBuffer[13] = 0x4E;
packetBuffer[14] = 49;
packetBuffer[15] = 52;
Udp.beginPacket(address, 123); //NTP需要使用的UDP端口號(hào)為123
Udp.write(packetBuffer, NTP_PACKET_SIZE);
Udp.endPacket();
}
void oledClockDisplay()
{
int years, months, days, hours, minutes, seconds, weekdays;
years = year();
months = month();
days = day();
hours = hour();
minutes = minute();
seconds = second();
weekdays = weekday();
Serial.printf("%d/%d/%d %d:%d:%d Weekday:%dn", years, months, days, hours, minutes, seconds, weekdays);
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_unifont_t_chinese2);
u8g2.setCursor(0, 14);
if (isNTPConnected)
{
if(timeZone >=0)
{
u8g2.print("當(dāng)前時(shí)間(UTC+");
u8g2.print(timeZone);
u8g2.print(")");
}
else
{
u8g2.print("當(dāng)前時(shí)間(UTC");
u8g2.print(timeZone);
u8g2.print(")");
}
}
else
u8g2.print("無(wú)網(wǎng)絡(luò)!"); //如果上次對(duì)時(shí)失敗,則會(huì)顯示無(wú)網(wǎng)絡(luò)
String currentTime = "";
if (hours < 10)
currentTime += 0;
currentTime += hours;
currentTime += ":";
if (minutes < 10)
currentTime += 0;
currentTime += minutes;
currentTime += ":";
if (seconds < 10)
currentTime += 0;
currentTime += seconds;
String currentDay = "";
currentDay += years;
currentDay += "/";
if (months < 10)
currentDay += 0;
currentDay += months;
currentDay += "/";
if (days < 10)
currentDay += 0;
currentDay += days;
u8g2.setFont(u8g2_font_logisoso24_tr);
u8g2.setCursor(0, 44);
u8g2.print(currentTime);
u8g2.setCursor(0, 61);
u8g2.setFont(u8g2_font_unifont_t_chinese2);
u8g2.print(currentDay);
u8g2.drawXBM(80, 48, 16, 16, xing);
u8g2.setCursor(95, 62);
u8g2.print("期");
if (weekdays == 1)
u8g2.print("日");
else if (weekdays == 2)
u8g2.print("一");
else if (weekdays == 3)
u8g2.print("二");
else if (weekdays == 4)
u8g2.print("三");
else if (weekdays == 5)
u8g2.print("四");
else if (weekdays == 6)
u8g2.print("五");
else if (weekdays == 7)
u8g2.drawXBM(111, 49, 16, 16, liu);
u8g2.sendBuffer();
}
實(shí)現(xiàn)效果如下
轉(zhuǎn)載請(qǐng)注明出處,感謝!
審核編輯 黃宇
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
-
OLED
+關(guān)注
關(guān)注
120文章
6285瀏覽量
228029 -
時(shí)鐘
+關(guān)注
關(guān)注
11文章
1898瀏覽量
133199 -
Arduino
+關(guān)注
關(guān)注
190文章
6498瀏覽量
192095 -
ESP8266
+關(guān)注
關(guān)注
51文章
965瀏覽量
47392
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
熱點(diǎn)推薦
ESP8266燒錄與機(jī)智云一鍵配網(wǎng)教程
ESP8266模塊因其低成本和高性能,廣泛應(yīng)用于智能家居和工業(yè)自動(dòng)化等領(lǐng)域。機(jī)智云平臺(tái)提供了一鍵配網(wǎng)功能,簡(jiǎn)化了設(shè)備的聯(lián)網(wǎng)過程。本教程將詳細(xì)介紹如何使用ESP8266進(jìn)行燒錄,并通過機(jī)智云實(shí)現(xiàn)一鍵配

【RA-Eco-RA4M2開發(fā)板評(píng)測(cè)】RA4M2 + ESP8266獲取城市天氣預(yù)報(bào)(二)使用串口助手獲取天氣+破解任意類型AT指令
的AT指令了,同時(shí),基于這個(gè)原理,我展示了用另外一種方法來獲取天氣預(yù)報(bào)信息數(shù)據(jù),并在窗口調(diào)試助手上顯示出來。
打開原理圖,用到的串口如下圖所示:
這個(gè)連接ESP8266或者任意其它的藍(lán)牙模塊
這個(gè)
發(fā)表于 05-04 10:07
【RA-Eco-RA4M2開發(fā)板評(píng)測(cè)】RA4M2 + ESP8266獲取城市天氣預(yù)報(bào)(一)
很高興收到瑞薩電子的RA4M2開發(fā)板,有幸成為了幸運(yùn)觀眾,本期就來使用瑞薩的RA4M2開發(fā)板通過串口連接WIFI模塊ESP8266,獲取天氣預(yù)報(bào)數(shù)據(jù)信息。并實(shí)時(shí)顯示出來。它可以獲取國(guó)內(nèi)任何城市
發(fā)表于 05-02 14:28
arduino(1)--ESP8266配置
之后在打開開發(fā)板管理器。
之后輸入esp8266,安裝對(duì)應(yīng)的庫(kù)文件,因?yàn)槲乙呀?jīng)安裝,故顯示為灰色,由于網(wǎng)絡(luò)原因,下載的時(shí)間可能比較久。
安裝完畢之后,選擇Generic ESP8266
發(fā)表于 09-06 11:00
esp32和esp8266代碼共用嗎
本文將介紹ESP32和ESP8266兩款流行的微控制器在代碼共用性方面的可能性與差異性。 一、引言 隨著物聯(lián)網(wǎng)技術(shù)的飛速發(fā)展,越來越多的智能設(shè)備開始進(jìn)入我們的生活。其中,ESP32和ESP82
esp8266和esp32區(qū)別是什么
以下是關(guān)于ESP8266和ESP32的主要區(qū)別: 處理器和架構(gòu) : ESP8266 :使用一個(gè)Tensilica L106 80MHz的處理器,屬于Xtensa架構(gòu)。 ESP32 :使
ESP8266需要燒錄固件庫(kù)嘛
需要。ESP8266是一款非常流行的Wi-Fi模塊,廣泛應(yīng)用于物聯(lián)網(wǎng)項(xiàng)目中。它具有低成本、低功耗、易于編程等特點(diǎn),因此受到了許多開發(fā)者的喜愛。在開發(fā)ESP8266項(xiàng)目時(shí),燒錄固件庫(kù)是一個(gè)非常重要
esp8266不燒錄可以使用嗎
ESP8266是一款非常流行的Wi-Fi模塊,廣泛應(yīng)用于物聯(lián)網(wǎng)項(xiàng)目中。然而,如果不進(jìn)行燒錄,ESP8266將無(wú)法正常工作。 1. ESP8266簡(jiǎn)介 ESP8266是一款由Espres
esp8266wifi模塊怎么連接手機(jī)
ESP8266 : 使用USB轉(zhuǎn)TTL模塊將ESP8266模塊與電腦連接。 通過串口調(diào)試助手發(fā)送AT指令配置ESP8266,包括設(shè)置WiFi模式為STA模式(客戶端模式),連接指定的WiFi網(wǎng)
Arduino Nano 和 NodeMCU ESP8266 讀取 DHT11 環(huán)境溫濕度數(shù)據(jù)及 OLED顯示
Arduino Nano 和 NodeMCU ESP8266 讀取 DHT11 環(huán)境溫濕度數(shù)據(jù)及 OLED顯示

是否可以創(chuàng)建一個(gè)包含多個(gè)esp8266模塊(esp-01)的網(wǎng)狀網(wǎng)絡(luò)?
我想知道是否可以創(chuàng)建一個(gè)包含多個(gè) esp8266 模塊(esp-01)的網(wǎng)狀網(wǎng)絡(luò)。如果是這樣,是否有任何指南/示例可以開始使用 esp8266 進(jìn)行網(wǎng)狀
發(fā)表于 07-19 08:31
如何讓W(xué)indows 8自動(dòng)連接到ESP8266?
有沒有辦法讓 Windows 8 自動(dòng)連接到ESP8266,而不考慮同一臺(tái) PC 中的有線以太網(wǎng)連接?
我還注意到,由于每個(gè)頁(yè)面之前都會(huì)暫停,連接到ESP8266使我的以太網(wǎng)互聯(lián)網(wǎng)變
發(fā)表于 07-18 08:08
為什么無(wú)法連接到ESP8266作為接入點(diǎn)?
我將 ESP8266 用作接入點(diǎn),并且網(wǎng)絡(luò)對(duì)我的所有設(shè)備(PC、ios 手機(jī)、android 手機(jī))都是可見的。問題是當(dāng)我嘗試連接到ESP8266接入點(diǎn)時(shí),它會(huì)失敗。電腦每次都失敗,我
發(fā)表于 07-17 06:00
評(píng)論