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

基于Blynk IR Remote和ESP32的家庭自动化

发布时间:2021-06-21
分享到:

基于Blynk IR Remote和ESP32的家庭自动化

发布时间:2021-06-21
分享到:

本文简单的描述了如何使用Blynk、IR remote和开关来控制8通道中继模块,从而使基于IoT的ESP32家庭自动化。如果无法使用互联网,则可以通过红外遥控器和手动开关控制家用电器。

Blynk ESP32智能家居系统教程视频:

硬件部件:

  • ESP32S
  • 红外接收器
  • 继电器控制器(用于I2C的4通道) 
  • 手动开关

ESP32控制继电器模块具有以下功能:

  • 通过WiFi控制家用电器(Blynk应用)
  • 使用IR遥控器控制家用电器
  • 用手动开关控制家用电器
  • 在Blynk应用程序中监控实时反馈
  • 手动控制家用电器,而无需从IR遥控器和开关访问互联网

如果不想使用PCB,那么也可以仅通过使用8通道继电器模块,ESP32和IR接收器传感器来进行此IoT项目。

ESP32项目电路图:

  • 使用GPIO引脚D23,D22,D21,D19,D18,D5,D25和D26来控制8个继电器
  • GPIO引脚D13,D12,D14,D27,D33,D32,D15和D4与开关连接,以手动控制8个继电器
  • IR接收器的输出引脚与GPIO D35连接
  • 在Arduino IDE中使用了INPUT_PULLUP函数
  • 使用了5V 5A直流电源

 PCB所需的组件:

  • 继电器5v(SPDT)(8个)
  • BC547晶体管(8个)
  • PC817 Optocuplors(8个)
  • 510欧姆0.25瓦电阻器(8 no)(R1-R8)
  • 1k 0.25瓦电阻器(10 no)(R9-R18)
  • LED 5毫米(10颗)
  • 1N4007二极管(8个)(D1-D8)
  • 按钮(8个否)
  • 端子连接器
  • 5V DC电源

所需软件:

  • Arduino IDE
  • Blynk应用

使用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代码(十六进制代码):

  1. 将IR接收器输出引脚与GPIO D35连接
  2. 在VCC和GND之间提供5V电压
  3. 代码下载

 

获取十六进制代码:

  • 在Arduino IDE中安装IRremote库
  • 下载随附的代码,并将其上传到ESP32
  • 打开串行监视器与波特率9600 
  • 按红外遥控器按钮,相应的十六进制代码将填充在串行监视器中
  • 将所有十六进制代码保存在文本文件中

Blynk ESP32家庭自动化代码:

带有Switch的此ESP32 Blynk家庭控制的下载代码

带有PushButton的此ESP32 Blynk主页控件的下载代码

如果使用开关(闩锁),请参考开关代码,请使用瞬时开关按钮的代码。

在Arduino IDE中下载并安装以下库:

  • IRremote Library
  • AceButton Library
  • Blynk Library

使用Arduino IDE对ESP32进行编程:

  1. 在代码中输入WiFi名称,WiFi密码和Blynk身份验证令牌
  2. 在ir_remote函数中更新十六进制代码
  3. 选择DOIT ESP32 DEVKIT V1开发板并选择正确的PORT 
  4. 将代码上传到ESP32开发板
  5. 在将代码上传到ESP32时,如果看到“ Connecting ....___”文本,请按ESP32的BOOT按钮。

为ESP32项目设计PCB:

下载家庭自动化项目的PCB Gerber文件

将所有组件焊接在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;
  }
}

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论