原料


硬件:


ESP8266-12F CH340G版本 开发板1块
4线 iic OLEDQT0.96寸屏幕 1块
杜邦线 排针若干 烙铁等
数据线 1根
电脑能连互联网的 1台


软件:
环境: Arduino,已在文件-首选项里-开发板管理器,更新过esp8266库(存在网络问题的自行解决)
开发板USB转串口驱动:根据卖家提供或板载芯片型号自行搜索下载


资源:
主流程参考于(本文源码复制于该博文)利用ESP8266+OLED(I2C)打造智能时钟(网络校时+实时天气+天气预报)_下雪还是下雨的博客-CSDN博客_esp8266天气时钟
arduino软件资源https://www.arduino.cc/en/software,根据电脑系统下载对应版本,本贴W10X64
获取天气时钟资源api私钥本文以心知天气为例


目的
1、用于完善补充,做个学习笔记
2、实现开发板天气时钟功能
3、后续补充更多页面和天气源API的实现流程


实施步骤
1、准备好硬件
2、Arduino软件下载安装,在 文件-首选项里-开发板管理器,更新过esp8266开发板库

https://arduino.esp8266.com/stable/package_esp8266com_index.jsonhttps://arduino.esp8266.com/stable/package_esp8266com_index.json
2.1、根据开发板型号安装驱动,连上硬件,在设备管理器里找到com口确定已安装好驱动并连好硬件

OLED 显示模块 ESP8266开发板
GND G
VCC 3V
SCL D1
SDA D2

2.2、打开arduino 工具-开发板:“nod...” - ESP8266-BOARD.. - nodemcu1.0(ESP8266-12E MODULE),工具 -端口-选择开发板连接端口
3、获取天气时钟api私钥:打开心知天气首页注册,目前(2022.05.14)可以免费获取3个私钥,注册完后在首页 控制台-产品管理-免费版里可以看到私钥,复制好私钥备用
4、在arduino新建页面复制源代码


//引入必要的头文件如编译失败在库里搜索添加
#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数据包的本地端口//网络校时的相关配置
static const char ntpServerName[] = "ntp1.aliyun.com"; //NTP服务器,使用阿里云
int timeZone = 8; //时区设置,采用东8区//保存断网前的最新数据
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;//函数声明
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
{                  //存储配置结构体int tz;        //时间戳
} config_type;
config_type config;WiFiClient clientNULL;
DNSServer dnsServer;
ESP8266WebServer server(80);//----------WIFI连接配置----------
const char* ssid     = "wifi_name";       // 连接WiFi名(此处使用XXX为示例)
const char* password = "password";          // 连接WiFi密码(此处使用12345678为示例)// 请将您需要连接的WiFi密码填入引号中
//----------天气API配置----------
const char* host = "api.seniverse.com";   // 将要连接的服务器地址
const int httpPort = 80;              // 将要连接的服务器端口      // 心知天气HTTP请求所需信息
String reqUserKey = "XXXXXXXXXXXX";   // 私钥
String reqLocation = "changzhou";            // 城市 免费知心天气只支持地级
String reqUnit = "c";                      // 摄氏/华氏//----------设置屏幕----------
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/U8X8_PIN_NONE);
int sta = 0;
//----------初始化OLED----------
void initdisplay()
{u8g2.begin();u8g2.enableUTF8Print();
}
//----------用于获取实时天气的函数(0)----------
void TandW(){String reqRes = "/v3/weather/now.json?key=" + reqUserKey ++ "&location=" + reqLocation + "&language=en&unit=" +reqUnit;// 向心知天气服务器服务器请求信息并对信息进行解析httpRequest(reqRes,0);//延迟,需要低于20次/分钟delay(5000);
}
void display_1(int results_0_now_temperature_int,String results_0_now_text_str);//声明函数,用于显示温度、天气//----------获取3天预报(1)----------
void threeday(){// 建立心知天气API当前天气请求资源地址String reqRes = "/v3/weather/daily.json?key=" + reqUserKey ++ "&location=" + reqLocation + "&language=en&unit=" +reqUnit + "&start=0&days=3";// 向心知天气服务器服务器请求信息并对信息进行解析httpRequest(reqRes,1);delay(5000);
}void clock_display(time_t prevDisplay){server.handleClient();dnsServer.processNextRequest();if (timeStatus() != timeNotSet){if (now() != prevDisplay){ //时间改变时更新显示prevDisplay = now();oledClockDisplay();}}
}void setup(){Serial.begin(9600);          Serial.println("");initdisplay();// 连接WiFiu8g2.clearBuffer();u8g2.setFont(u8g2_font_unifont_t_chinese2);u8g2.setCursor(10, 20); //屏幕左上角原点第几列,第几行u8g2.print("waiting wifi"); //这里的文本内容中文支持不好,如改中文需要自定义字库u8g2.setCursor(10, 50);u8g2.print("searching ^_^");u8g2.sendBuffer();connectWiFi();Udp.begin(localPort);setSyncProvider(getNtpTime);setSyncInterval(300); //每300秒同步一次时间}time_t prevDisplay = 0; //当时钟已经显示void loop(){if (sta>=0 && sta<=250){clock_display(prevDisplay);}else if(sta == 251){TandW();}else{threeday();}++sta;if(sta==253){sta = 0;}
}// 向心知天气服务器服务器请求信息并对信息进行解析
void httpRequest(String reqRes,int stat){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.");}if (stat == 0){// 利用ArduinoJson库解析心知天气响应信息(实时数据)parseInfo_now(client,1); }else if(stat == 1){parseInfo_fut(client,1);}}else {Serial.println(" connection failed!");if (stat == 0){// 利用ArduinoJson库解析心知天气响应信息(实时数据)parseInfo_now(clientNULL,0); }else if(stat == 1){parseInfo_fut(clientNULL,0);}}//断开客户端与服务器连接工作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()函数返回值}                                            // 同时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_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" // 通过串口监视器显示以上信息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);}}
//----------输出实时天气----------
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("常州实时天气");u8g2.setFont(u8g2_font_logisoso24_tr);u8g2.setCursor(45, 44);u8g2.print(results_0_now_temperature_int);u8g2.setCursor(35, 61);u8g2.setFont(u8g2_font_unifont_t_chinese2);u8g2.print(results_0_now_text_str);u8g2.sendBuffer();
}// 利用ArduinoJson库解析心知天气响应信息(预测)
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"]; // 从以上信息中摘选几个通过串口监视器显示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);
}}
//----------预测明天天气----------
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时间在消息的前48个字节里
byte packetBuffer[NTP_PACKET_SIZE]; // 输入输出包的缓冲区time_t getNtpTime()
{IPAddress ntpServerIP; // NTP服务器的地址while (Udp.parsePacket() > 0); // 丢弃以前接收的任何数据包Serial.println("Transmit NTP Request");// 从池中获取随机服务器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); // 将数据包读取到缓冲区unsigned long secsSince1900;// 将从位置40开始的四个字节转换为长整型,只取前32位整数部分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 :-("); //无NTP响应isNTPConnected = false;return 0; //如果未得到时间则返回0
}// 向给定地址的时间服务器发送NTP请求
void sendNTPpacket(IPAddress &address)
{memset(packetBuffer, 0, NTP_PACKET_SIZE);packetBuffer[0] = 0b11100011; // LI, Version, ModepacketBuffer[1] = 0;          // Stratum, or type of clockpacketBuffer[2] = 6;          // Polling IntervalpacketBuffer[3] = 0xEC;       // Peer Clock Precision// 8 bytes of zero for Root Delay & Root DispersionpacketBuffer[12] = 49;packetBuffer[13] = 0x4E;packetBuffer[14] = 49;packetBuffer[15] = 52;Udp.beginPacket(address, 123); //NTP需要使用的UDP端口号为123Udp.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:%d\n", 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("现在时间(UTC+");u8g2.print(timeZone);u8g2.print(")");}else{u8g2.print("现在时间(UTC");u8g2.print(timeZone);u8g2.print(")");}}elseu8g2.print("离线数据!"); //如果上次对时失败,则会显示无网络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();
}

修改 wifi id密码、地区(地级市拼音)由于地级市面积较大,可用邻近其他地级市替代、输出地区的文字等(注意文字如中文,需要改中文字库见文末)
5、点击arduino的【✔】图标进行编译,不出意外此时会有各种缺少头文件的报错,不急,复制缺少的头文件名称不包含“.h”-项目-加载库-管理库粘贴名称 搜索安装,然后继续编译继续补充库
6、编译完成,点击【→】上传至开发板
7完成

------------------------------------------------

建议wifi选项用手机热点替代,必须使用2.4G频段,网上看到有一键配网的我后续研究研究
------------------------------------------------
本次笔记参考 博主:下雪还是下雨 太极创客

oled u8g2如何显示中文(实测有效)_KhalilDai的博客-CSDN博客_u8g2显示中文最近开始捣鼓esp8266模块和oled,照着网上的例子开始hello world,刚开始显示英文还没什么问题,后面想显示自定义的中文的时候,发现有些能显示有些不能。一开始觉得这很简单,照着网上的教程也有一个大概的思路,后来才发现,网上的教程说的都不是很清楚,稍微走了一点点弯路,记录下来给后来的朋友一个完整、详细、能成功的教程。环境:操作系统:win10ide:Arduino开发板:ESP8266显示器:0.96寸oled液晶屏引脚连接:1:D1–SOA 2:D2–SCL 3:3V3–VCChttps://blog.csdn.net/weixin_44395581/article/details/108608141

0.0.1 NODEMCU-ESP8266-12F VER 0.1CH340G开发版V3 4线oled0.96寸屏天气时钟日记相关推荐

  1. 全志android启动串口无打印,CSK.Blog-给MK802(USB大小的Android4.0小PC)引出串口信号,变成ARM开发版...

    最近忙各类事情,blog写的不系统,见谅. 这几天搞到了前不久被媒体宣传过的只有U盘大小的Android 4.0小PC.他的样子如下,使用HDMI接口连接显示器再外接一个usb键盘鼠标就能作为PC用了 ...

  2. 荣耀 6p android 5.0,荣耀6/6Plus更新EMUI 5.6.1开发版

    6月1日,华为EMUI推送了5.6.1开发版的系统更新,此更新适用于荣耀6.荣耀6plus两款机型,这次版本发布并非仅面向内测用户,全体6/6 Plus用户,只要愿意尝鲜体验,均可到EMUI官网( h ...

  3. 乐鑫esp8266学习rtos3.0笔记:仅1M flash 的安信可 ESP-01S 模块,如何二次开发?如何对其 OTA 远程升级固件!

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. Esp8266之 搭建开发环境,开始一个" ...

  4. 乐鑫esp8266学习rtos3.0笔记第3篇: 一篇文章带你搞掂存储技术 NVS 的认识和使用,如何利用NVS保存整型、字符串、数组以及结构体。(附带demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. Esp8266之 搭建开发环境,开始一个" ...

  5. 乐鑫esp8266学习rtos3.0笔记第5篇:基于乐鑫idf框架,研究出超稳定、掉线重连、解决内存泄露问题的Mqtt框架,支持esp8266和esp32!(附带链接)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. Esp8266之 搭建开发环境,开始一个" ...

  6. 乐鑫esp8266学习rtos3.0笔记第12篇:无需外网,如何实现在本地局域网与控制端做数据交换,分享开发心得。(附带demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. Esp8266之 搭建开发环境,开始一个" ...

  7. 乐鑫esp8266学习rtos3.0笔记:esp产品 如何从外部读取 csv 文件的数据,比如从代码读取外部文件阿里云三元组。(附带demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. Esp8266之 搭建开发环境,开始一个" ...

  8. 小米5 android 7.0 rom,小米5升级安卓7.0 小米5刷安卓7.0教程

    小米5怎么升级安卓7.0?小米5可以升级安卓7.0了,有些米粉还不会,其实很简单,rom基地小编今天就带来小米5刷安卓7.0教程,一起来了解下吧! 小米5刷安卓7.0教程: 在经历了一段时间的内测之后 ...

  9. 小米5怎样升级android,小米5开发版怎么升级Android 7.0?小米5开发版升级Android 7.0教程...

    Android 7.0系统已经陆续推送,今天小米5手机的Android 7.0终于公测了,虽然只限于开发版,但是小伙伴们总算有盼头了!小米5开发版怎么升级Android 7.0?下面小编为大家带来小米 ...

最新文章

  1. python 中类属性共享问题
  2. Ubuntu 12.04安装NFS server
  3. python从入门到放弃图片大全-Python 从入门到放弃(一)
  4. [Spring cloud 一步步实现广告系统] 18. 查询返回广告创意
  5. 浅析“字典--NSDirctionary”理论
  6. java第三章_【Java】第三章 变量
  7. 新一代的编译工具 SWC,97年小哥写的~
  8. 聚类算法:K-Means
  9. jquery-ui寺
  10. 两个网站:借物网,rss交流网站opml.cn
  11. oracle+性能负载查看,Oracle 11g数据库重放教程(二):负载重放基本实例讲解-性能调优-Oracle频道-中国IT实验室...
  12. dw1510_超低温种子储存柜
  13. 如何复制百度文库里面的文章
  14. 【Python-神经网络预测】
  15. FigDraw 8. SCI 文章绘图之饼图 (Pieplot)
  16. java detach_java – Spring JpaRepository – Detach和Attach实体
  17. 每日一学20——凉鞋的简易消息机制
  18. 微信支付密码设置html,微信支付页面怎么加密码锁屏(微信支付界面怎么上锁)...
  19. micropython webrepl_通过EMP来设置MicroPython开机WIFI连接和WebREPL
  20. 微信小程序开发:自定义组件-behaviors

热门文章

  1. 深信服下一代防火墙介绍
  2. 3D human skeleton 数据集简易可视化
  3. 菜鸟学习OGRE和天龙八部之五: 水面TerrainLiquid基本搞定
  4. matlab通信工具comm,MATLAB通信工具箱之comm.ErrorRate
  5. PXI和LXI平台如何选择?
  6. 最长公共子序列-动态规划-python
  7. 链表就地逆置Java_单链表就地逆置(Java版)
  8. 运行gitbook init命令报错及问题解决办法 TypeError [ERR_INVALID_ARG_TYPE]: The “data“ argument must be of type stri
  9. 计算机系 礼物,湖大19个学院毕业礼物聚齐了,全都是用心爱你的模样!
  10. 第一个项目单个交换机接入网络