文档章节

arduino+php+sinacloud+微信 监控led及室温

道酬勤
 道酬勤
发布于 2016/05/31 09:05
字数 1381
阅读 457
收藏 4
点赞 1
评论 0

      前言:生命不息,折腾不止。这是一种对生命的认知及态度。吾本是学软件的,但由于大学期间接触到的社团有搞硬件的,看到他们搞的遥控小车,小四轴。。。觉得他们好geek,于是也对硬件愈发的感兴趣。业余时间研究一下硬件,积累了一点硬件知识。一直期盼着做一个小项目来实战一下。某日在arduino论坛发现了一位大神的作品是用微信控制arduino的,于是在他的作品上演译了一番。

     硬件:

        arduino uno(¥25/一块,原谅我穷B只能用山寨的了),

       enc28j60(¥13/一块,以太网模块),DHT11(温湿度传感器,便宜),MQ-2(烟雾传感器,也不贵)

        led(在废弃家电上扒下来的),

        杜邦线(若干根,焊工好的话,可以从废弃家电上扒下来再用来焊接)。

帐号准备:微信公众号或测试号,新浪云帐号(新浪云免费的空间足够使用,由于最近学了springmvc,想用java写,但java环境初期都要收费,无奈只好用原文的php)。

硬件接线:arduino uno  与 enc28j60    

Enc28j60 Arduino UNO
VCC 3.3V
GND GND
SCK Pin 13
SO Pin 12
SI Pin 11
CS Pin 10

 

arduino uno与DHT11接线说明

arduino uno与MQ-2接线说明

实物:

 

一切线路okay!下面准备烧录程序:(使用arduino ide将下面代码烧录进uno板,两个库文件需要放进ide的libraries下:文件)

//   
//   FILE:  dht_test.pde  
// PURPOSE: DHT library test sketch for Arduino  
//  


#include 
 #include     
#define DHT11_PIN 6//put the sensor in the digital pin 6
 
EthernetClient client;
signed long next;
char server[] = "1.smarthousetest.applinzi.com";
char state = '0';
char c;
unsigned long lastConnectionTime = 0;          
boolean lastConnected = false;                 
const unsigned long postingInterval = 200*1000; 
double temperature=0;
double humidity=0;
double smoke=0;
int ledPin=2; //设定控制LED的数字IO脚
dht DHT;  
  
  
void setup()  
{  
  Serial.begin(9600);  
  Serial.println("DHT TEST PROGRAM ");  
  Serial.print("LIBRARY VERSION: ");  
  Serial.println(DHT_LIB_VERSION);  
  Serial.println();  
  Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");  

 // 设置串口通信波特率
  uint8_t mac[6] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xE1};
  IPAddress myIP(192,168,0,110);
  Serial.println("*****");
  Ethernet.begin(mac,myIP);
  Serial.print("My IP address: ");
  Serial.println(Ethernet.localIP());

  pinMode(5,OUTPUT);
  
}  
  
void loop()  
{  
  
  // READ DATA  
  Serial.print("DHT11, \t");  
 int chk = DHT.read11(DHT11_PIN);  
  switch (chk)  
  {  
    case 0:  Serial.print("OK,\t"); break;  
    case -1: Serial.print("Checksum error,\t"); break;  
    case -2: Serial.print("Time out error,\t"); break;  
    default: Serial.print("Unknown error,\t"); break;  
  }  
 // DISPLAT DATA  
  Serial.print(DHT.humidity,1);  
  Serial.print(",\t");  
  Serial.println(DHT.temperature,1);  

temperature=DHT.temperature;
humidity=DHT.humidity;
temperature=DHT.temperature;


 if(state == '0'){
    digitalWrite(5, LOW);      
  }else if(state == '1'){
    digitalWrite(5, HIGH);
  }

    smoke=analogRead(0);
    Serial.println(smoke,DEC);

if(smoke>=300){//烟雾浓度值大于300时,自动亮
   digitalWrite(ledPin,HIGH); //设定PIN5脚为LOW = 0V
}else{
   digitalWrite(ledPin,LOW); //设定PIN5脚为LOW = 0V
}
    

  while(client.available()) {
    c = client.read();
    if (c == '{'){
      state = client.read();
    }
    Serial.println(state);
   
  }


 
  if (!client.connected() && lastConnected) {
    Serial.println("disconnecting**.");
    client.stop();
  }
 
  if(!client.connected()) {
 Serial.println("!client.connected()");
    
    if (client.connect(server, 80)) {
  Serial.println(client.connect(server, 80));
      // send the HTTP PUT request:
      client.print("GET /update.php?token=smarthouse&temperature=");
      client.print(temperature);
      client.print("&humidity=");
      client.print(humidity);
      client.print("&smoke=");
      client.print(smoke);
      client.println(" HTTP/1.1");
      client.println("Host: 1.smarthousetest.applinzi.com");//项目url
      client.println("Connection: close");
      client.println();
 
      lastConnectionTime = millis();
    }else {
      Serial.println("connection failed");
      Serial.println("disconnecting.////");
      client.stop();
    }
  }
  lastConnected = client.connected();
  
  
  delay(1000);  
}  
//  
// END OF FILE  
//  


  烧录完成,则将服务器端的项目部署上去。部署步骤省略

index.php:

FromUserName;
$toUserName = $xmlObj->ToUserName;
$msgType = $xmlObj->MsgType;
 
 
if($msgType == 'text'){
        $content = $xmlObj->Content;
}else{
        $retMsg = '只支持文本和语音消息';
}
 
if (strstr($content, "温度")) {
        $con = mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS); 
        mysql_select_db("app_smarthousetest", $con);
 
        $result = mysql_query("SELECT * FROM sensor_data");
        while($arr = mysql_fetch_array($result)){
          if ($arr['ID'] == 0) {
                  $tempr = $arr['temperature'];
          }
        }
        mysql_close($con);
 
    $retMsg = "亲爱的主人,你的房间的温度为".$tempr."℃。";
}else if(strstr($content, "湿度")) {
        $con = mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS); 
        mysql_select_db("app_smarthousetest", $con);
 
        $result = mysql_query("SELECT * FROM sensor_data");
        while($arr = mysql_fetch_array($result)){
          if ($arr['ID'] == 0) {
                  $tempr = $arr['humidity'];
          }
        }
        mysql_close($con);
 
    $retMsg = "亲爱的主人,你的房间的湿度为".$tempr."%";
}else if(strstr($content, "烟雾浓度")) {
        $con = mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS); 
        mysql_select_db("app_smarthousetest", $con);
 
        $result = mysql_query("SELECT * FROM sensor_data");
        while($arr = mysql_fetch_array($result)){
          if ($arr['ID'] == 0) {
                  $tempr = $arr['smoke'];
          }
        }
        mysql_close($con);
 
    $retMsg = "亲爱的主人,你的房间的烟雾浓度值为".$tempr;
}else if (strstr($content, "开灯")) {
        $con = mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS); 
 
 
        $dati = date("h:i:sa");
        mysql_select_db("app_smarthousetest", $con);
 
        $sql ="UPDATE led_data SET create_time='$dati',status = '1'  WHERE ID = '0'";//修改开关状态值
 
        if(!mysql_query($sql,$con)){
            die('Error: ' . mysql_error);
        }else{
                mysql_close($con);
                $retMsg = "好的";
        }
}else if (strstr($content, "关灯")) {
        $con = mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS); 
 
 
        $dati = date("h:i:sa");
        mysql_select_db("app_smarthousetest", $con);
 
        $sql ="UPDATE led_data SET create_time='$dati',status = '0'
        WHERE ID = '0'";//修改开关状态值
 
        if(!mysql_query($sql,$con)){
            die('Error: ' . mysql_error());
        }else{
                mysql_close($con);
                $retMsg = "好的";
        }        
}else{
        $retMsg = "暂时不支持该命令";
}
 
//XML信息
$retTmp = "<xml>
                <ToUserName><![CDATA[%s]]></ToUserName>
                <FromUserName><![CDATA[%s]]></FromUserName>
                <CreateTime>%s</CreateTime>
                <MsgType><![CDATA[text]]></MsgType>
                <Content><![CDATA[%s]]></Content>
                <FuncFlag>0</FuncFlag>
                </xml>";
$resultStr = sprintf($retTmp, $fromUserName, $toUserName, time(), $retMsg);
 
//反馈到微信服务器
echo $resultStr;
?>

 

update.php

<?php 
if (($_GET['temperature'] || $_GET['humidity'] || $_GET['smoke'] )&& ($_GET['token'] == "smarthouse")) {//可以改token,这相当于密码,在Arduino端改成相应的值即可
        $con = mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS); 
        $temperature = $_GET['temperature'];
        $humidity = $_GET['humidity'];
        $smoke = $_GET['smoke'];
        mysql_select_db("app_smarthousetest", $con);//要改成相应的数据库名
 
        $result = mysql_query("SELECT * FROM led_data");
        while($arr = mysql_fetch_array($result)){//找到需要的数据的记录,并读出状态值
                if ($arr['ID'] == 0) {
                        $status = $arr['status'];
                }
        }
        $dati = date("h:i:sa");//获取时间
        $sql ="UPDATE sensor_data SET create_time='$dati',temperature = '$temperature',humidity = '$humidity',smoke = '$smoke'
        WHERE ID = '0'";//更新相应的传感器的值
        if(!mysql_query($sql,$con)){
            die('Error: ' . mysql_error());//如果出错,显示错误
        }
        mysql_close($con);
        echo "{".$status."}";//返回状态值,加“{”是为了帮助Arduino确定数据的位置
}else{
        echo "Permission Denied";//请求中没有type或data或token或token错误时,显示Permission Denied
}
?>
 

 

数据库:

sensor_data

id id int
温度 temperature float
湿度 humidity float
烟雾浓度 smoke float
创建时间 create_time dataTime

led_data

id id int
状态 status int
创建时间 create_time dataTime

 

一切基本完成,就差将申请的微信公众号,使用开发者模式,将url填写为项目的url,这里的为:1.smarthousetest.applinzi.com。token则为:smarthouse。

 

下面就是正式的调用了,关注公众号后,则可实现如下图功能:

 

折腾多时,终于完成!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
道酬勤
粉丝 12
博文 39
码字总数 20898
作品 0
深圳
程序员
看不见的红外光能愚弄脸部识别软件

复旦大学和阿里巴巴的研究人员在预印本网站 arxiv 发表论文(PDF),描述了一种能愚弄脸部识别软件的“攻击方法”,他们利用安装在帽檐的红外 LED 灯照亮脸部,投影 CCTV 摄像头能看见但人眼...

solidot ⋅ 03/27 ⋅ 0

基于用户投票的排名算法(四):牛顿冷却定律

这个系列的前三篇,介绍了Hacker News,Reddit和Stack Overflow的排名算法。 今天,讨论一个更一般的数学模型。 这个系列的每篇文章,都是可以分开读的。但是,为了保证所有人都在同一页上,...

阮一峰 ⋅ 2012/03/16 ⋅ 0

基于用户投票的排名算法(四):牛顿冷却定律

这个系列的前三篇,介绍了Hacker News,Reddit和Stack Overflow的排名算法。 今天,讨论一个更一般的数学模型。 这个系列的每篇文章,都是可以分开读的。但是,为了保证所有人都在同一页上,...

红薯 ⋅ 2012/03/20 ⋅ 7

Cubie PM2.5 监控小程序

Cubietruck 的 led 闪的人眼睛疼,也许你已经把它给关了,这里我合理利用了一下 led 开发了一个利用它们来显示空气质量的小应用,这个小应用会获取当前的空气质量并用 led 灯的颜色来显示: ...

cubieboard ⋅ 2014/08/12 ⋅ 0

「镁客早报」微信将开通修改个人账号功能;韩国拟于2020年发射月球轨道船

  中国首颗高通量国际商业卫星成功定点;阿里江苏云计算数据中心落户南通。   1. 中国首颗高通量国际商业卫星成功定点      近日,中国首颗高通量国际商业卫星阿尔及利亚一号通信卫星...

镁客网 ⋅ 2017/12/20 ⋅ 0

告别「碎屏险」,这些新技术能让屏幕自我修复

摘要 屏幕碎了再也不用高价换新了。 智能手机已成为日常生活的必需品,但每个人都会遇到屏幕破损的问题,哪怕是在的小心使用手机的情况下。一旦屏幕碎裂,你必须要更换屏幕。但在近日,日本科...

昵称比较好记 ⋅ 01/02 ⋅ 0

小公司诉微软Windows Phone侵犯其LED专利

苹果通常是世界各地专利巨人的首选目标,但是看起来这种关注可以很容易地转移到任何其他大型科技公司,这些公司在这种情况下有足够的资金来支付潜在的和解费用。这一次,微软可能不得不与勒梅...

稿源:cnBeta.COM ⋅ 2017/11/09 ⋅ 0

人类究竟可以多耐热?

  当室外的温度稍微高于正常的体温,人就会感到不舒适。   人体正常的体温值一般在36.8℃到37℃左右。身体的不同位置有不同的温度。例如,直接测量体腔内部的直肠或者阴道的温度通常比口...

镁客网 ⋅ 2017/12/23 ⋅ 0

LED灯RGB蓝牙4.0控制方案说明

LED灯RGB蓝牙4.0控制方案说明 一、方案设计背景 1、必要性; ■ 家装的渲染灯光成为时尚,智能家居渐成趋势; ■ 家用多样遥控器严重浪费资源; ■ 智能操控成为大众普遍操作需求; 2、可能性...

智能家居方案 ⋅ 2017/12/03 ⋅ 0

希捷:留神固态硬盘的致命缺陷,闲置时数据会“遇热蒸发”

如今越来越多的笔记本、台式机和平板电脑开始采用相比机械硬盘性能有大幅提升的固态硬盘(SSD),但是如果数据安全没有基本保障,再高的硬盘性能指标也将毫无意义。 近日希捷公司的Alvin Cox...

李辉 ⋅ 2015/05/17 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Greys Java在线问题诊断工具

Greys是一个JVM进程执行过程中的异常诊断工具。 在不中断程序执行的情况下轻松完成JVM相关问题排查工作 目标群体 有时候突然一个问题反馈上来,需要入参才能完成定位,但恰恰没有任何日志。回...

素雷 ⋅ 29分钟前 ⋅ 0

git从远程仓库拉取代码的常用指令

一种(比较麻烦的)拉代码的方法 git clone //克隆代码库,与远程代码库的主干建立连接,如果主干已经在就不用再clone啦,克隆路径为当前路径下的新创建的文件夹 git checkout -b //本地建立...

Helios51 ⋅ 43分钟前 ⋅ 0

005. 深入JVM学习—Java堆内存参数调整

1. JVM整体内存调整图解(调优关键) 实际上每一块子内存区域都会存在一部分可变伸缩区域,其基本流程:如果内存空间不足,则在可变的范围之内扩大内存空间,当一段时间之后,内存空间不紧张...

影狼 ⋅ 48分钟前 ⋅ 0

内存障碍: 软件黑客的硬件视图

此文为笔者近日有幸看到的一则关于计算机底层内存障碍的学术论文,并翻译(机译)而来[自认为翻译的还行],若读者想要英文原版的论文话,给我留言,我发给你。 内存障碍: 软件黑客的硬件视图...

Romane ⋅ 今天 ⋅ 0

SpringCloud 微服务 (七) 服务通信 Feign

壹 继续第(六)篇RestTemplate篇 做到现在,本机上已经有注册中心: eureka, 服务:client、order、product 继续在order中实现通信向product服务,使用Feign方式 下面记录学习和遇到的问题 贰 or...

___大侠 ⋅ 今天 ⋅ 0

gitee、github上issue标签方案

目录 [TOC] issue生命周期 st=>start: 开始e=>end: 结束op0=>operation: 新建issueop1=>operation: 评审issueop2=>operation: 任务负责人执行任务cond1=>condition: 是否通过?op3=>o......

lovewinner ⋅ 今天 ⋅ 0

浅谈mysql的索引设计原则以及常见索引的区别

索引定义:是一个单独的,存储在磁盘上的数据库结构,其包含着对数据表里所有记录的引用指针. 数据库索引的设计原则: 为了使索引的使用效率更高,在创建索引时,必须考虑在哪些字段上创建索...

屌丝男神 ⋅ 今天 ⋅ 0

String,StringBuilder,StringBuffer三者的区别

这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。 首先说运行速度,或者说是, 1.执行速度 在这方面运行速度快慢为:StringBuilder(线程不安全,可变) > StringBuffer...

时刻在奔跑 ⋅ 今天 ⋅ 0

java以太坊开发 - web3j使用钱包进行转账

首先载入钱包,然后利用账户凭证操作受控交易Transfer进行转账: Web3j web3 = Web3j.build(new HttpService()); // defaults to http://localhost:8545/Credentials credentials = Wallet......

以太坊教程 ⋅ 今天 ⋅ 0

Oracle全文检索配置与实践

Oracle全文检索配置与实践

微小宝 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部