|
本帖最后由 lwq1947 于 2021-9-10 20:24 编辑
参看网上关于8266通讯方面的相关资料,我制作了一款8266实用遥控器.无需网络就能使用.一块由ESP-12E为主的电路构成了发送器,接收器则选用了成品ESP-01S了继电器模块.根据个人需求只设计了一路开关控制(如有需要可自行更改程序来实现多路控制).
由于9266处于通讯状态时其工作电流较大,约为50-70毫安.为了降低遥控器待机电流,所以设计电路使得8266的EN端平时为低电平处于休眠状态.实测待机电流为250微安.当开关键任何一个按下时还会通过二级管使的8266的EN端立刻变为高电平以唤醒8266执行开关程序(延迟约2毫秒).遥控器电源选用了报废数码相机的锂电池.由于8266的工作电压范围为3-3.6伏,所以在锂电池充电回路中串接了一只二级管.这样就使的电池充电终止电压变为3.6V.确保8266能安全工作.程序设计中还使用了A0口对电池电压进行监测:当电池电压低于3V时,在按压开关键后红色的LED指示灯就会变为闪亮.提示需要给锂电池充电了.
遥控器电路图和程序及ESP-01S程序如下,供大家参考.
发送程序:
#include <ESP8266WiFi.h>
#include <espnow.h>
uint8_t broadcastAddress[] = {0x9C, 0x9C, 0x1F, 0x46, 0x58, 0x9C};//接收器8266的MAC地址 根据自己的板子修改.获取方法参见:https://blog.csdn.net/weixin_45631738/article/details/113139247
typedef struct struct_message {
char a[32];
int b;
} struct_message;
struct_message myData;
void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) {
Serial.print("Last Packet Send Status: ");
if (sendStatus == 0){
Serial.println("Delivery success");
}
else{
Serial.println("Delivery fail");
}
}
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
if (esp_now_init() != 0) {
Serial.println("Error initializing ESP-NOW");
return;
}
pinMode(4,INPUT);
pinMode(5,INPUT);
esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
esp_now_register_send_cb(OnDataSent);
esp_now_add_peer(broadcastAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);
}
void loop() {
if(digitalRead(4)==LOW) myData.b = 1;
if(digitalRead(5)==LOW) myData.b = 2;
esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));
delay(1000);
}
接收程序:
#include <ESP8266WiFi.h>
#include <espnow.h>
int k;
typedef struct struct_message {
char a[32];
int b;
} struct_message;
struct_message myData;
void OnDataRecv(uint8_t * mac, uint8_t *incomingData, uint8_t len) {
memcpy(&myData, incomingData, sizeof(myData));
Serial.print("Int: ");
k=myData.b;
Serial.println(myData.b);
Serial.println();
}
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
if (esp_now_init() != 0) {
Serial.println("Error initializing ESP-NOW");
return;
}
pinMode(0,OUTPUT);
digitalWrite(0, LOW);
pinMode(2,OUTPUT);
digitalWrite(2, LOW);
esp_now_set_self_role(ESP_NOW_ROLE_SLAVE);
esp_now_register_recv_cb(OnDataRecv);
}
void loop(){
if(k==1) {
digitalWrite(0, LOW);
digitalWrite(2, LOW);
}
if(k==2) {
digitalWrite(0, HIGH);
digitalWrite(2, HIGH);
}
}
|
-
电路图
-
外观图
|