作者:一聲嘆息 | 更新時間:2020-12-27 | 瀏覽量:764
#include <aJSON.h>
#include <RSCG12864B.h>//引用庫文件
#include <OneWire.h>
#include <DallasTemperature.h>
#include <SoftwareSerial.h>
//============= 此處必須修改============
String DEVICEID = "19567"; // 你的設備ID=======
String APIKEY = "1008154e0"; // 設備密碼==
String INPUTID = "17560"; //接口ID==============
//=======================================
// 數據輸出腳接開發板數字引腳2(溫度傳感器)
#define ONE_WIRE_BUS 2
char Temp_Buffer[6];
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
float T_sum;
int incomedate = 0;
int relayPin = 8; //繼電器引腳
int IN1 = 4; // IN1 connected to pin 4
int IN2 = 5;
int ENA = 3;
int IN3 = 6; // IN3 connected to pin6
int IN4 = 7;
int ENB = 8;
unsigned long time = 1200; //delay time
int value = 100; // the duty cycle(0-255)
unsigned long lastCheckStatusTime = 0; //記錄上次報到時間
unsigned long lastUpdateTime = 0;//記錄上次上傳數據時間
const unsigned long postingInterval = 40000; // 每隔40秒向服務器報到一次
const unsigned long updateInterval = 5000; // 數據上傳間隔時間5秒
unsigned long checkoutTime = 0;//登出時間
void setup() {
Serial.begin(115200);
pinMode(relayPin, OUTPUT);
RSCG12864B.begin();//串口初始化
RSCG12864B.brightness(255);//屏幕亮度
sensors.begin(); //初始化總線
RSCG12864B.clear();
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
delay(5000);//等一會兒ESP8266
}
void loop() {
// put your main code here, to run repeatedly:
//當前溫度為:B5 B1 C7 B0 CE C2 B6 C8 CE AA A3 BA
char chn[]={char(0xB5), char(0xB1),char(0xC7),char(0xB0),char(0xCE),char(0xC2),char(0xB6),char(0xC8),char(0xCE),char(0xAA),char(0xA3),char(0xBA),0,};//當前溫度為:
sensors.requestTemperatures(); // 發送命令獲取溫度,
//向總線上所有設備發送溫度轉換請求,默認情況下該方法會阻塞
dtostrf(sensors.getTempCByIndex(0),5,2,Temp_Buffer); // float 到 char
RSCG12864B.print_string_12_xy(14,13,chn);//坐標16,15,顯示chn里的內容(當前溫度為:)
RSCG12864B.print_string_12(Temp_Buffer);//顯示溫度
delay(500);
//每一定時間查詢一次設備在線狀態,同時替代心跳
if (millis() - lastCheckStatusTime > postingInterval)
{
checkStatus();
}
//checkout 50ms 后 checkin
if ( checkoutTime != 0 && millis() - checkoutTime > 50 )
{
checkIn();
checkoutTime = 0;
}
//每隔一定時間上傳一次數據
if (millis() - lastUpdateTime > updateInterval)
{
update1(DEVICEID, INPUTID, sensors.getTempCByIndex(0)); //上傳溫度
lastUpdateTime = millis();
}
//讀取串口信息
while (Serial.available()) {
String inputString = Serial.readStringUntil('\n');
//檢測json數據是否完整
int jsonBeginAt = inputString.indexOf("{");
int jsonEndAt = inputString.lastIndexOf("}");
if (jsonBeginAt != -1 && jsonEndAt != -1) {
//凈化json數據
inputString = inputString.substring(jsonBeginAt, jsonEndAt + 1);
int len = inputString.length() + 1;
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");
if (!method)
{
return;
}
String M = method->valuestring;
if (M == "WELCOME TO BIGIOT") {
// checkOut();
checkoutTime = millis();
return;
}
if (M == "connected") {
checkIn();
}
if (M == "say") {
aJsonObject* content = aJson.getObjectItem(msg, "C");
aJsonObject* client_id = aJson.getObjectItem(msg, "ID");
String C = content->valuestring;
String F_C_ID = client_id->valuestring;
if (C == "startdc") //發送指令 playdc ,直流電機啟動
{
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(ENA, value);
delay(time);
say(F_C_ID, "d-c generator start!");
}
if (C == "stopdc") //發送指令 stopdc ,直流電機停止
{
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(ENA, 0);
delay(time);
say(F_C_ID, "d-c generator stop!");
}
if (C == "waterin") {
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
delay(time);
say(F_C_ID, "正在抽水進來!");
}
if (C == "waterout") {
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
delay(time);
say(F_C_ID, "正在抽水出去!");
}
if (C == "waterstop")
{
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
delay(time);
say(F_C_ID, "抽水已經停止!");
}
if (C == "Templay")
{
digitalWrite(relayPin, LOW);
say(F_C_ID, "relay 開始啟動!");
}
if (C == "Temstop")
{
digitalWrite(relayPin, HIGH);
say(F_C_ID, "relay Stop!");
}
}
}
//發送say指令,用于設備與用戶、設備與設備間通訊
//{"M":"say","ID":"xx1","C":"xx2","SIGN":"xx3"}\n
void say(String ID, String c) {
Serial.print("{\"M\":\"say\",\"ID\":\"");
Serial.print(ID);
Serial.print("\",\"C\":\"");
Serial.print(c);
Serial.print("\"}\r\n");
}
//設備登錄
//{"M":"checkin","ID":"xx1","K":"xx2"}\n
void checkIn() {
Serial.print("{\"M\":\"checkin\",\"ID\":\"");
Serial.print(DEVICEID);
Serial.print("\",\"K\":\"");
Serial.print(APIKEY);
Serial.print("\"}\n");
}
//強制設備下線,用消除設備掉線延時
//{"M":"checkout","ID":"xx1","K":"xx2"}\n
void checkOut() {
Serial.print("{\"M\":\"checkout\",\"ID\":\"");
Serial.print(DEVICEID);
Serial.print("\",\"K\":\"");
Serial.print(APIKEY);
Serial.print("\"}\n");
}
//查詢設備在線狀態
//{"M":"status"}\n
void checkStatus() {
Serial.print("{\"M\":\"status\"}\n");
lastCheckStatusTime = millis();
}
//上傳一個接口數據
//{"M":"update","ID":"2","V":{"2":"120"}}\n
void update1(String did, String inputid, float value) {
Serial.print("{\"M\":\"update\",\"ID\":\"");
Serial.print(did);
Serial.print("\",\"V\":{\"");
Serial.print(inputid);
Serial.print("\":\"");
Serial.print(value);
Serial.println("\"}}");
}
//同時上傳兩個接口數據調用此函數
//{"M":"update","ID":"112","V":{"6":"1","36":"116"}}\n
void update2(String did, String inputid1, float value1, String inputid2, float value2) {
Serial.print("{\"M\":\"update\",\"ID\":\"");
Serial.print(did);
Serial.print("\",\"V\":{\"");
Serial.print(inputid1);
Serial.print("\":\"");
Serial.print(value1);
Serial.print("\",\"");
Serial.print(inputid2);
Serial.print("\":\"");
Serial.print(value2);
Serial.println("\"}}");
}