|
爱科技、爱创意、爱折腾、爱极致,我们都是技术控
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 zongher 于 2021-9-3 21:32 编辑
简单写点分享给大家,避免大家少走一些弯路。
我买了5个,想无损拆卸基本不可能,我试过各种办法,可能技不如人!
卖家提供接线图不一定正确;
//IO4=红灯,16=绿灯,14继电器,13按键(实测为5)
#define PIN_KEY 5
#define PIN_Relay 14
#define PIN_LedRed 4
#define PIN_LedGreen 16
例如按键就不对,我实测按键引脚为GPIO5,其他都是正确的。
ESP8266或ESP32的IO0口接地(GND)时上电,会进入下载固件模式,不接地(悬空)进入正常模式。
TX接下载器RX。RX接下载器TX。(下载器一般是TTL转USB,例如常见的CH340系列,淘宝五块钱,没有不能下载程序)
先放出代码,支持天猫精灵,长按进入智能配网。
以下使用的是arduino IDE代码,参考的是B站:Esp8266接入阿里云_天猫精灵_云智能APP_控制LED_插座_哔哩哔哩_bilibili
- #include <ESP8266WiFi.h> //安装esp8266arduino开发环境
- static WiFiClient espClient;
- #include <ArduinoJson.h>
- #include <WiFiUdp.h>
- #include <ArduinoOTA.h>
- #include <EEPROM.h> //导入Flash库文件
- #include <AliyunIoTSDK.h> //引入阿里云 IoT SDK,需要安装crypto库、PubSubClient库
- AliyunIoTSDK iot;
- //设置产品和设备的信息,从阿里云设备信息里查看
- <font color="#ff0000">#define PRODUCT_KEY "" //替换自己的PRODUCT_KEY
- #define DEVICE_NAME "" //替换自己的DEVICE_NAME
- #define DEVICE_SECRET "" //替换自己的DEVICE_SECRET</font>
- #define REGION_ID "cn-shanghai" //默认cn-shanghai
- //IO4=红灯,16=绿灯,14继电器,13按键(实测为5)
- #define PIN_KEY 5
- #define PIN_Relay 14
- #define PIN_LedRed 4
- #define PIN_LedGreen 16
- #include <OneButton.h>
- OneButton button(PIN_KEY,true);// true:按下为低电平; false : 按下为高电平;不设置时默认值为:true
- bool WIFI_Status = false;//是否联网标识
- unsigned long lastMsMain = 0;
- String ssid;
- String psw;
- struct config_type{
- char stassid[32];//定义配网得到的WIFI名长度(最大32字节)
- char stapsw[64];//定义配网得到的WIFI密码长度(最大64字节)
- };
- config_type config;//声明定义内容
- void saveConfig(){//保存函数
- EEPROM.begin(1024);//向系统申请1024 ROM
- //开始写入
- uint8_t *p = (uint8_t*)(&config);
- for (int i = 0; i < sizeof(config); i++){
- EEPROM.write(i, *(p + i)); //在闪存内模拟写入
- }
- EEPROM.commit();//执行写入ROM
- }
- void loadConfig(){//读取函数
- EEPROM.begin(1024);
- uint8_t *p = (uint8_t*)(&config);
- for (int i = 0; i < sizeof(config); i++) {
- *(p + i) = EEPROM.read(i);
- }
- EEPROM.commit();
- ssid = config.stassid;
- psw = config.stapsw;
- }
- /* 智能配网 */
- void smartConfig(){
- WiFi.mode(WIFI_STA);//设置STA模式
- Serial.println("\r\nWait for Smartconfig...");//打印log信息
- WiFi.beginSmartConfig();//开始SmartConfig,等待手机端发出用户名和密码
- while(1){
- Serial.println(".");
- digitalWrite(PIN_LedGreen,LOW);//指示灯闪烁
- delay(600);
- digitalWrite(PIN_LedGreen,HIGH);//指示灯闪烁
- delay(600);
- if(WiFi.smartConfigDone()){//配网成功,接收到SSID和密码
- WIFI_Status = true;
- Serial.println("SmartConfig Success");
- Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());
- Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
- strcpy(config.stassid,WiFi.SSID().c_str());//名称复制
- strcpy(config.stapsw,WiFi.psk().c_str());//密码复制
- saveConfig();//调用保存函数
- WiFi.setAutoConnect(true); // 设置自动连接
- break;
- }
- }
- }
- /*连接网络*/
- void wifiConnect(){
- Serial.println("\r\n正在连接WIFI...");
- loadConfig();//读取ROM是否包含密码
- if(ssid!=0&&psw!=0){//判断ROM是否有密码
- WiFi.begin(ssid,psw);//如果有密码则自动连接
- while(WiFi.status()!= WL_CONNECTED){
- Serial.print(".");
- digitalWrite(PIN_LedGreen, LOW);
- delay(100);
- digitalWrite(PIN_LedGreen, HIGH);
- delay(100);
- button.tick();//加入按钮检测
- }
- }else{
- smartConfig();//如果ROM没有密码则自动进入配网模式
- }
- WIFI_Status = true;
- Serial.println("连接成功");
- Serial.print("IP:");
- Serial.println(WiFi.localIP());
- }
- void btnclick(){
- digitalWrite(PIN_Relay, !digitalRead(PIN_Relay));
- }
- void doubleclick(){
- digitalWrite(PIN_LedGreen, !digitalRead(PIN_LedGreen));
- }
- void longclick(){
- if(WIFI_Status){
-
- }else{
- Serial.println("smartConfig...");
- smartConfig();
- }
- }
- void setup() {
- Serial.begin(115200);
- pinMode(PIN_LedRed,OUTPUT);
- pinMode(PIN_LedGreen,OUTPUT);
- pinMode(PIN_Relay, OUTPUT);
- pinMode(PIN_Relay, OUTPUT);
- digitalWrite(PIN_Relay, LOW);
- digitalWrite(PIN_LedRed,HIGH);
- digitalWrite(PIN_LedGreen,HIGH);
- button.reset();
- button.setDebounceTicks(80);//设置消抖时长为80毫秒,默认值为:50毫秒
- button.setClickTicks(500);//设置单击时长为500毫秒,默认值为:400毫秒
- button.setPressTicks(1000);//设置长按时长为1000毫秒,默认值为:800毫秒
- button.attachClick(btnclick);
- button.attachDoubleClick(doubleclick);
- button.attachLongPressStart(longclick);
- //开始连接WiFi
- wifiConnect();
-
- //初始化 iot,需传入 wifi 的 client,和设备产品信息
- AliyunIoTSDK::begin(espClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET, REGION_ID);
- //绑定一个设备属性回调,当远程修改此属性,会触发powerstate函数;天猫精灵控制的就是powerstate的高低电平(高 = 1,低 = 0)
- AliyunIoTSDK::bindData("powerstate", powerstate);
- //绑定一个设备属性回调,当远程修改此属性,会触发allPowerstate函数
- AliyunIoTSDK::bindData("allPowerstate", allPowerstate);
- ArduinoOTA.onStart([]() {
- String type;
- if (ArduinoOTA.getCommand() == U_FLASH) {
- type = "sketch";
- } else { // U_FS
- type = "filesystem";
- }
- // NOTE: if updating FS this would be the place to unmount FS using FS.end()
- Serial.println("Start updating " + type);
- });
- ArduinoOTA.onEnd([]() {
- Serial.println("\nEnd");
- });
- ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
- Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
- });
- ArduinoOTA.onError([](ota_error_t error) {
- Serial.printf("Error[%u]: ", error);
- if (error == OTA_AUTH_ERROR) {
- Serial.println("Auth Failed");
- } else if (error == OTA_BEGIN_ERROR) {
- Serial.println("Begin Failed");
- } else if (error == OTA_CONNECT_ERROR) {
- Serial.println("Connect Failed");
- } else if (error == OTA_RECEIVE_ERROR) {
- Serial.println("Receive Failed");
- } else if (error == OTA_END_ERROR) {
- Serial.println("End Failed");
- }
- });
- ArduinoOTA.begin();
- Serial.println("Ready");
- Serial.print("IP address: ");
- Serial.println(WiFi.localIP());
- }
- void loop() {
- button.tick();
-
- if(WIFI_Status){//已经联网
- AliyunIoTSDK::loop(); //必要函数
- if (millis() - lastMsMain >= 2000){//发送数据的间隔,2秒发送一次,“云智能APP”上电源按钮的UI实时显示会有2秒延时。
- ArduinoOTA.handle();
- lastMsMain = millis();
- //发送电源状态到云平台(高电平:1;低电平:0)
- AliyunIoTSDK::send("powerstate", digitalRead(PIN_Relay));
- AliyunIoTSDK::send("allPowerstate", digitalRead(PIN_Relay));
- }
- delay(100);
- }else{//未联网
- wifiConnect();//一直请求联网,绿灯快闪
- }
- if(digitalRead(PIN_LedRed) == digitalRead(PIN_Relay)){//同步灯的状态,灯低电平点亮
- digitalWrite(PIN_LedRed,!digitalRead(PIN_Relay));
- }
- delay(100);
- }
- //电源的属性修改的回调函数1
- void powerstate(JsonVariant L)//固定格式,修改参数l
- {
- int powerstate = L["powerstate"];//参数l
- if (powerstate == 0){
- digitalWrite(PIN_Relay, LOW);
- }else{
- digitalWrite(PIN_Relay, HIGH);
- }
- Serial.printf("收到的powerstate是:"); Serial.println(powerstate);
- }
- //电源的属性修改的回调函数2
- void allPowerstate(JsonVariant L)//固定格式,修改参数2
- {
- int allPowerstate = L["allPowerstate"];//参数2
- if (allPowerstate == 0){
- digitalWrite(PIN_Relay, LOW);
- }else{
- digitalWrite(PIN_Relay, HIGH);
- }
- Serial.printf("收到的allPowerstate是:"); Serial.println(allPowerstate);
- }
复制代码
以上是完整代码,需要自己按照B站教程提供一些API接口。
上传需要按以下设置。此MCU型号为ESP8266 16MBIT字节(需要除以8才是我们一般认为的空间,约2M空间),有足够的空间塞下OTA代码。
OTA:空中升级,就是只需要WIFI就能给固件升级,无需下载器,但前提是用下载器先刷入OTA类固件。
以后刷写固件就不需要链接电脑,只需要插上插座就可以更新固件了。
如果你的flash size设置和我不一样,你需要修改
“C:\Users\Administrator\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.1\boards.txt”
这个文件,查找:
往下找几行。以下地方
nodemcuv2.build.flash_mode=dio
nodemcuv2.build.flash_flags=-DFLASHMODE_DIO
nodemcuv2.build.flash_freq=40###############从这里开始粘贴########################
nodemcuv2.menu.eesz.1M64=1MB (FS:64KB OTA:~470KB)
nodemcuv2.menu.eesz.1M64.build.flash_size=1M
nodemcuv2.menu.eesz.1M64.build.flash_size_bytes=0x100000
nodemcuv2.menu.eesz.1M64.build.flash_ld=eagle.flash.1m64.ld
nodemcuv2.menu.eesz.1M64.build.spiffs_pagesize=256
nodemcuv2.menu.eesz.1M64.upload.maximum_size=958448
nodemcuv2.menu.eesz.1M64.build.rfcal_addr=0xFC000
nodemcuv2.menu.eesz.1M64.build.spiffs_start=0xEB000
nodemcuv2.menu.eesz.1M64.build.spiffs_end=0xFB000
nodemcuv2.menu.eesz.1M64.build.spiffs_blocksize=4096
nodemcuv2.menu.eesz.1M128=1MB (FS:128KB OTA:~438KB)
nodemcuv2.menu.eesz.1M128.build.flash_size=1M
nodemcuv2.menu.eesz.1M128.build.flash_size_bytes=0x100000
nodemcuv2.menu.eesz.1M128.build.flash_ld=eagle.flash.1m128.ld
nodemcuv2.menu.eesz.1M128.build.spiffs_pagesize=256
nodemcuv2.menu.eesz.1M128.upload.maximum_size=892912
nodemcuv2.menu.eesz.1M128.build.rfcal_addr=0xFC000
nodemcuv2.menu.eesz.1M128.build.spiffs_start=0xDB000
nodemcuv2.menu.eesz.1M128.build.spiffs_end=0xFB000
nodemcuv2.menu.eesz.1M128.build.spiffs_blocksize=4096
nodemcuv2.menu.eesz.1M144=1MB (FS:144KB OTA:~430KB)
nodemcuv2.menu.eesz.1M144.build.flash_size=1M
nodemcuv2.menu.eesz.1M144.build.flash_size_bytes=0x100000
nodemcuv2.menu.eesz.1M144.build.flash_ld=eagle.flash.1m144.ld
nodemcuv2.menu.eesz.1M144.build.spiffs_pagesize=256
nodemcuv2.menu.eesz.1M144.upload.maximum_size=876528
nodemcuv2.menu.eesz.1M144.build.rfcal_addr=0xFC000
nodemcuv2.menu.eesz.1M144.build.spiffs_start=0xD7000
nodemcuv2.menu.eesz.1M144.build.spiffs_end=0xFB000
nodemcuv2.menu.eesz.1M144.build.spiffs_blocksize=4096
nodemcuv2.menu.eesz.1M160=1MB (FS:160KB OTA:~422KB)
nodemcuv2.menu.eesz.1M160.build.flash_size=1M
nodemcuv2.menu.eesz.1M160.build.flash_size_bytes=0x100000
nodemcuv2.menu.eesz.1M160.build.flash_ld=eagle.flash.1m160.ld
nodemcuv2.menu.eesz.1M160.build.spiffs_pagesize=256
nodemcuv2.menu.eesz.1M160.upload.maximum_size=860144
nodemcuv2.menu.eesz.1M160.build.rfcal_addr=0xFC000
nodemcuv2.menu.eesz.1M160.build.spiffs_start=0xD3000
nodemcuv2.menu.eesz.1M160.build.spiffs_end=0xFB000
nodemcuv2.menu.eesz.1M160.build.spiffs_blocksize=4096
nodemcuv2.menu.eesz.1M192=1MB (FS:192KB OTA:~406KB)
nodemcuv2.menu.eesz.1M192.build.flash_size=1M
nodemcuv2.menu.eesz.1M192.build.flash_size_bytes=0x100000
nodemcuv2.menu.eesz.1M192.build.flash_ld=eagle.flash.1m192.ld
nodemcuv2.menu.eesz.1M192.build.spiffs_pagesize=256
nodemcuv2.menu.eesz.1M192.upload.maximum_size=827376
nodemcuv2.menu.eesz.1M192.build.rfcal_addr=0xFC000
nodemcuv2.menu.eesz.1M192.build.spiffs_start=0xCB000
nodemcuv2.menu.eesz.1M192.build.spiffs_end=0xFB000
nodemcuv2.menu.eesz.1M192.build.spiffs_blocksize=4096
nodemcuv2.menu.eesz.1M256=1MB (FS:256KB OTA:~374KB)
nodemcuv2.menu.eesz.1M256.build.flash_size=1M
nodemcuv2.menu.eesz.1M256.build.flash_size_bytes=0x100000
nodemcuv2.menu.eesz.1M256.build.flash_ld=eagle.flash.1m256.ld
nodemcuv2.menu.eesz.1M256.build.spiffs_pagesize=256
nodemcuv2.menu.eesz.1M256.upload.maximum_size=761840
nodemcuv2.menu.eesz.1M256.build.rfcal_addr=0xFC000
nodemcuv2.menu.eesz.1M256.build.spiffs_start=0xBB000
nodemcuv2.menu.eesz.1M256.build.spiffs_end=0xFB000
nodemcuv2.menu.eesz.1M256.build.spiffs_blocksize=4096
nodemcuv2.menu.eesz.1M512=1MB (FS:512KB OTA:~246KB)
nodemcuv2.menu.eesz.1M512.build.flash_size=1M
nodemcuv2.menu.eesz.1M512.build.flash_size_bytes=0x100000
nodemcuv2.menu.eesz.1M512.build.flash_ld=eagle.flash.1m512.ld
nodemcuv2.menu.eesz.1M512.build.spiffs_pagesize=256
nodemcuv2.menu.eesz.1M512.upload.maximum_size=499696
nodemcuv2.menu.eesz.1M512.build.rfcal_addr=0xFC000
nodemcuv2.menu.eesz.1M512.build.spiffs_start=0x7B000
nodemcuv2.menu.eesz.1M512.build.spiffs_end=0xFB000
nodemcuv2.menu.eesz.1M512.build.spiffs_blocksize=8192
nodemcuv2.menu.eesz.1M=1MB (FS:none OTA:~502KB)
nodemcuv2.menu.eesz.1M.build.flash_size=1M
nodemcuv2.menu.eesz.1M.build.flash_size_bytes=0x100000
nodemcuv2.menu.eesz.1M.build.flash_ld=eagle.flash.1m.ld
nodemcuv2.menu.eesz.1M.build.spiffs_pagesize=256
nodemcuv2.menu.eesz.1M.upload.maximum_size=1023984
nodemcuv2.menu.eesz.1M.build.rfcal_addr=0xFC000
nodemcuv2.menu.eesz.2M64=2MB (FS:64KB OTA:~992KB)
nodemcuv2.menu.eesz.2M64.build.flash_size=2M
nodemcuv2.menu.eesz.2M64.build.flash_size_bytes=0x200000
nodemcuv2.menu.eesz.2M64.build.flash_ld=eagle.flash.2m64.ld
nodemcuv2.menu.eesz.2M64.build.spiffs_pagesize=256
nodemcuv2.menu.eesz.2M64.upload.maximum_size=1044464
nodemcuv2.menu.eesz.2M64.build.rfcal_addr=0x1FC000
nodemcuv2.menu.eesz.2M64.build.spiffs_start=0x1F0000
nodemcuv2.menu.eesz.2M64.build.spiffs_end=0x1FB000
nodemcuv2.menu.eesz.2M64.build.spiffs_blocksize=4096
nodemcuv2.menu.eesz.2M128=2MB (FS:128KB OTA:~960KB)
nodemcuv2.menu.eesz.2M128.build.flash_size=2M
nodemcuv2.menu.eesz.2M128.build.flash_size_bytes=0x200000
nodemcuv2.menu.eesz.2M128.build.flash_ld=eagle.flash.2m128.ld
nodemcuv2.menu.eesz.2M128.build.spiffs_pagesize=256
nodemcuv2.menu.eesz.2M128.upload.maximum_size=1044464
nodemcuv2.menu.eesz.2M128.build.rfcal_addr=0x1FC000
nodemcuv2.menu.eesz.2M128.build.spiffs_start=0x1E0000
nodemcuv2.menu.eesz.2M128.build.spiffs_end=0x1FB000
nodemcuv2.menu.eesz.2M128.build.spiffs_blocksize=4096
nodemcuv2.menu.eesz.2M256=2MB (FS:256KB OTA:~896KB)
nodemcuv2.menu.eesz.2M256.build.flash_size=2M
nodemcuv2.menu.eesz.2M256.build.flash_size_bytes=0x200000
nodemcuv2.menu.eesz.2M256.build.flash_ld=eagle.flash.2m256.ld
nodemcuv2.menu.eesz.2M256.build.spiffs_pagesize=256
nodemcuv2.menu.eesz.2M256.upload.maximum_size=1044464
nodemcuv2.menu.eesz.2M256.build.rfcal_addr=0x1FC000
nodemcuv2.menu.eesz.2M256.build.spiffs_start=0x1C0000
nodemcuv2.menu.eesz.2M256.build.spiffs_end=0x1FB000
nodemcuv2.menu.eesz.2M256.build.spiffs_blocksize=4096
nodemcuv2.menu.eesz.2M512=2MB (FS:512KB OTA:~768KB)
nodemcuv2.menu.eesz.2M512.build.flash_size=2M
nodemcuv2.menu.eesz.2M512.build.flash_size_bytes=0x200000
nodemcuv2.menu.eesz.2M512.build.flash_ld=eagle.flash.2m512.ld
nodemcuv2.menu.eesz.2M512.build.spiffs_pagesize=256
nodemcuv2.menu.eesz.2M512.upload.maximum_size=1044464
nodemcuv2.menu.eesz.2M512.build.rfcal_addr=0x1FC000
nodemcuv2.menu.eesz.2M512.build.spiffs_start=0x180000
nodemcuv2.menu.eesz.2M512.build.spiffs_end=0x1FA000
nodemcuv2.menu.eesz.2M512.build.spiffs_blocksize=8192
nodemcuv2.menu.eesz.2M1M=2MB (FS:1MB OTA:~512KB)
nodemcuv2.menu.eesz.2M1M.build.flash_size=2M
nodemcuv2.menu.eesz.2M1M.build.flash_size_bytes=0x200000
nodemcuv2.menu.eesz.2M1M.build.flash_ld=eagle.flash.2m1m.ld
nodemcuv2.menu.eesz.2M1M.build.spiffs_pagesize=256
nodemcuv2.menu.eesz.2M1M.upload.maximum_size=1044464
nodemcuv2.menu.eesz.2M1M.build.rfcal_addr=0x1FC000
nodemcuv2.menu.eesz.2M1M.build.spiffs_start=0x100000
nodemcuv2.menu.eesz.2M1M.build.spiffs_end=0x1FA000
nodemcuv2.menu.eesz.2M1M.build.spiffs_blocksize=8192
nodemcuv2.menu.eesz.2M=2MB (FS:none OTA:~1019KB)
nodemcuv2.menu.eesz.2M.build.flash_size=2M
nodemcuv2.menu.eesz.2M.build.flash_size_bytes=0x200000
nodemcuv2.menu.eesz.2M.build.flash_ld=eagle.flash.2m.ld
nodemcuv2.menu.eesz.2M.build.spiffs_pagesize=256
nodemcuv2.menu.eesz.2M.upload.maximum_size=1044464
nodemcuv2.menu.eesz.2M.build.rfcal_addr=0x1FC000 ###############到这里结束########################
nodemcuv2.menu.eesz.4M2M=4MB (FS:2MB OTA:~1019KB)
nodemcuv2.menu.eesz.4M2M.build.flash_size=4M
nodemcuv2.menu.eesz.4M2M.build.flash_size_bytes=0x400000
nodemcuv2.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
这是为这个型号的芯片提供1M或2M FLASH固件方法。然后重新打开ARDUINO IDE即可。
如有不懂,可在线留言。
|
打赏
-
查看全部打赏
|