mmuyu 发表于 2023-9-15 20:17:01

机智云ESP8266-8路继电器开源教程

本帖最后由 mmuyu 于 2023-9-15 20:19 编辑

机智云ESP8266-SOC模式-8路继电器开源教程
1.项目分析:                由于8266引脚较少,并且根据安信可提供的规格书,io口电流无法提供达到继电器要求的电流,使用灌电流驱动大概率烧坏芯片,因此我们选择使用74hc595实现3个io口驱动8路继电器,74hc595至少每个io口能提供1ma以上的电流,经过三极管放大后可以满足我们驱动继电器的要求。

2.8266引脚分配:
    根据esp12-f规格书,避开已经被芯片内部使用的,以及与启动重启相关的gpio口,为设备需要的重启,下载模式切换,led灯,595驱动引脚,串口等重要功能预先分配好需要用到的gpio口,方便后续绘制原理图。此项目的GPIO口分配如下:



3.原理图绘制:
    根据io口分配,绘制功能电路,供电电路以及其他**电路。此项目使用立创EDA专业版设计,为考虑手工焊接,元器件价格和方便购买,大部分元器件选用立创smt基础库元器件,规格大部分为1206,SOT-223之类较大的封装。



4.元器件选型要求:
    1.自恢复保险丝用于esp8266供电用,esp-12f规格书提及esp8266的电流最大会大于500ma,因此元器件选型的时候,保险丝跳闸电流要大于500ma。
    2.确认继电器参数是否与三极管匹配,避免烧坏三极管

5.布线-打板-焊接:
    布线注意事项:继电器常用于驱动大功率电器,要确保线宽符合设备电流要求。   
    打板:此项目使用嘉立创免费打样,为保证pcb能按设计要求生产,尽量在打板前进行DFM检查。

    项目实物图:




6.设备创建(soc模式)-编辑数据点:


详细数据点会在文末给出
7.代码编写:
    考虑文章篇幅,仅给出重要代码,稍后会整理项目打包放到帖子里

按键重定义:

#define GPIO_KEY_NUM                            1                           ///< Defines the total number of key members
#define KEY_0_IO_MUX                            PERIPHS_IO_MUX_GPIO4_U      ///< ESP8266 GPIO function
#define KEY_0_IO_NUM                            4                           ///< ESP8266 GPIO number
#define KEY_0_IO_FUNC                           FUNC_GPIO4                  ///< ESP8266 GPIO name
singleKey = keyInitOne(KEY_0_IO_NUM, KEY_0_IO_MUX, KEY_0_IO_FUNC,
                              key2LongPress, key2ShortPress);

595管脚初始化:


void Init_74hc595_gpio(void){
      PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);
      PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_GPIO13);
      PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, FUNC_GPIO14);
      GIZWITS_LOG( "success init 74hc595 gpio\n");
}

595驱动:

uint8_t relay_data[]={0,0,0,0,0,0,0,0};
void Ctrl_74hc595(uint8_t data[]){
      int i=7;
      HC595_RCK(0);
      os_delay_us(1);
      for(i=8;i>=0;i--){
                HC595_SCK(0);
                os_delay_us(1);
                if(data==0){
                        HC595_DATA(0);
                }else{
                        HC595_DATA(1);
                }
                os_delay_us(1);
                HC595_SCK(1);
      }
      os_delay_us(1);
      HC595_RCK(1);
}

继电器全开:

void All_relay_on(uint8_t data[]){
      int i=0;
      for(i=0;i<8;i++){
                data=1;
      }
}

事件处理:

case EVENT_ALL_RELAY_ON :
            currentDataPoint.valueALL_RELAY_ON = dataPointPtr->valueALL_RELAY_ON;
            GIZWITS_LOG("Evt: EVENT_ALL_RELAY_ON %d \n", currentDataPoint.valueALL_RELAY_ON);
            if(0x01 == currentDataPoint.valueALL_RELAY_ON)
            {
                //user handle
                  All_relay_on(relay_data);
                  Ctrl_74hc595(relay_data);
                  currentDataPoint.valueRELAY_1_ONOFF=1;
                  currentDataPoint.valueRELAY_2_ONOFF=1;
                  currentDataPoint.valueRELAY_3_ONOFF=1;
                  currentDataPoint.valueRELAY_4_ONOFF=1;
                  currentDataPoint.valueRELAY_5_ONOFF=1;
                  currentDataPoint.valueRELAY_6_ONOFF=1;
                  currentDataPoint.valueRELAY_7_ONOFF=1;
                  currentDataPoint.valueRELAY_8_ONOFF=1;
            }
            else
            {
                //user handle
            }
            break;
      case EVENT_RELAY_1_ONOFF :
            currentDataPoint.valueRELAY_1_ONOFF = dataPointPtr->valueRELAY_1_ONOFF;
            GIZWITS_LOG("Evt: EVENT_RELAY_1_ONOFF %d \n", currentDataPoint.valueRELAY_1_ONOFF);
            if(0x01 == currentDataPoint.valueRELAY_1_ONOFF)
            {
                //user handle
                  relay_data=1;
                  Ctrl_74hc595(relay_data);
            }
            else
            {
                  relay_data=0;
                  Ctrl_74hc595(relay_data);
                  currentDataPoint.valueALL_RELAY_ON=0;
                //user handle
            }
            break;

上电初始化:

void ICACHE_FLASH_ATTR userInit(void)
{
    gizMemset((uint8_t *)¤tDataPoint, 0, sizeof(dataPoint_t));

         /** Warning !!! DataPoint Variables Init , Must Within The Data Range **/

      currentDataPoint.valueALL_RELAY_ON = 0;
      currentDataPoint.valueRELAY_1_ONOFF = relay_data;
      currentDataPoint.valueRELAY_2_ONOFF = relay_data;
      currentDataPoint.valueRELAY_3_ONOFF = relay_data;
      currentDataPoint.valueRELAY_4_ONOFF = relay_data;
      currentDataPoint.valueRELAY_5_ONOFF = relay_data;
      currentDataPoint.valueRELAY_6_ONOFF = relay_data;
      currentDataPoint.valueRELAY_7_ONOFF = relay_data;
      currentDataPoint.valueRELAY_8_ONOFF = relay_data;
      Ctrl_74hc595(relay_data);

}
8.代码烧录:
    项目已做好下载模式切换和串口切换   
    烧录模式:切换启动模式按钮到接地端,同时使用排帽连接ch340c的tx rx到芯片rx tx

    串口输出模式:仅使用一个排帽连接uart1 tx和ch340c rx即可

9.设备配网:
    设备的key2用于设备配网,长按即可启动airlink配网模式,同时对应led2会亮起。

10.实际演示:
    这里使用led灯用于展示,因为继电器自身吸合有声音,因此原理图不放置led灯展示继电器状态。







项目开源地址:

**** Hidden Message *****


狼人工作室 发表于 2023-12-4 08:28:02

学习学习

李大卫 发表于 2023-12-20 14:14:19

这个教程全面可借鉴

清川sf 发表于 2024-1-29 19:05:52


这个教程全面可借鉴

阿拉丁123 发表于 2024-6-25 16:13:03

这个教程全面可借鉴

阿特57 发表于 2024-7-3 15:49:16

非常好的教程

twtr 发表于 2024-7-9 06:40:50

这教程不错。

twtr 发表于 2024-7-9 06:41:57

这教程不错,

DENNYFSH 发表于 2024-8-6 14:03:16

非常好的教程

Orangeko 发表于 2024-10-8 16:34:05

这个教程全面可借鉴

记忆时空 发表于 2024-10-31 06:27:16

这个项目很好,不错的教程

记忆时空 发表于 2024-10-31 06:27:55

这个教程全面可借鉴

记忆时空 发表于 2024-10-31 06:30:42

这个教程全面可借鉴

记忆时空 发表于 2024-10-31 06:31:00

这个教程全面可借鉴

记忆时空 发表于 2024-10-31 06:33:40

这个教程全面可借鉴
页: [1]
查看完整版本: 机智云ESP8266-8路继电器开源教程