收藏官网首页
查看: 2251|回复: 3

[开源项目] 机智云ESP8266-8路继电器开源教程

106

主题

107

帖子

7261

积分

论坛元老

Rank: 8Rank: 8

积分
7261
跳转到指定楼层
楼主
 楼主| 发表于 2023-9-15 20:17:01 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
免费使用STM32、APP自动代码生成工具
本帖最后由 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.代码编写:
    考虑文章篇幅,仅给出重要代码,稍后会整理项目打包放到帖子里

按键重定义:

  1. #define GPIO_KEY_NUM                            1                           ///< Defines the total number of key members
  2. #define KEY_0_IO_MUX                            PERIPHS_IO_MUX_GPIO4_U      ///< ESP8266 GPIO function
  3. #define KEY_0_IO_NUM                            4                           ///< ESP8266 GPIO number
  4. #define KEY_0_IO_FUNC                           FUNC_GPIO4                  ///< ESP8266 GPIO name
  5. singleKey[0] = keyInitOne(KEY_0_IO_NUM, KEY_0_IO_MUX, KEY_0_IO_FUNC,
  6.                                 key2LongPress, key2ShortPress);
复制代码


595管脚初始化:


  1. void Init_74hc595_gpio(void){
  2.         PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);
  3.         PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_GPIO13);
  4.         PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, FUNC_GPIO14);
  5.         GIZWITS_LOG( "success init 74hc595 gpio\n");
  6. }
复制代码


595驱动:

  1. uint8_t relay_data[]={0,0,0,0,0,0,0,0};
  2. void Ctrl_74hc595(uint8_t data[]){
  3.         int i=7;
  4.         HC595_RCK(0);
  5.         os_delay_us(1);
  6.         for(i=8;i>=0;i--){
  7.                 HC595_SCK(0);
  8.                 os_delay_us(1);
  9.                 if(data[i]==0){
  10.                         HC595_DATA(0);
  11.                 }else{
  12.                         HC595_DATA(1);
  13.                 }
  14.                 os_delay_us(1);
  15.                 HC595_SCK(1);
  16.         }
  17.         os_delay_us(1);
  18.         HC595_RCK(1);
  19. }
复制代码


继电器全开:

  1. void All_relay_on(uint8_t data[]){
  2.         int i=0;
  3.         for(i=0;i<8;i++){
  4.                 data[i]=1;
  5.         }
  6. }
复制代码


事件处理:

  1. case EVENT_ALL_RELAY_ON :
  2.             currentDataPoint.valueALL_RELAY_ON = dataPointPtr->valueALL_RELAY_ON;
  3.             GIZWITS_LOG("Evt: EVENT_ALL_RELAY_ON %d \n", currentDataPoint.valueALL_RELAY_ON);
  4.             if(0x01 == currentDataPoint.valueALL_RELAY_ON)
  5.             {
  6.                 //user handle
  7.                     All_relay_on(relay_data);
  8.                     Ctrl_74hc595(relay_data);
  9.                     currentDataPoint.valueRELAY_1_ONOFF=1;
  10.                     currentDataPoint.valueRELAY_2_ONOFF=1;
  11.                     currentDataPoint.valueRELAY_3_ONOFF=1;
  12.                     currentDataPoint.valueRELAY_4_ONOFF=1;
  13.                     currentDataPoint.valueRELAY_5_ONOFF=1;
  14.                     currentDataPoint.valueRELAY_6_ONOFF=1;
  15.                     currentDataPoint.valueRELAY_7_ONOFF=1;
  16.                     currentDataPoint.valueRELAY_8_ONOFF=1;
  17.             }
  18.             else
  19.             {
  20.                 //user handle
  21.             }
  22.             break;
  23.         case EVENT_RELAY_1_ONOFF :
  24.             currentDataPoint.valueRELAY_1_ONOFF = dataPointPtr->valueRELAY_1_ONOFF;
  25.             GIZWITS_LOG("Evt: EVENT_RELAY_1_ONOFF %d \n", currentDataPoint.valueRELAY_1_ONOFF);
  26.             if(0x01 == currentDataPoint.valueRELAY_1_ONOFF)
  27.             {
  28.                 //user handle
  29.                     relay_data[0]=1;
  30.                     Ctrl_74hc595(relay_data);
  31.             }
  32.             else
  33.             {
  34.                     relay_data[0]=0;
  35.                     Ctrl_74hc595(relay_data);
  36.                     currentDataPoint.valueALL_RELAY_ON=0;
  37.                 //user handle
  38.             }
  39.             break;
复制代码


上电初始化:

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

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

  5.         currentDataPoint.valueALL_RELAY_ON = 0;
  6.         currentDataPoint.valueRELAY_1_ONOFF = relay_data[0];
  7.         currentDataPoint.valueRELAY_2_ONOFF = relay_data[1];
  8.         currentDataPoint.valueRELAY_3_ONOFF = relay_data[2];
  9.         currentDataPoint.valueRELAY_4_ONOFF = relay_data[3];
  10.         currentDataPoint.valueRELAY_5_ONOFF = relay_data[4];
  11.         currentDataPoint.valueRELAY_6_ONOFF = relay_data[5];
  12.         currentDataPoint.valueRELAY_7_ONOFF = relay_data[6];
  13.         currentDataPoint.valueRELAY_8_ONOFF = relay_data[7];
  14.         Ctrl_74hc595(relay_data);

  15. }
复制代码

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

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

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

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







项目开源地址:

游客,如果您要查看本帖隐藏内容请回复



0

主题

1

帖子

12

积分

新手上路

Rank: 1

积分
12
板凳
发表于 2023-12-20 14:14:19 | 只看该作者
这个教程全面可借鉴

0

主题

5

帖子

83

积分

注册会员

Rank: 2

积分
83
地板
发表于 2024-1-29 19:05:52 | 只看该作者

这个教程全面可借鉴
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表