使用machtalk自制智慧家居-控制开关、步进电机舵机(窗帘)-Arduino中文社区 - Powered by Discuz! Archiver

weijinhe 发表于 2014-8-18 14:39

使用machtalk自制智慧家居-控制开关、步进电机舵机(窗帘)

本帖最后由 weijinhe 于 2014-10-15 12:47 编辑

http://machtalk.net/
machtalk物联网平台升级版本,支持socket长连接、MQTT轻量级传输协议,提供丰富的库类供开发者使用。下面举一个列子:socket长连接控制开关设备(开关)、步进电机舵机(窗帘)。
      1、硬件准备       (1)Arduino uno       (2)串口转wifi模块       (3)继电器模块       (4)舵机模块       (5)步进电机模块
      2、硬件连接
      (1)串口转Wifi与Arduino uno 相连接。      (2)步进电机三根线5V GND output 分别与Arduino 5V GND D(7)相连接。      (3)继电器5V GND output 分别与arduino 5V GND D(6)相连接。      (4)步进电机连接板与步进电机连接,连接板电源与arduino电源连接,N1-N4分别与arduino(8 9 10 11)。    3、烧写代码   根据您所用的Arduino板子及端口,在Tool/Board中选择。分别引用#include <Stepper.h>;#include <Servo.h>;#include <JsonParser.h>三个库。烧写代码时,串口转WIFI模块SW1扳到O,烧写完毕完毕扳到C,代码如下:
#include <Stepper.h>
#include <Servo.h>

#include <JsonParser.h>
#define STEPS 100

unsigned long last = 0;
unsigned long lasttime = 0;
String returnvalue="";
String receivevalue="";
String lastreceive="";
boolean Response = false;
int counter=0;

Servo myservo;
Stepper stepper(STEPS, 8, 9, 10, 11);

char json;
void setup()
{
    Serial.begin(115200);//设置波特率
    pinMode(13,OUTPUT);
    pinMode(6,OUTPUT);
    myservo.attach(7);
    stepper.setSpeed(100);
}
void loop()
{
Serial.println("{\"cmd\":\"login\",\"msg_id\":\"weijinhe\",\"type\":2,\"device_id\":\"66efb6120c7f48bbac10d54e8edb05fb\",\"device_pin\":\"weijinhe108\"}");
while(1)
{
   unsigned long nowtime=millis();
   if (Serial.available()) // serial receive
      {
      char c = Serial.read();      
      if (c != '\n')
      Response = true;
      else if (c == '\n')
      {
         Response = false;
      }
      if (Response)
      returnvalue += c;         
      }      

   if(nowtime-last>10000)
   {
      
      Serial.println("{\"cmd\":\"post\",\"device_id\":\"66efb6120c7f48bbac10d54e8edb05fb\",\"values\":[{\"device_value_id\":1,\"device_type_id\":1,\"value\":\"75\"}]}");
      last=nowtime;
   }
   
    if (returnvalue.length() !=0&&Response == false)
   {
       receivevalue+=returnvalue;

          if(returnvalue=="{0x11}")
         {
         Serial.println("{0x12}");
         returnvalue="";
         }
         else
      {
         int i;
         for(i=0;i<returnvalue.length();i++)
         json=returnvalue;
         json='\0';
         returnvalue="";

         JsonParser<32> parser;

         JsonHashTable hashTable = parser.parseHashTable(json);
         if (!hashTable.success())
         {
         Serial.println("JsonParser.parseHashTable() failed");
         return;
         }
         
         char* cmd = hashTable.getString("cmd");
         char* msg_id=hashTable.getString("msg_id");
         int device_value_id=hashTable.getLong("device_value_id");
         if(strcmp(cmd,"opt")==0)
         {               
         if(device_value_id==2)
          {
            int value = atoi(hashTable.getString("value"));
            digitalWrite(6,value);//继电器控制         Serial.print("{\"cmd\":\"post\",\"device_id\":\"66efb6120c7f48bbac10d54e8edb05fb\",\"values\":[{\"device_value_id\":2,\"device_type_id\":2,\"value\":\"");
            Serial.print(value);
            Serial.println("\"}]}");            
         }
         if(device_value_id==3)
          {
            int val = atoi(hashTable.getString("value"));   
            myservo.write(val);//舵机控制
            Serial.print("{\"cmd\":\"post\",\"device_id\":\"66efb6120c7f48bbac10d54e8edb05fb\",\"values\":[{\"device_value_id\":3,\"device_type_id\":1,\"value\":\"");
            Serial.print(val);
            Serial.println("\"}]}");            
         }
          if(device_value_id==4)
          {
            int bujinval = atoi(hashTable.getString("value"));   
            stepper.step(bujinval*100);
            Serial.print("{\"cmd\":\"post\",\"device_id\":\"66efb6120c7f48bbac10d54e8edb05fb\",\"values\":[{\"device_value_id\":4,\"device_type_id\":1,\"value\":\"");
            Serial.print(bujinval);//步进电机控制
            Serial.println("\"}]}");            
         }
      }
      if(strcmp(cmd,"query")==0)
         {
         Serial.print("{\"msg_id\":\"");
         Serial.print(msg_id);
         Serial.println("\",\"device_id\":\"66efb6120c7f48bbac10d54e8edb05fb\",\"cmd\":\"response\",\"data\":[{\"device_value_id\":1,\"device_type_id\":1,\"value\":\"60\"}]}");      
         }      
      }         
   }
    if(nowtime-lasttime>60000)
    {
      lasttime=nowtime;
      counter+=1;      
      if(lastreceive==receivevalue)
      {
         Serial.println("{\"cmd\":\"login\",\"msg_id\":\"weijinhe\",\"type\":2,\"device_id\":\"66efb6120c7f48bbac10d54e8edb05fb\",\"device_pin\":\"weijinhe108\"}");
      }
      lastreceive=receivevalue;
   if(counter>6)
   {
       receivevalue="";
       counter=0;
   }
   }   
}   
}
4、串口转WIFI模块配置对wifi进行配置,首先恢复出厂值。 按住模块上的RESET按钮超过6秒钟, 等待启动(约30 秒)。启动后,用电脑的WiFi扫描空间里的WiFi信号,加入WiFi,密码为 12345678。在浏览器里输入192.168.16.254, 会弹出输入用户名和密码的对话框。 用户名和密码都是admin。登陆后有如下界面: 把wifi模块设置成客户端模式。连接本地wifi网络,服务器名称api.machtalk.net 本地端口7777,配置完成后确定。
5、Machtalk物联网平台配置平台配置文档请看教程:http://machtalk.net/intro/book。把程序中继电器换成智能家居中的插座就成为了一款智能插座,把程序中舵机或步进电机可用于控制家里窗帘等,可以根据室内光照情况调节窗帘开度。
machtalk交流群:300250166





for 发表于 2014-8-18 18:49

这个要是能开门关门就好了钥匙忘记拿了手机开唯一的就是宽带停机了或者手机木流量了就卡巴死机了:L

weijinhe 发表于 2014-8-19 08:31

for 发表于 2014-8-18 18:49
这个要是能开门关门就好了钥匙忘记拿了手机开唯一的就是宽带停机了或者手机木流量了就卡巴死机了 ...

这个技术上是可以实现的,本身machtalk定义了一套和设备交互的协议。手机停机了,可以用web端开,如果家里宽带也停了,那只有找开锁公司了。
页: [1]
查看完整版本: 使用machtalk自制智慧家居-控制开关、步进电机舵机(窗帘)