项目功能介绍
- 硬件方面使用了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);
}
图片