作者:huihong668 | 更新時間:2018-04-13 | 瀏覽量:2585
這是一個采用esp8266 12f模塊做的 在貝殼平臺上點亮LED燈 和 用esp8266模塊上傳AM2320溫濕度 的雙向實驗
使用Arduino IDE 編寫的一個實驗程序,是用HTTP協義的。
可以用微信公眾號控制,也可以用貝殼APP控制,也可以在貝殼網控制
詳情請看源碼說明 感謝貝殼平臺 傳輸速度快,穩定性高,協義簡單。
這是連接貝殼提供的例程 http://github.com/bigiot/bigiotArduino
1:下載下來后解壓,打開libraries 把ajson文件夾 復制,粘貼 到你安裝arduino的libraries目錄下
2:打開解壓下來的文件夾 打開examples esp8266 ESP8266wifi control4 然后打開control4.ino
3:粘貼以下的代碼替代control4.ino的源碼,修改自己wifi帳號密碼 和貝殼的設備號和key
/*
此文件需安裝Arduino esp8266開發環境支持,環境搭建參見:http://www.eqytg.org/talk/237.html
代碼進行調整,修復了部分bug,解決了斷線重連問題,此代碼可以直接燒入到nodemcu模塊,分享代碼希望對大家有幫助
*/
//在貝殼物聯上的設備,千萬不要勾選加密登陸,不然會登不上的。
#include
#include
#include "dht11.h"
//============= 此處必須修該============
String DEVICEID="xxxx"; // 你的設備編號 ==
String APIKEY = "xxxxx"; // 設備密碼==
const String INPUTID="xxxx";//溫度接口
const String INPUTID1="xxxx";//濕度接口
//=======================================
unsigned long lastCheckInTime = 0; //記錄上次報到時間
unsigned long lastUpdateTime = 0;
const unsigned long postingInterval = 40000; // 每隔40秒向服務器報到一次
const unsigned long updateInterval = 5000; // delay between 2 datapoints, 5s
const char* ssid = "xxxxx";//無線名稱
const char* password = "xxxxxx";//無線密碼
const char* host = "www.eqytg.org";
const int httpPort = 8181;//http端口
int pins[4] = {D5,D6,D7,D8};//led pin
int state[4] = {LOW,LOW,LOW,LOW};
int arr_len = sizeof(pins)/sizeof(pins[0]);
void setup() {
Serial.begin(115200);
delay(1000);
WiFi.begin(ssid, password);
//默認輸出關閉電頻
for(int i=0;i pinMode(pins[i], OUTPUT);
digitalWrite(pins[i], state[i]);
}
Init2320();
}
WiFiClient client;
void loop() {
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()>0)&&(millis()<10000)){//如果系統時間重新從0計算的話,就復位檢測時間和更新時間
lastCheckInTime=0;
lastUpdateTime=0;
}
if(millis() - lastCheckInTime > postingInterval || lastCheckInTime==0) {//定期向服務器報到,以防斷線
checkIn();
Serial.println("posting");
}
if((millis() - lastUpdateTime > updateInterval) ) {//定時采集溫濕度向服務器發送
int temp=0;
int hut=0;
sensors_event_t event;
dht.temperature().getEvent(&event);//獲取溫度
// update1(DEVICEID,INPUTID,event.temperature);//向服務器更新溫度
temp=event.temperature;
hut=dht.humidity().getEvent(&event);//獲取濕度
hut=event.relative_humidity;
//update1(DEVICEID,INPUTID1,event.relative_humidity);//向服務器更新濕度
update2(DEVICEID,INPUTID,temp,INPUTID1,hut);//向服務器更新溫濕度 ,數據多的時候使用這個函數連續發送,不然一個個發送,結果只能發到一個
Serial.print(temp);
Serial.print("\n");
Serial.print(hut);
Serial.print("\n");
}
// 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"){//判斷頭字符是否為say
String C = content->valuestring;//獲取人發送的數據
String F_C_ID = client_id->valuestring;
if(C == "play"){//判斷人發送的數據進行邏輯處理
for(int i=0;i state[i] = HIGH;
digitalWrite(pins[i], state[i]);
}
sayToClient(F_C_ID,"LED All on!");//處理后向服務器向應,做了些什么
}else if(C == "stop"){
for(int i=0;i state[i] = LOW;
digitalWrite(pins[i], state[i]);
}
sayToClient(F_C_ID,"LED All off!");
}
else if(C == "12"){//判斷人發送的數據進行邏輯處理
digitalWrite(12, HIGH);
digitalWrite(13, LOW);
digitalWrite(15, LOW);
sayToClient(F_C_ID,"GREEN ON!");//處理后向服務器向應,做了些什么
}
else if(C == "13"){//判斷人發送的數據進行邏輯處理
digitalWrite(12, LOW);
digitalWrite(13, HIGH);
digitalWrite(15, LOW);
sayToClient(F_C_ID,"BLUE ON!");//處理后向服務器向應,做了些什么
}
else if(C == "15"){//判斷人發送的數據進行邏輯處理
digitalWrite(12, LOW);
digitalWrite(13, LOW);
digitalWrite(15, HIGH);
sayToClient(F_C_ID,"RED ON!");//處理后向服務器向應,做了些什么
}
else{
int pin = C.toInt();
if(pin > 0 && pin <= arr_len){//按下字符2-4 LED三色燈可以混色輸出
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();
}
//向服務器對話函數,服務器向8266對話也是這樣的格式,收到后在串口打出來
void sayToClient(String client_id, String content){
String msg = "{\"M\":\"say\",\"ID\":\"" + client_id + "\",\"C\":\"" + content + "\"}\n";
client.print(msg);
lastCheckInTime = millis();
}
void update1(String did, String inputid, int value){//上傳一個數據 的函數
client.print("{\"M\":\"update\",\"ID\":\"");
client.print(did);
client.print("\",\"V\":{\"");
client.print(inputid);
client.print("\":\"");
client.print(value);
client.println("\"}}");
lastCheckInTime = millis();
lastUpdateTime= millis();
Serial.print("update:");
Serial.print(inputid);
Serial.print("->");
Serial.println(value);
}
//同時上傳兩個接口數據調用此函數
void update2(String did, String inputid1, int value1, String inputid2, int value2){
client.print("{\"M\":\"update\",\"ID\":\"");
client.print(did);
client.print("\",\"V\":{\"");
client.print(inputid1);
client.print("\":\"");
client.print(value1);
client.print("\",\"");
client.print(inputid2);
client.print("\":\"");
client.print(value2);
client.println("\"}}");
// lastCheckInTime = millis();
lastUpdateTime= millis();
Serial.print("update:");
Serial.print(inputid1);
Serial.print("->");
Serial.print(value1);
Serial.print(" ");
Serial.print(inputid2);
Serial.print("->");
Serial.println(value2);
}
4:用筆記本新建一個C文件 然后將溫濕度的代碼粘進去。然后在arduino工程中添加這個文件,這個文件改名為dht11.h
#ifndef __DHT11_H__
#define __DHT11_H__
// DHT Temperature & Humidity Sensor
// Unified Sensor Library Example
// Written by Tony DiCola for Adafruit Industries
// Released under an MIT license.
// Depends on the following Arduino libraries:
// - Adafruit Unified Sensor Library: https://github.com/adafruit/Adafruit_Sensor
// - DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library
#include
#include
#include
#define DHTPIN 4 // Pin which is connected to the DHT sensor.
// Uncomment the type of sensor in use:
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// See guide for details on sensor wiring and usage:
// https://learn.adafruit.com/dht/overview
DHT_Unified dht(DHTPIN, DHTTYPE);
uint32_t delayMS;
void Init2320() {
// Initialize device.
dht.begin();
// Serial.println("DHTxx Unified Sensor Example");
// Print temperature sensor details.
sensor_t sensor;
dht.temperature().getSensor(&sensor);
// Serial.println("------------------------------------");
// Serial.println("Temperature");
// Serial.print ("Sensor: "); Serial.println(sensor.name);
// Serial.print ("Driver Ver: "); Serial.println(sensor.version);
// Serial.print ("Unique ID: "); Serial.println(sensor.sensor_id);
// Serial.print ("Max Value: "); Serial.print(sensor.max_value); Serial.println(" *C");
// Serial.print ("Min Value: "); Serial.print(sensor.min_value); Serial.println(" *C");
// Serial.print ("Resolution: "); Serial.print(sensor.resolution); Serial.println(" *C");
// Serial.println("------------------------------------");
// Print humidity sensor details.
dht.humidity().getSensor(&sensor);
// Serial.println("------------------------------------");
// Serial.println("Humidity");
// Serial.print ("Sensor: "); Serial.println(sensor.name);
// Serial.print ("Driver Ver: "); Serial.println(sensor.version);
// Serial.print ("Unique ID: "); Serial.println(sensor.sensor_id);
// Serial.print ("Max Value: "); Serial.print(sensor.max_value); Serial.println("%");
// Serial.print ("Min Value: "); Serial.print(sensor.min_value); Serial.println("%");
// Serial.print ("Resolution: "); Serial.print(sensor.resolution); Serial.println("%");
// Serial.println("------------------------------------");
// Set delay between sensor readings based on sensor details.
delayMS = sensor.min_delay / 1000;
}
void Display2320() {
// Delay between measurements.
delay(delayMS);
// Get temperature event and print its value.
sensors_event_t event;
dht.temperature().getEvent(&event);
if (isnan(event.temperature)) {
// Serial.println("Error reading temperature!");
}
else {
// Serial.print("Temperature: ");
Serial.print(event.temperature);
// Serial.println(" *C");
}
// Get humidity event and print its value.
dht.humidity().getEvent(&event);
if (isnan(event.relative_humidity)) {
// Serial.println("Error reading humidity!");
}
else {
// Serial.print("Humidity: ");
Serial.print(event.relative_humidity);
// Serial.println("%");
}
}
#endif
5:貝殼網注冊自己的帳號 在控制面版里,新建自己的設備 ,為這個設備添加兩個數據流 然后將程序編譯下載到esp8266上。
打開新建的設備 點擊對話輸入以下命令
我在程序上設置的數據控制LDE的命令為雙引號內:“12” “13” “15” “play” “stop”
LDE輸出為高電平亮,低電平滅。
打開數據流 可以看到濕度和溫度在每隔5秒就上傳到貝殼上
實現雙向數據傳輸
還可以下載貝殼的APP進行控制,微信公眾號也可以這個貝殼官網有下載
大家有什么看不明的,可以私信我這個帳號,也可以在貼中發問謝謝大家
最后發現在這里粘出來的代碼不能正常顯示 下面上傳了源碼
https://pan.baidu.com/s/196C3QQZtEMQnfdsGJx8gRg