本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页
最热资讯


亲,“电路城”已合并升级到更全、更大、更强的「新与非网」。点击查看「新与非网」
本文简单的描述了如何使用Blynk、IR remote和开关来控制8通道中继模块,从而使基于IoT的ESP32家庭自动化。如果无法使用互联网,则可以通过红外遥控器和手动开关控制家用电器。
Blynk ESP32智能家居系统教程视频:
硬件部件:
ESP32控制继电器模块具有以下功能:
如果不想使用PCB,那么也可以仅通过使用8通道继电器模块,ESP32和IR接收器传感器来进行此IoT项目。
ESP32项目电路图:
PCB所需的组件:
所需软件:
使用Blynk通过Internet控制继电器 :
如果ESP32模块与WiFi连接,则可以通过Blynk App,IR遥控器和开关控制家用电器
可以使用Blynk应用程序控制和监视来自世界任何地方的实时反馈
(使用了中继模块和ESP32)
(使用了定制设计的PCB)
带红外遥控器的ESP32控制继电器:
对于此项目,可以使用任何IR遥控器。如果ESP32已连接Wi-Fi,则还可以在Blynk App中监控实时反馈。
(使用了中继模块和ESP32)
(使用了定制设计的PCB)
使用开关或按钮控制继电器:
可以使用开关或按钮手动控制继电器。ESP32每3秒钟检查一次WiFi。当WiFi可用时,ESP32会自动连接WiFi。
为ESP32配置Blynk App:
1.从Google Play商店或App Store安装Blynk App ,然后创建一个帐户,然后点击“新建项目”。
2.为项目命名,选择ESP32 Dev Board ,连接类型为Wi-Fi ,然后点击创建。
3. Blynk会将身份验证令牌发送到注册的电子邮件ID,点击确定。
在Blynk应用程序中添加按钮小部件:
添加8个按钮小部件以控制8个继电器。将虚拟针脚V1,V2,V3,V4,V5,V6,V7,V8用于8个按钮。并且模式将为“切换”。
从遥控器获取IR代码(十六进制代码):
获取十六进制代码:
Blynk ESP32家庭自动化代码:
带有Switch的此ESP32 Blynk家庭控制的下载代码
带有PushButton的此ESP32 Blynk主页控件的下载代码
如果使用开关(闩锁),请参考开关代码,请使用瞬时开关按钮的代码。
在Arduino IDE中下载并安装以下库:
使用Arduino IDE对ESP32进行编程:
为ESP32项目设计PCB:
将所有组件焊接在PCB上:
按照电路图焊接了所有组件,然后将ESP32板与PCB相连。
连接家用电器:
按照电路图连接8个家用电器,在高压下工作时,请采取适当的安全预防措施,将5伏5安直流电源与PCB连接。
连接电源:
连接110V / 230V电源和5V DC电源
附件:
/ ***************************************************** **************************************
*标题:Blynk + IR +手动(开关)控制使用ESP32的8通道继电器,具有实时反馈和无WiFi控制
*单击以下链接以了解更多信息。
* YouTube视频:https://youtu.be/2HxWGHXyCt4
*相关博客:https://iotcircuithub.com/esp32-projects/
*由Tech StudyCell提供
*首选项->附加板经理URL:
* https://dl.espressif.com/dl/package_esp32_index.json、http://arduino.esp8266.com/stable/package_esp8266com_index.json
*
*下载ESP32开发板:https://github.com/espressif/arduino-esp32
*
*下载库
* Blynk库:https://github.com/blynkkk/blynk-library/releases/download/v0.6.1/Blynk_Release_v0.6.1.zip
* AceButton库:https://github.com/bxparks/AceButton
* IRremote库:https://github.com/Arduino-IRremote/Arduino-IRremote
****************************************************** ************************************ /
#include <IRremote.h>
#include <BlynkSimpleEsp32.h>
#include <AceButton.h>
using namespace ace_button;
BlynkTimer timer1;
// 定义与继电器和开关连接的GPIO
#define RelayPin1 23 //D23
#define RelayPin2 22 //D22
#define RelayPin3 21 //D21
#define RelayPin4 19 //D19
#define RelayPin5 18 //D18
#define RelayPin6 5 //D5
#define RelayPin7 25 //D25
#define RelayPin8 26 //D26
#define SwitchPin1 13 //D13
#define SwitchPin2 12 //D12
#define SwitchPin3 14 //D14
#define SwitchPin4 27 //D27
#define SwitchPin5 33 //D33
#define SwitchPin6 32 //D32
#define SwitchPin7 15 //D15
#define SwitchPin8 4 //D4
#define wifiLed 2 //D2
#define IR_RECV_PIN 35 //D35
#define VPIN_BUTTON_1 V1
#define VPIN_BUTTON_2 V2
#define VPIN_BUTTON_3 V3
#define VPIN_BUTTON_4 V4
#define VPIN_BUTTON_5 V5
#define VPIN_BUTTON_6 V6
#define VPIN_BUTTON_7 V7
#define VPIN_BUTTON_8 V8
#define VPIN_BUTTON_9 V9
int toggleState_1 = 1 ; //定义整型记住切换状态的继电器1
int toggleState_2 = 1 ; //定义整型记住切换状态的继电器2
int toggleState_3 = 1 ; //定义整型记住切换状态的继电器3
int toggleState_4 = 1 ; //定义整型记住切换状态的继电器4
int toggleState_5 = 1 ; //定义整型记住切换状态的继电器5
int toggleState_6 = 1 ; //定义整数记住切换状态为继电器6
int toggleState_7 = 1 ; //定义整型记住切换状态的继电器7
int toggleState_8 = 1 ; //定义整型记住切换状态的继电器8
int wifiFlag = 0;
IRrecv irrecv(IR_RECV_PIN);
decode_results results;
ButtonConfig config1;
AceButton button1(&config1);
ButtonConfig config2;
AceButton button2(&config2);
ButtonConfig config3;
AceButton button3(&config3);
ButtonConfig config4;
AceButton button4(&config4);
ButtonConfig config5;
AceButton button5(&config5);
ButtonConfig config6;
AceButton button6(&config6);
ButtonConfig config7;
AceButton button7(&config7);
ButtonConfig config8;
AceButton button8(&config8);
void handleEvent1(AceButton*, uint8_t, uint8_t);
void handleEvent2(AceButton*, uint8_t, uint8_t);
void handleEvent3(AceButton*, uint8_t, uint8_t);
void handleEvent4(AceButton*, uint8_t, uint8_t);
void handleEvent5(AceButton*, uint8_t, uint8_t);
void handleEvent6(AceButton*, uint8_t, uint8_t);
void handleEvent7(AceButton*, uint8_t, uint8_t);
void handleEvent8(AceButton*, uint8_t, uint8_t);
#define AUTH "AUTH TOKEN" // 在Blynk应用程序中获得身份验证令牌
#define WIFI_SSID "WIFI NAME" //输入Wifi名称
#define WIFI_PASS "WIFI PASSWORD" //输入wifi密码
void relayOnOff(int relay){
switch(relay){
case 1:
if(toggleState_1 == 1){
digitalWrite(RelayPin1, LOW); // 打开继电器1
toggleState_1 = 0;
Serial.println("Device1 ON");
}
else{
digitalWrite(RelayPin1, HIGH); // 关闭继电器1
toggleState_1 = 1;
Serial.println("Device1 OFF");
}
delay(100);
break;
case 2:
if(toggleState_2 == 1){
digitalWrite(RelayPin2, LOW); // 打开继电器2
toggleState_2 = 0;
Serial.println("Device2 ON");
}
else{
digitalWrite(RelayPin2, HIGH); // 关闭继电器2
toggleState_2 = 1;
Serial.println("Device2 OFF");
}
delay(100);
break;
case 3:
if(toggleState_3 == 1){
digitalWrite(RelayPin3, LOW); // 打开继电器3
toggleState_3 = 0;
Serial.println("Device3 ON");
}
else{
digitalWrite(RelayPin3, HIGH); // 关闭继电器3
toggleState_3 = 1;
Serial.println("Device3 OFF");
}
delay(100);
break;
case 4:
if(toggleState_4 == 1){
digitalWrite(RelayPin4, LOW); // 打开继电器4
toggleState_4 = 0;
Serial.println("Device4 ON");
}
else{
digitalWrite(RelayPin4, HIGH); //关闭继电器4
toggleState_4 = 1;
Serial.println("Device4 OFF");
}
delay(100);
break;
case 5:
if(toggleState_5 == 1){
digitalWrite(RelayPin5, LOW); // 打开继电器5
toggleState_5 = 0;
Serial.println("Device5 ON");
}
else{
digitalWrite(RelayPin5, HIGH); //关闭继电器5
toggleState_5 = 1;
Serial.println("Device5 OFF");
}
delay(100);
break;
case 6:
if(toggleState_6 == 1){
digitalWrite(RelayPin6, LOW); // 打开继电器6
toggleState_6 = 0;
Serial.println("Device6 ON");
}
else{
digitalWrite(RelayPin6, HIGH); // 关闭继电器6
toggleState_6 = 1;
Serial.println("Device6 OFF");
}
delay(100);
break;
case 7:
if(toggleState_7 == 1){
digitalWrite(RelayPin7, LOW); //打开继电器7
toggleState_7 = 0;
Serial.println("Device7 ON");
}
else{
digitalWrite(RelayPin7, HIGH); // 关闭继电器7
toggleState_7 = 1;
Serial.println("Device7 OFF");
}
delay(100);
break;
case 8:
if(toggleState_8 == 1){
digitalWrite(RelayPin8, LOW); // 打开继电器8
toggleState_8 = 0;
Serial.println("Device8 ON");
}
else{
digitalWrite(RelayPin8, HIGH); // 关闭继电器8
toggleState_8 = 1;
Serial.println("Device8 OFF");
}
delay(100);
break;
default : break;
}
}
void all_SwitchOff(){
toggleState_1 = 1; digitalWrite(RelayPin1, toggleState_1); Blynk.virtualWrite(VPIN_BUTTON_1, toggleState_1); delay(100);
toggleState_2 = 1; digitalWrite(RelayPin2, toggleState_2); Blynk.virtualWrite(VPIN_BUTTON_2, toggleState_2); delay(100);
toggleState_3 = 1; digitalWrite(RelayPin3, toggleState_3); Blynk.virtualWrite(VPIN_BUTTON_3, toggleState_3); delay(100);
toggleState_4 = 1; digitalWrite(RelayPin4, toggleState_4); Blynk.virtualWrite(VPIN_BUTTON_4, toggleState_4); delay(100);
toggleState_5 = 1; digitalWrite(RelayPin5, toggleState_5); Blynk.virtualWrite(VPIN_BUTTON_5, toggleState_5); delay(100);
toggleState_6 = 1; digitalWrite(RelayPin6, toggleState_6); Blynk.virtualWrite(VPIN_BUTTON_6, toggleState_6); delay(100);
toggleState_7 = 1; digitalWrite(RelayPin7, toggleState_7); Blynk.virtualWrite(VPIN_BUTTON_7, toggleState_7); delay(100);
toggleState_8 = 1; digitalWrite(RelayPin8, toggleState_8); Blynk.virtualWrite(VPIN_BUTTON_8, toggleState_8); delay(100);
}
void ir_remote(){
if (irrecv.decode(&results)) {
switch(results.value){
case 0x80BF49B6: relayOnOff(1); Blynk.virtualWrite(VPIN_BUTTON_1, toggleState_1); break;
case 0x80BFC936: relayOnOff(2); Blynk.virtualWrite(VPIN_BUTTON_2, toggleState_2); break;
case 0x80BF33CC: relayOnOff(3); Blynk.virtualWrite(VPIN_BUTTON_3, toggleState_3); break;
case 0x80BF718E: relayOnOff(4); Blynk.virtualWrite(VPIN_BUTTON_4, toggleState_4); break;
case 0x80BFF10E: relayOnOff(5); Blynk.virtualWrite(VPIN_BUTTON_5, toggleState_5); break;
case 0x80BF13EC: relayOnOff(6); Blynk.virtualWrite(VPIN_BUTTON_6, toggleState_6); break;
case 0x80BF51AE: relayOnOff(7); Blynk.virtualWrite(VPIN_BUTTON_7, toggleState_7); break;
case 0x80BFD12E: relayOnOff(8); Blynk.virtualWrite(VPIN_BUTTON_8, toggleState_8); break;
case 0x80BF3BC4: all_SwitchOff(); break;
default : break;
}
//Serial.println(results.value, HEX);
irrecv.resume();
}
}
// 按下App按钮时-切换状态
BLYNK_WRITE(VPIN_BUTTON_1) {
toggleState_1 = param.asInt();
digitalWrite(RelayPin1, toggleState_1);
}
BLYNK_WRITE(VPIN_BUTTON_2) {
toggleState_2 = param.asInt();
digitalWrite(RelayPin2, toggleState_2);
}
BLYNK_WRITE(VPIN_BUTTON_3) {
toggleState_3 = param.asInt();
digitalWrite(RelayPin3, toggleState_3);
}
BLYNK_WRITE(VPIN_BUTTON_4) {
toggleState_4 = param.asInt();
digitalWrite(RelayPin4, toggleState_4);
}
BLYNK_WRITE(VPIN_BUTTON_5) {
toggleState_5 = param.asInt();
digitalWrite(RelayPin5, toggleState_5);
}
BLYNK_WRITE(VPIN_BUTTON_6) {
toggleState_6 = param.asInt();
digitalWrite(RelayPin6, toggleState_6);
}
BLYNK_WRITE(VPIN_BUTTON_7) {
toggleState_7 = param.asInt();
digitalWrite(RelayPin7, toggleState_7);
}
BLYNK_WRITE(VPIN_BUTTON_8) {
toggleState_8 = param.asInt();
digitalWrite(RelayPin8, toggleState_8);
}
BLYNK_WRITE(VPIN_BUTTON_9) {
all_SwitchOff();
}
BLYNK_CONNECTED() {
//从服务器请求最新状态
Blynk.syncVirtual(VPIN_BUTTON_1);
Blynk.syncVirtual(VPIN_BUTTON_2);
Blynk.syncVirtual(VPIN_BUTTON_3);
Blynk.syncVirtual(VPIN_BUTTON_4);
Blynk.syncVirtual(VPIN_BUTTON_5);
Blynk.syncVirtual(VPIN_BUTTON_6);
Blynk.syncVirtual(VPIN_BUTTON_7);
Blynk.syncVirtual(VPIN_BUTTON_8);
}
void checkBlynkStatus() { // 由SimpleTimer每3秒调用一次
bool isconnected = Blynk.connected();
if (isconnected == false) {
wifiFlag = 1;
digitalWrite(wifiLed, LOW); //关闭WiFi LED
}
if (isconnected == true) {
wifiFlag = 0;
digitalWrite(wifiLed, HIGH); //打开WiFi LED
}
}
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // 启动接收器
pinMode(RelayPin1, OUTPUT);
pinMode(RelayPin2, OUTPUT);
pinMode(RelayPin3, OUTPUT);
pinMode(RelayPin4, OUTPUT);
pinMode(RelayPin5, OUTPUT);
pinMode(RelayPin6, OUTPUT);
pinMode(RelayPin7, OUTPUT);
pinMode(RelayPin8, OUTPUT);
pinMode(wifiLed, OUTPUT);
pinMode(SwitchPin1, INPUT_PULLUP);
pinMode(SwitchPin2, INPUT_PULLUP);
pinMode(SwitchPin3, INPUT_PULLUP);
pinMode(SwitchPin4, INPUT_PULLUP);
pinMode(SwitchPin5, INPUT_PULLUP);
pinMode(SwitchPin6, INPUT_PULLUP);
pinMode(SwitchPin7, INPUT_PULLUP);
pinMode(SwitchPin8, INPUT_PULLUP);
//在启动所有继电器期间应将其关闭
digitalWrite(RelayPin1, toggleState_1);
digitalWrite(RelayPin2, toggleState_2);
digitalWrite(RelayPin3, toggleState_3);
digitalWrite(RelayPin4, toggleState_4);
digitalWrite(RelayPin5, toggleState_5);
digitalWrite(RelayPin6, toggleState_6);
digitalWrite(RelayPin7, toggleState_7);
digitalWrite(RelayPin8, toggleState_8);
config1.setEventHandler(button1Handler);
config2.setEventHandler(button2Handler);
config3.setEventHandler(button3Handler);
config4.setEventHandler(button4Handler);
config5.setEventHandler(button5Handler);
config6.setEventHandler(button6Handler);
config7.setEventHandler(button7Handler);
config8.setEventHandler(button8Handler);
button1.init(SwitchPin1);
button2.init(SwitchPin2);
button3.init(SwitchPin3);
button4.init(SwitchPin4);
button5.init(SwitchPin5);
button6.init(SwitchPin6);
button7.init(SwitchPin7);
button8.init(SwitchPin8);
WiFi.begin(WIFI_SSID, WIFI_PASS);
timer1.setInterval(2000L, checkBlynkStatus); // 检查是否Blynk服务器连接每3秒
Blynk.config(AUTH);
delay(1000);
Blynk.virtualWrite(VPIN_BUTTON_1, toggleState_1);
Blynk.virtualWrite(VPIN_BUTTON_2, toggleState_2);
Blynk.virtualWrite(VPIN_BUTTON_3, toggleState_3);
Blynk.virtualWrite(VPIN_BUTTON_4, toggleState_4);
Blynk.virtualWrite(VPIN_BUTTON_5, toggleState_5);
Blynk.virtualWrite(VPIN_BUTTON_6, toggleState_6);
Blynk.virtualWrite(VPIN_BUTTON_7, toggleState_7);
Blynk.virtualWrite(VPIN_BUTTON_8, toggleState_8);
}
void loop()
{
ir_remote();
button1.check();
button2.check();
button3.check();
button4.check();
button5.check();
button6.check();
button7.check();
button8.check();
if (WiFi.status() == WL_CONNECTED)
{
Blynk.run();
}
timer1.run(); // 启动SimpleTimer
}
void button1Handler(AceButton* button, uint8_t eventType, uint8_t buttonState) {
Serial.println("EVENT1");
switch (eventType) {
case AceButton::kEventPressed:
Serial.println("kEventPressed");
toggleState_1 = 0;
Blynk.virtualWrite(VPIN_BUTTON_1, toggleState_1); // 更新按钮小部件
digitalWrite(RelayPin1, LOW);
break;
case AceButton::kEventReleased:
Serial.println("kEventReleased");
toggleState_1 = 1;
Blynk.virtualWrite(VPIN_BUTTON_1, toggleState_1); // 更新按钮小部件
digitalWrite(RelayPin1, HIGH);
break;
}
}
void button2Handler(AceButton* button, uint8_t eventType, uint8_t buttonState) {
Serial.println("EVENT2");
switch (eventType) {
case AceButton::kEventPressed:
Serial.println("kEventPressed");
toggleState_2 = 0;
Blynk.virtualWrite(VPIN_BUTTON_2, toggleState_2);
digitalWrite(RelayPin2, LOW);
break;
case AceButton::kEventReleased:
Serial.println("kEventReleased");
toggleState_2 = 1;
Blynk.virtualWrite(VPIN_BUTTON_2, toggleState_2);
digitalWrite(RelayPin2, HIGH);
break;
}
}
void button3Handler(AceButton* button, uint8_t eventType, uint8_t buttonState) {
Serial.println("EVENT3");
switch (eventType) {
case AceButton::kEventPressed:
Serial.println("kEventPressed");
toggleState_3 = 0;
Blynk.virtualWrite(VPIN_BUTTON_3, toggleState_3);
digitalWrite(RelayPin3, LOW);
break;
case AceButton::kEventReleased:
Serial.println("kEventReleased");
toggleState_3 = 1;
Blynk.virtualWrite(VPIN_BUTTON_3, toggleState_3);
digitalWrite(RelayPin3, HIGH);
break;
}
}
void button4Handler(AceButton* button, uint8_t eventType, uint8_t buttonState) {
Serial.println("EVENT4");
switch (eventType) {
case AceButton::kEventPressed:
Serial.println("kEventPressed");
toggleState_4 = 0;
Blynk.virtualWrite(VPIN_BUTTON_4, toggleState_4);
digitalWrite(RelayPin4, LOW);
break;
case AceButton::kEventReleased:
Serial.println("kEventReleased");
toggleState_4 = 1;
Blynk.virtualWrite(VPIN_BUTTON_4, toggleState_4);
digitalWrite(RelayPin4, HIGH);
break;
}
}
void button5Handler(AceButton* button, uint8_t eventType, uint8_t buttonState) {
Serial.println("EVENT5");
switch (eventType) {
case AceButton::kEventPressed:
Serial.println("kEventPressed");
toggleState_5 = 0;
Blynk.virtualWrite(VPIN_BUTTON_5, toggleState_5);
digitalWrite(RelayPin5, LOW);
break;
case AceButton::kEventReleased:
Serial.println("kEventReleased");
toggleState_5 = 1;
Blynk.virtualWrite(VPIN_BUTTON_5, toggleState_5);
digitalWrite(RelayPin5, HIGH);
break;
}
}
void button6Handler(AceButton* button, uint8_t eventType, uint8_t buttonState) {
Serial.println("EVENT6");
switch (eventType) {
case AceButton::kEventPressed:
Serial.println("kEventPressed");
toggleState_6 = 0;
Blynk.virtualWrite(VPIN_BUTTON_6, toggleState_6);
digitalWrite(RelayPin6, LOW);
break;
case AceButton::kEventReleased:
Serial.println("kEventReleased");
toggleState_6 = 1;
Blynk.virtualWrite(VPIN_BUTTON_6, toggleState_6);
digitalWrite(RelayPin6, HIGH);
break;
}
}
void button7Handler(AceButton* button, uint8_t eventType, uint8_t buttonState) {
Serial.println("EVENT7");
switch (eventType) {
case AceButton::kEventPressed:
Serial.println("kEventPressed");
toggleState_7 = 0;
Blynk.virtualWrite(VPIN_BUTTON_7, toggleState_7);
digitalWrite(RelayPin7, LOW);
break;
case AceButton::kEventReleased:
Serial.println("kEventReleased");
toggleState_7 = 1;
Blynk.virtualWrite(VPIN_BUTTON_7, toggleState_7);
digitalWrite(RelayPin7, HIGH);
break;
}
}
void button8Handler(AceButton* button, uint8_t eventType, uint8_t buttonState) {
Serial.println("EVENT8");
switch (eventType) {
case AceButton::kEventPressed:
Serial.println("kEventPressed");
toggleState_8 = 0;
Blynk.virtualWrite(VPIN_BUTTON_8, toggleState_8);
digitalWrite(RelayPin8, LOW);
break;
case AceButton::kEventReleased:
Serial.println("kEventReleased");
toggleState_8 = 1;
Blynk.virtualWrite(VPIN_BUTTON_8, toggleState_8);
digitalWrite(RelayPin8, HIGH);
break;
}
}
拆解: 130美元的声控家用设备Amazon Tap蓝牙音箱
2016-06-29
面临制造业流失,科技巨头跑路,创业公司倒闭的深圳,已不再是科技创业者的天堂?
2017-10-17
物联网连接技术:cellular还是LPWAN?
2018-11-16
物联网安全和Linux:为什么IncludeOS有其优势
2018-11-14
遥感技术的演变:实现物联网的承诺
2018-11-19
2019年你最值得入手的5款开发板
2019-08-21
小米米家生态中的3种温湿度传感器智能硬件比较,哪种最好?
2019-10-12
这套工业物联网解决方案把乐高变成了一座智慧城市
2019-06-24
【实战课】华为IoT物联网平台(7)NB-IoT芯片与模组介绍
2019-07-21
NODEMCU-物联网机器人
2019-08-01
讨论