数码之家

 找回密码
 立即注册
搜索
查看: 6319|回复: 10

[综合] esp01s 贝壳物联 控制relay模块继电器

[复制链接]
发表于 2020-4-24 20:32:01 | 显示全部楼层 |阅读模式
16年写过一次《ESP8266ESP-12小黄板调试,接入未来之家
由于这是个小号,当时有人说有问题也没回答。这几年工作较忙,也没心思玩这个。最近稍微闲点,看到淘宝esp01模块挺便宜,就入手了几套准备玩玩。一套相当于9.8元,运费好像是4元多,买了几套,再加上开发板,大约一套11元。可能有更便宜点的,懒得找了。

未来之家不支持天猫控制,就没继续,随便翻了翻几个帖子,好像贝壳物联简单点,就做这个了。研究了1天机智云,没研究明白暂时搁置了。但机智云刷固件那个绝对是不适合esp01了。

一.硬件基础设置

我的relay模块继电器是这样的,据说有很多版本,我这个不用任何改造。

1.烧录  
烧录时,GPIO0 与GND 短接;完成后看接口输出数据时要断开。

2.板子改造,增加按钮控制继电器
板子自带按钮与RSD 连接(感觉没啥用),断开此连接,接入GPIO2
能够实现自带按钮控制继电器

二.Arduino 基本设置

1.搜索Arduino IDE,下载。 我用的是arduino-1.8.9。
2.打开arduino ide  文件->首选项->“附加开发板管理器网址”输入
http://wechat.doit.am/package_esp8266com_index.json
如下
3.打开C:\Users\Administrator\AppData\Local\
把Arduino15 文件夹复制到此位置。(后边会给百度云链接)

三.Esp01s接入贝壳物联

1.libraries/aJson文件夹全部复制到Arduino IDE的库文件夹内。(后边会给百度云链接)
Windows系统通常位于: C:\Program Files \Arduino\libraries
2.下载百度云链接里的BEIKE2文件夹,程序在这里面。
登陆贝壳物联>>设备列表>>添加管理设备>>按提示操作完成见下图,
ID填入ino文件中  String DEVICEID="123"; // 你的设备编号  替换“123”
APIKEY 填入ino文件中 String  APIKEY = "123"; // 设备密码==   替换“123”

3.将程序上传到esp01s,开发板、各种设置按下图,端口按你实际的

三. 贝壳物联接入天猫精灵

天猫精灵>>我家>>添加设备>>搜索“贝壳”>>选第一个>>登陆贝壳账号>>按提示操作,记不清了。就能天猫精灵语音控制。



相关文件在百度云
链接:https://pan.baidu.com/s/1G75SP1_INM3jGewC2EZ2yQ
提取码:l67e


懒得下载或者就是参考一下的,源码贴这
#include <ESP8266WiFi.h>
#include <aJSON.h>

//=============  此处必须修该============
String DEVICEID="123"; // 你的设备编号   ==
String  APIKEY = "123"; // 设备密码==
const char* ssid     = "123";//无线名称
const char* password = "123";//无线密码
//=======================================
unsigned long lastCheckInTime = 0; //记录上次报到时间
const unsigned long postingInterval = 40000; // 每隔40秒向服务器报到一次

const char* host = "www.bigiot.net";
const int httpPort = 8181;
int jiange=0;
String zhuangtai;
#define pins 0  //继电器连接在8266的GPIO0上

WiFiClient client;

void setup() {
      Serial.begin(115200);
  delay(10);
  //默认输出关闭电频

    pinMode(pins, OUTPUT);
    digitalWrite(pins, HIGH);
pinMode(2,OUTPUT);
digitalWrite(2,HIGH);

  // We start by connecting to a WiFi network

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  while (!client.connect(host, httpPort)) {
Serial.println("connection failed");

delay(500);
  }
  Serial.print("connecting to ");
  Serial.println(host);
  }

void loop() {


if(digitalRead(2) == 0&&millis()-jiange>5000)  //按钮按下 且 间隔超过300ms 执行一次
{  
digitalWrite(0,!digitalRead(0));
jiange=millis();
/*if(!digitalRead(0))
{  zhuangtai="led on" ; }
  else
{zhuangtai="led off"  ;}     
zhuangtai = "{\"M\":\"say\",\"ID\":\"D" + DEVICEID + "\",\"C\":\"" +zhuangtai + "\"}\n";
  client.print(zhuangtai) ;*/
}


  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }

  // Use WiFiClient class to create TCP connections
  if (!client.connected()) {
    if (!client.connect(host, httpPort)) {
      Serial.println("connection failed");
      delay(5000);
      return;
    }
  }

  if(millis() - lastCheckInTime > postingInterval || lastCheckInTime==0) {
    checkIn();
  }

  // Read all the lines of the reply from server and print them to Serial
  if (client.available()) {
    String inputString = client.readStringUntil('\n');
    inputString.trim();
    Serial.println(inputString);
    int len = inputString.length()+1;
    if(inputString.startsWith("{") && inputString.endsWith("}")){
      char jsonString[len];
      inputString.toCharArray(jsonString,len);
      aJsonObject *msg = aJson.parse(jsonString);
      processMessage(msg);
      aJson.deleteItem(msg);         
    }
  }
}

void processMessage(aJsonObject *msg){
  aJsonObject* method = aJson.getObjectItem(msg, "M");
  aJsonObject* content = aJson.getObjectItem(msg, "C");     
  aJsonObject* client_id = aJson.getObjectItem(msg, "ID");
  if (!method) {
    return;
  }
    String M = method->valuestring;
    if(M == "say"){
      String C = content->valuestring;
      String F_C_ID = client_id->valuestring;
      if(C == "play"){

          digitalWrite(pins, LOW);

        sayToClient(F_C_ID,"LED  on!");   
      }else if(C == "stop"){

          digitalWrite(pins, HIGH);

        sayToClient(F_C_ID,"LED   off!");   
      }else{
        int pin = C.toInt();
       /* if(pin > 0 && pin <= arr_len){
          pin--;
          state[pin] = !state[pin];
          digitalWrite(pins[pin], state[pin]);
        }*/
        sayToClient(F_C_ID,"LED pin:"+pin);
      }
    }
}

void checkIn() {
    String msg = "{\"M\":\"checkin\",\"ID\":\"" + DEVICEID + "\",\"K\":\"" + APIKEY + "\"}\n";
    client.print(msg);
    lastCheckInTime = millis();
}

void sayToClient(String client_id, String content){
  String msg = "{\"M\":\"say\",\"ID\":\"" + client_id + "\",\"C\":\"" + content + "\"}\n";
  client.print(msg);
  lastCheckInTime = millis();
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 4家元 +95 收起 理由
家睦 + 50
moontree + 10 謝謝分享
aec + 20 謝謝分享
人艰不拆了 + 15

查看全部打赏

发表于 2020-4-24 21:35:31 | 显示全部楼层
本帖最后由 laimama 于 2020-4-24 21:40 编辑

relay模块的接线柱就没见质量好的,我的也坏了,焊接线了事:lol:我是做了个根据笔记本电池百分比控制的插座,来实现自动充电,延长电池寿命。
直接刷的tasmota固件,但是这个固件是控制的GPIO2口,所以模块做了点修改,比较好玩。
回复 支持 反对

使用道具 举报

发表于 2020-4-24 21:56:54 | 显示全部楼层
居家隔离时也买了一个,一直没有弄好。留下记号,有时间也掰扯掰扯。
回复 支持 反对

使用道具 举报

发表于 2020-4-24 22:03:59 来自手机浏览器 | 显示全部楼层
楼主还没说这个实际用来控制什么电器,控制灯?

打赏

参与人数 2家元 +20 收起 理由
moontree + 10 歡迎探討
zx61107 + 10 歡迎探討

查看全部打赏

回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-24 23:45:56 | 显示全部楼层
laimama 发表于 2020-4-24 21:35
relay模块的接线柱就没见质量好的,我的也坏了,焊接线了事我是做了个根据笔记本电池百分比控制的插座 ...

没有那么细的螺丝刀,所以就割掉了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-24 23:46:44 | 显示全部楼层
lglcjx 发表于 2020-4-24 21:56
居家隔离时也买了一个,一直没有弄好。留下记号,有时间也掰扯掰扯。

挺简单的,就是贝壳物联看起来有点简陋,想换换别的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-24 23:47:26 | 显示全部楼层
aec 发表于 2020-4-24 22:03
楼主还没说这个实际用来控制什么电器,控制灯?

程序是控制继电器,用继电器控制啥都行
回复 支持 反对

使用道具 举报

发表于 2020-4-25 06:53:08 来自手机浏览器 | 显示全部楼层
jsls070 发表于 2020-4-24 23:47
程序是控制继电器,用继电器控制啥都行

如果控制灯会有以下情况:1.继电器默认上电“断开”,那墙壁上的开关无法控制    2. 继电器默认上电 接通  这样墙壁上开关也可以控制,但是停电再上电 灯会常亮     3. 记录开关状态,如果关闭灯时 停电再上电就不会发生 上面第2.条的灯会常亮情况,但是这样首先用墙壁上开关也无法控制灯,要先用8266开灯
4.解决办 再加一按钮控制继电器的开与关作为复位或取代墙壁上开关。

以上用洞洞板+esp8266-12f试验控制台灯的情况,目前缺一个自恢复按键开关,准备用自恢复开关取代原台灯的开关。

打赏

参与人数 1家元 +10 收起 理由
zx61107 + 10 謝謝分享

查看全部打赏

回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-25 07:03:22 来自手机浏览器 | 显示全部楼层
aec 发表于 2020-4-25 06:53
如果控制灯会有以下情况:1.继电器默认上电“断开”,那墙壁上的开关无法控制    2. 继电器默认上电 接通 ...

我把带继电器那个模块改了按钮 ,可以控制继电器开关。如果控制灯,可以把原来灯的开关并联到模块的按钮,把原来灯的开关改造一下,变成按的时候接通,松时断开,就是和按钮一样。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-25 07:08:16 来自手机浏览器 | 显示全部楼层
aec 发表于 2020-4-25 06:53
如果控制灯会有以下情况:1.继电器默认上电“断开”,那墙壁上的开关无法控制    2. 继电器默认上电 接通 ...

你说的自恢复开关,我是把家里的翘板开关,里面加了一截自动笔的弹簧,我家翘板开关里恰好有个柱子,可以把弹簧插上面。按一下,松手就弹回来

打赏

参与人数 1家元 +6 收起 理由
aec + 6 謝謝分享

查看全部打赏

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-24 21:35 , Processed in 0.109201 second(s), 9 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

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