文章概述

我用的是Esp8266-12F NodeMCU开发板。配网用安信可微信公众号 的在线配网页面。把代码贴出来并解释一下,很高兴帮到和我一样的人。

解析代码

程序目录

  • App(主程序)
  • action(活动相关操作)
  • btn(按钮相关操作)
  • led(led相关操作)
  • wifi(wifi相关操作)

App

#include <ESP8266WiFi.h>

//按钮
#define btn D3
int btn_state;
int btn_press;

//按钮活动锁
bool act_BLUHG1TB_lock;

//LED
#define led 2
int led_state;

//初始化
void setup() {
  action_setup();//活动管理器初始化
  btn_setup();//按钮初始化
  led_setup();//LED初始化
  Serial.begin(115200); //打开串口是为了调试
  wifi_connect();
}

//循环
void loop() {
  btn_loop();
  led_loop();
}

action

void action_setup(){
  act_BLUHG1TB_lock = 1;
}

//活动BLUHG1TB
void act_BLUHG1TB(){
  act_BLUHG1TB_lock = 0;//锁定仅运行一次
  Serial.print("已进入配置模式");
  wifi_smartConfig();//智能配网
  wifi_connect();
}

btn

void btn_setup(){
  pinMode(btn, INPUT_PULLUP);
}

void btn_loop(){
  btn_refresh_state();//刷新按钮状态
  btn_refresh_press();//刷新按钮按下时间
  btn_action_manager();//按钮活动管理
}

//按钮活动管理主函数
void btn_action_manager(){
  if(btn_press>500){
    //检查任务是否可运行
    if(act_BLUHG1TB_lock){
      act_BLUHG1TB();
    }
  }
}

//刷新按钮状态
void btn_refresh_state(){
  btn_state = digitalRead(btn);
}

//刷新按钮按下时间
void btn_refresh_press(){
  if(btn_state==0){
    if(btn_state==0){
      delay(10);
      btn_press++;
    }
  }else{
    btn_press=0;
  }
}

led

//LED初始化
void led_setup(){
  pinMode(led,OUTPUT);
}

//LED任务
void led_loop(){
//  led_state = digitalRead(btn);
//  led_refresh();
}

//刷新led状态
void led_refresh(){
  digitalWrite(led,led_state);
}

//设置LED状态
void led_set(int state){
  led_state = state;
}

//打开LED
void led_on(){
  led_set(0);
  led_refresh();
}

//关闭LED
void led_off(){
  led_set(1);
  led_refresh();
}

//反转LED状态并更新
void led_reverse(){
  led_state = !led_state;
  led_refresh();
}

wifi

//智能配网
void wifi_smartConfig()
{
  for(int i=0;i<10;i++){
    led_reverse();
    delay(100);
  }
  WiFi.mode(WIFI_STA); //设置WIFI模块为STA模式
  Serial.println("\r\nSmartConfig");
  WiFi.beginSmartConfig();//初始化smartconfig
  while (1)
  {
    Serial.print(".");
    delay(1000);
    //连接成功后解锁配网活动并且打印WIFI信息
    if (WiFi.smartConfigDone())
    {
      Serial.println("SmartConfig Success");
      Serial.printf("SSID:%s", WiFi.SSID().c_str());
      Serial.printf("PW:%s", WiFi.psk().c_str());//打印出密码
      act_BLUHG1TB_lock = 1;//解锁配网活动使得不用重启即可即可继续配网
      break;
    }
  }
}

//连接wifi
void wifi_connect(){
  Serial.printf("\r\nConnecting to:%s", WiFi.SSID().c_str());
  WiFi.begin();
  while (WiFi.status() != WL_CONNECTED)   
  {                   
    delay(1000);
    Serial.print("."); 
    led_reverse();//闪烁板载LED                   
  }
  Serial.print("WifiConnected!");  
  led_off();   
}
最后修改:2022 年 06 月 22 日
如果觉得我的文章对你有用,请随意赞赏