基于ESP_NOW的开关,配合市面上现成的开关盒

项目功能介绍

  • 硬件方面使用了ESP8266作为ESP_NOW开关的发送端,当开关没有按下的时候,ESP8266处于永久休眠状态,当开关按下的时候会对芯片reset同时锁存住按下的开关,芯片启动完成后读取端口状态就能判断是哪个按钮被按下,同时通过ESP_NOW协议发出数据,数据发完后再次进入休眠状态。
  • 功耗方面,发射的时候大约20mA 休眠的时候不到5uA,如果不是很频繁的开关,一颗200mAH的锂电池估计能用一年

项目属性

目前该项目已经测试完毕,功能正常,已经投入使用

  • [x] 原理图设计
  • [x] PCB图设计
  • [x] PCB打样
  • [x] 焊接测试
  • [x] 功能测试
  • [x] 程序测试

电路讲解

图片

电路中比较创新的部分在于这个复位同时锁存IO状态的电路,当开关按下去的时候,可以对RST进行复位,同时相应的端口拉高,待ESP8266检测完端口后再将端口电平拉低,解除锁存状态。

软件

#include
extern “C” {
#include
}
#define espNowSwitchID 0x01
#define WIFI_CHANNEL 1
#define SEND_TIMEOUT 10000
#define SW1 14
#define SW2 12
#define SW3 13
#define K4 4

uint8_t remoteMac[] = {0x1A, 0xFE, 0x34, 0xCB, 0x68, 0x45};
/*发送数据定义
D0: espNow ID[0-255]
D1: keyValue[0-3]
D2: AD使能 0-未采集 1-已采集
D3-D4: AD数据[电池电压]

*/
uint8_t transferData[8] = {espNowSwitchID};//
volatile boolean readingSent;

uint8_t keyValue = 0;
void setup() {
if (digitalRead(SW1))keyValue = 1;
if (digitalRead(SW2))keyValue = 2;
if (digitalRead(SW3))keyValue = 3;
pinMode(SW1, OUTPUT);
pinMode(SW2, OUTPUT);
pinMode(SW3, OUTPUT);
digitalWrite(SW1, LOW);
digitalWrite(SW2, LOW);
digitalWrite(SW3, LOW);
WiFi.mode(WIFI_STA);
WiFi.begin();
if (esp_now_init() != 0) {
ESP.restart();
}
delay(1); // This delay seems to make it work more reliably???

esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
esp_now_add_peer(remoteMac, ESP_NOW_ROLE_SLAVE, WIFI_CHANNEL, NULL, 0);
esp_now_register_send_cb([](uint8_t* mac, uint8_t status) {
readingSent = true;
});

sendReading();
}

void loop() {
if (readingSent || (millis() > SEND_TIMEOUT)) {
ESP.deepSleep(0);
}
}

void sendReading() {
readingSent = false;
transferData[1] = keyValue;
esp_now_send(NULL, transferData, 8);
}

图片

图片

:+1: :+1:

求gerber文件呀

怎么玩呀大佬。。。。

:smirk: 大佬。

接收端的程序怎么写 大佬

求外壳 哪里买的