Arduino使用8266连接物联网云平台(防遗忘版)_arduino如何接入云平台-程序员宅基地

技术标签: 物联网  

Arduino Uno、esp8266 01s、下载器(左2、4短接)、传感器若干

8266代码

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#define BUILTIN_LED 2
char P_NAME[] = "309_b";           //设置热点名称
char P_PSWD[] = "309666666";          //设置热点密码
char sub[] = "Sub/100432";    //设置设备SUB名称
char pub[] = "Pub/100432";    //设置设备PUB名称
 
const char *ssid = P_NAME;
const char *password = P_PSWD;
const char *mqtt_server = "easyiothings.com";
String reStr;
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
#define MSG_BUFFER_SIZE (50)
char msg[MSG_BUFFER_SIZE];
int value = 0;
 
void setup_wifi()
{
  delay(10);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
  }
  randomSeed(micros());
}
 
void callback(char *topic, byte *payload, unsigned int length)
{
  for (int i = 0; i < length; i++)
  {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}
 
void reconnect()
{
  while (!client.connected())
  {
    String clientId = "ESP8266Client";
    clientId += String(random(0xffff), HEX);
    if (client.connect(clientId.c_str()))
    {
      client.publish(pub, "{\"State\":\"OnLine\"}");
      client.subscribe(sub);
    }
    else
    {
      Serial.print(client.state());
      delay(5000);
    }
  }
}
 
void setup()
{
  pinMode(BUILTIN_LED, OUTPUT);
  Serial.begin(9600);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
  digitalWrite(BUILTIN_LED, HIGH);
}
 
void loop()
{
 
  if (!client.connected())
  {
    reconnect();
  }
  client.loop();
  if (Serial.available() > 0)
  {
    reStr = Serial.readStringUntil('\n');
    //检测json数据是否完整
    int jsonBeginAt = reStr.indexOf("{");
    int jsonEndAt = reStr.lastIndexOf("}");
    if (jsonBeginAt != -1 && jsonEndAt != -1)
    {
      reStr = reStr.substring(jsonBeginAt, jsonEndAt + 1);
      int str_len = reStr.length() + 1;
      char char_array[str_len];
      reStr.toCharArray(char_array, str_len);
      client.publish(pub, char_array);
    }
  }
}

Arduino代码

/*
《智慧寝室例程》
需安装的Arduino库:
  ArduinoJson、DHT sensor library
可实现功能:
  温湿度查看,灯光控制,窗帘控制,火焰检测,空调开关,空调温度设定。
接线:
  温湿度使用DHT11传感器,接10号引脚;
  窗帘舵机连接9号引脚;
  火焰传感器连接8号引脚;
  LED灯连接7号引脚;
  继电器连接6号引脚模拟空调的控制;
  将ESP8266的Rx引脚接在Arduino的Tx上,Tx引脚接在Rx上。但下载代码时需将Rx与Tx的接线移除,否则程序会报错;
*/
#include <Arduino.h>
#include <ArduinoJson.h>                  //导入JSON库,用来封装发送数据的格式
#include <DHT.h>                          //导入温湿度传感器库
#include <Servo.h>                        //控制舵机的库
 
StaticJsonDocument<200> sendJson;          // 创建JSON对象,用来存放发送数据
StaticJsonDocument<200> readJson;          // 创建JSON对象,用来存放接收到的数据
unsigned long lastUpdateTime = 0;          //记录上次上传数据时间
const unsigned long updateInterval = 4000; // 在这里设置数据发送至云平台的时间间隔,单位为毫秒
 
//定义传感器相关的引脚
 
#define DHTPIN 10                         //定义温湿度传感器引脚为10
#define DHTTYPE DHT11                     //定义温湿度传感器型号为DHT11
#define CURTAIN 9                         //设定舵机(窗帘)的Arduino引脚为9
#define COPEN 10                          //设定舵机的角度,窗帘开启时舵机的角度
#define CCLOSE 100                        //窗帘关闭时舵机的角度
#define FIRE 8                            //设定火焰传感器连接的Arduino引脚为4
#define LED 7                             //设定LED灯引脚为7
#define AIR 6                             //设定继电器(空调)的引脚为6 
#define Sensor_AO A0                      //设定烟雾传感器模拟引脚为 AO
#define Sensor_DO 2                       //设定烟雾传感器数字引脚为 2
#define Human 12
 //数字量输出:通过板载电位器设定浓度阈值,当检测到环境气体浓度超过阈值时,通过数字引脚DO输出低电平。
 //模拟量输出:浓度越高,AO引脚输出的电压值越高,通过ADC采集的模拟值越高
 
//定义相关的变量
long ID = 1000432;                // 定义设备ID号,替换成云平台生成的ID号
float temperature, humidity;    // 定义温湿度变量
int lightState,fireState,airState,curtainState;     // 定义灯光,火焰,继电器(空调),窗帘状态(0代表无或者关闭,1代表有或者打开)
int airTemperatureSet=26;       // 定义空调的设定温度,默认26度
 
DHT dht(DHTPIN, DHTTYPE);       //创建dht对象,用于操作温湿度传感器
Servo curtainServo;                  // 创建舵机对象,用来控制窗帘的舵机
unsigned int smoke = 0;     //无符号整形(非负数)
int body = 0;

// Arduino的初始化函数,仅在通电时运行一次
void setup()
{
  Serial.begin(9600);       //初始化串口,用于和esp8266进行通信,完成数据的接收与上传
  pinMode(Sensor_DO, INPUT);//初始化烟雾引脚为输入模式
  dht.begin();              //初始化温湿度传感器
  curtainServo.attach(CURTAIN);   //初始化9号引脚为舵机引脚
  pinMode(FIRE, INPUT);     //初始化火焰传感器引脚为输入模式
  pinMode(LED, OUTPUT);     //初始化LED灯引脚为输出模式
  pinMode(AIR, OUTPUT);     //初始化继电器(空调)引脚为输出模式
  pinMode(Human,INPUT);     //初始化人体红外传感器引脚为输入模式
//  Serial.flush();
}
 
// Arduino的loop函数,当setup函数执行完毕后进入该函数并一直循环运行
void loop()
{
  // 该函数段可完成数据定时上报的功能,并且不会阻塞loop函数的运行
  if (millis() - lastUpdateTime > updateInterval) 
  {
    sendJsonData();
    lastUpdateTime = millis();
  }
  // 当用户使用手机控制当前设备时ESP8266会通过串口向Arduino发送指令,该函数段可判断串口有没有接收到消息,并完成对用户消息的解析
  while (Serial.available() > 0) { // 判断串口缓冲区是否有消息
    String inputString = Serial.readStringUntil('\n');  //从串口缓冲区读入数据,并赋值给inputString变量(String变量为Arduino独有变量类型,可以简化字符串操作)
 
    //检测json数据是否完整,若通过则进行下一步的处理
    /*
      云平台向硬件下发JSON的格式为 {"Light":"1"} 类型的字符串,通常叫键值对,C语言中叫做哈希表。
      左边的"Air"为我们在云平台中定义的标识符,右边为具体的指令
    */
    int jsonBeginAt = inputString.indexOf("{");
    int jsonEndAt = inputString.lastIndexOf("}");
    if (jsonBeginAt != -1 && jsonEndAt != -1)
    {
      inputString = inputString.substring(jsonBeginAt, jsonEndAt + 1);    //截取字符串,净化json数据
      deserializeJson(readJson, inputString);                             //通过ArduinoJSON库将JSON字符串转换为方便操作的对象
      // 判断接收的指令
      if (readJson.containsKey("LightState"))   //判断云平台下发的消息是否包含Light标识符,如果是则进行下一步处理
      {
        digitalWrite(LED, (int)readJson["LightState"]); // 根据Light的值来控制小灯,0为关,1为开,由于是char类型,所以我们需要转换为int
        delay(100);
        lightState = digitalRead(LED);                  // 及时更新小灯的状态信息,这样云平台才能知道是否控制成功
      }
      else if(readJson.containsKey("CurtainState"))  // 若添加了多个功能,则使用else if隔开
      {
        //更新curtain的值
        curtainState = (int)readJson["CurtainState"];
      }
      // 空调开关设定
      else if(readJson.containsKey("AirState")){
        airState = (int)readJson["AirState"];  // 让Arduino中的空调设定值更新为云平台下放的值
      }
      // 空调温度设定
      else if(readJson.containsKey("AirTemperatureSet")){
        airTemperatureSet = (int)readJson["AirTemperatureSet"];  // 让Arduino中的空调设定值更新为云平台下放的值
      }
      delay(500);
      sendJsonData(); //向云平台发送最新的信息
    }
  }
  //判读curtainState的值是否为1,是则让舵机转到开启的角度,否则关闭
  if(curtainState){      
    curtainServo.write(COPEN); 
  } 
  else{
    curtainServo.write(CCLOSE); 
  }
  //判断空调是否为开启的状态
  if(curtainState){      
    // 判断当前室内温度是否低于设定温度,是则触发继电器,否则关闭
    if(temperature<airTemperatureSet){
      digitalWrite(AIR,HIGH);
    }
    else{
      digitalWrite(AIR,LOW);
    }
  } 
  else{
    digitalWrite(AIR,LOW);
  }
  //读取传感器数据
  fireState = digitalRead(FIRE);  //火焰传感器
  // 温湿度传感器
  temperature = dht.readTemperature();
  humidity = dht.readHumidity();
  lightState = digitalRead(LED);  //LED灯状态

  smoke = analogRead(Sensor_AO);
  Serial.print("Sensor AD Value = ");
  Serial.println(smoke);

  if (digitalRead(Sensor_DO) == LOW)
  {
    Serial.println("Alarm!");
  }

int val = digitalRead(Human);
  if (val == 1){
    delay(50);
    if (val == 1){
      body = 1;                            //反转body值
      Serial.println("have people");    //延时10s
      }
  }
  else if (body==1 && val==0){
    body = 0;
    Serial.println("people left");      //当人离开的时候打印
  }
  else {
    Serial.println("NONE");
  }
  
}
//上传数值
void sendJsonData()
{
  // 将数据添加到JSON对象中,左边为在云平台中定义的标识符,右边为变量
  sendJson["ID"] = ID;
  sendJson["Temperature"] = temperature;
  sendJson["Humidity"] = humidity;
  sendJson["LightState"] = lightState;
  sendJson["AirState"] = airState;
  sendJson["CurtainState"] = curtainState;
  sendJson["FireState"] = fireState;
  sendJson["AirTemperatureSet"] = airTemperatureSet;
  sendJson["Smoke"] = smoke;
  sendJson["Human"] = body;
  //将对象转换成字符串,并向ese8266发送消息
  serializeJson(sendJson, Serial);  
  Serial.print("\n");
}

易连智能云平台:易联智能物联网平台

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_52586052/article/details/130842939

智能推荐

React学习记录-程序员宅基地

文章浏览阅读936次,点赞22次,收藏26次。React核心基础

Linux查磁盘大小命令,linux系统查看磁盘空间的命令是什么-程序员宅基地

文章浏览阅读2k次。linux系统查看磁盘空间的命令是【df -hl】,该命令可以查看磁盘剩余空间大小。如果要查看每个根路径的分区大小,可以使用【df -h】命令。df命令以磁盘分区为单位查看文件系统。本文操作环境:red hat enterprise linux 6.1系统、thinkpad t480电脑。(学习视频分享:linux视频教程)Linux 查看磁盘空间可以使用 df 和 du 命令。df命令df 以磁..._df -hl

Office & delphi_range[char(96 + acolumn) + inttostr(65536)].end[xl-程序员宅基地

文章浏览阅读923次。uses ComObj;var ExcelApp: OleVariant;implementationprocedure TForm1.Button1Click(Sender: TObject);const // SheetType xlChart = -4109; xlWorksheet = -4167; // WBATemplate xlWBATWorksheet = -4167_range[char(96 + acolumn) + inttostr(65536)].end[xlup]

若依 quartz 定时任务中 service mapper无法注入解决办法_ruoyi-quartz无法引入ruoyi-admin的service-程序员宅基地

文章浏览阅读2.3k次。上图为任务代码,在任务具体执行的方法中使用,一定要写在方法内使用SpringContextUtil.getBean()方法实例化Spring service类下边是ruoyi-quartz模块中util/SpringContextUtil.java(已改写)import org.springframework.beans.BeansException;import org.springframework.context.ApplicationContext;import org.s..._ruoyi-quartz无法引入ruoyi-admin的service

CentOS7配置yum源-程序员宅基地

文章浏览阅读2w次,点赞10次,收藏77次。yum,全称“Yellow dog Updater, Modified”,是一个专门为了解决包的依赖关系而存在的软件包管理器。可以这么说,yum 是改进型的 RPM 软件管理器,它很好的解决了 RPM 所面临的软件包依赖问题。yum 在服务器端存有所有的 RPM 包,并将各个包之间的依赖关系记录在文件中,当管理员使用 yum 安装 RPM 包时,yum 会先从服务器端下载包的依赖性文件,通过分析此文件从服务器端一次性下载所有相关的 RPM 包并进行安装。_centos7配置yum源

智能科学毕设分享(算法) 基于深度学习的抽烟行为检测算法实现(源码分享)-程序员宅基地

文章浏览阅读828次,点赞21次,收藏8次。今天学长向大家分享一个毕业设计项目毕业设计 基于深度学习的抽烟行为检测算法实现(源码分享)毕业设计 深度学习的抽烟行为检测算法实现通过目前应用比较广泛的 Web 开发平台,将模型训练完成的算法模型部署,部署于 Web 平台。并且利用目前流行的前后端技术在该平台进行整合实现运营车辆驾驶员吸烟行为检测系统,方便用户使用。本系统是一种运营车辆驾驶员吸烟行为检测系统,为了降低误检率,对驾驶员视频中的吸烟烟雾和香烟目标分别进行检测,若同时检测到则判定该驾驶员存在吸烟行为。进行流程化处理,以满足用户的需要。

随便推点

STM32单片机示例:多个定时器同步触发启动_stm32 定时器同步-程序员宅基地

文章浏览阅读3.7k次,点赞3次,收藏14次。多个定时器同步触发启动是一种比较实用的功能,这里将对此做个示例说明。_stm32 定时器同步

android launcher分析和修改10,Android Launcher分析和修改9——Launcher启动APP流程(转载)...-程序员宅基地

文章浏览阅读348次。出处 : http://www.cnblogs.com/mythou/p/3187881.html本来想分析AppsCustomizePagedView类,不过今天突然接到一个临时任务。客户反馈说机器界面的图标很难点击启动程序,经常点击了没有反应,Boss说要优先解决这问题。没办法,只能看看是怎么回事。今天分析一下Launcher启动APP的过程。从用户点击到程序启动的流程,下面针对WorkSpa..._回调bubbletextview

Ubuntu 12 最快的两个源 个人感觉 163与cn99最快 ubuntu安装源下包过慢_un.12.cc-程序员宅基地

文章浏览阅读6.2k次。Ubuntu 12 最快的两个源 个人感觉 163与cn99最快 ubuntu下包过慢 1、首先备份Ubuntu 12.04源列表 sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup (备份下当前的源列表,有备无患嘛) 2、修改更新源 sudo gedit /etc/apt/sources.list (打开Ubuntu 12_un.12.cc

vue动态路由(权限设置)_vue动态路由权限-程序员宅基地

文章浏览阅读5.8k次,点赞6次,收藏86次。1.思路(1)动态添加路由肯定用的是addRouter,在哪用?(2)vuex当中获取到菜单,怎样展示到界面2.不管其他先试一下addRouter找到router/index.js文件,内容如下,这是我自己先配置的登录路由现在先不管请求到的菜单是什么样,先写一个固定的菜单通过addRouter添加添加以前注意:addRoutes()添加的是数组在export defult router的上一行图中17行写下以下代码var addRoute=[ { path:"/", name:"_vue动态路由权限

JSTL 之变量赋值标签-程序员宅基地

文章浏览阅读8.9k次。 关键词: JSTL 之变量赋值标签 /* * Author Yachun Miao * Created 11-Dec-06 */关于JSP核心库的set标签赋值变量,有两种方式: 1.日期" />2. 有种需求要把ApplicationResources_zh_CN.prope

VGA带音频转HDMI转换芯片|VGA转HDMI 转换器方案|VGA转HDMI1.4转换器芯片介绍_vga转hdmi带音频转换器,转接头拆解-程序员宅基地

文章浏览阅读3.1k次,点赞3次,收藏2次。1.1ZY5621概述ZY5621是VGA音频到HDMI转换器芯片,它符合HDMI1.4 DV1.0规范。ZY5621也是一款先进的高速转换器,集成了MCU和VGA EDID芯片。它还包含VGA输入指示和仅音频到HDMI功能。进一步降低系统制造成本,简化系统板上的布线。ZY5621方案设计简单,且可以完美还原输入端口的信号,此方案设计广泛应用于投影仪、教育多媒体、视频会议、视频展台、工业级主板显示、手持便携设备、转换盒、转换线材等产品设计上面。1.2 ZY5621 特性内置MCU嵌入式VGA_vga转hdmi带音频转换器,转接头拆解

推荐文章

热门文章

相关标签