#include <Wire.h>
#include "MatrixInt.h"
#define AHT15_ADDRESS 0x38
long WNB303Timeout = 10000;
int WNB303ResetPIN = 14;
int WNB303PowerPIN = 15;
String MQTTServer = "mqttgo.io";
String MQTTPort = "1883";
String MQTTUser = "";
String MQTTPassword = "";
String MQTTPubTopicT = "denny/room/Temp";
String MQTTPubTopicH = "denny/room/Humi";
long MQTTLastPublishTime = 0;
long MQTTPublishInterval = 10000;
void setup() {
Serial.begin(115200);
Serial2.begin(115200);
Wire.begin(26, 27);
Wire1.begin(21, 22);
for (int i = 0; i <= 7; ++i) MatrixInt(i, 0);
pinMode(WNB303ResetPIN, OUTPUT);
pinMode(WNB303PowerPIN, OUTPUT);
delay(1000);
Serial.println("\r\n\r\n======================\r\nSystem Starting....");
String result = "";
WNB303Restart(10);
int tryCount = 0;
while (1) {
boolean resultb = WNB303CheckReg();
Serial.print("WNB303CheckNetReg result="); Serial.println(resultb);
if (resultb == false) {
Serial.println("時間內無法註冊網路(" + String(tryCount) + ")");
delay(10000);
}
else break;
if (tryCount++ >= 30) {
tryCount = 0;
WNB303Restart(30);
}
}
result = WNB303CheckRSSI();
Serial.print("WNB303CheckRSSI result="); Serial.println(result);
delay(10000);
}
void loop() {
if ((millis() - MQTTLastPublishTime) >= MQTTPublishInterval ) {
MatrixInt(7, 1);
String result = "";
if (!(WNB303CheckReg())) {
WNB303Restart(60);
return;
}else result = WNB303CheckRSSI();
float temperature = 0; float humidity = 0;
ReadAHT(&temperature, &humidity, Wire1);
result = mqttConnect(MQTTServer, MQTTPort, MQTTUser, MQTTPassword);
if (result == "OK") Serial.println("MQTT Connected");
String payloadT = String(temperature) ;
String payloadH = String(humidity);
result = mqttPublish(MQTTPubTopicT, "0", "0", "0", payloadT);
if (result == "OK") Serial.println("Data:\"" + payloadT + "\" Published to " + MQTTPubTopicT);
result = mqttPublish(MQTTPubTopicH, "0", "0", "0", payloadH);
if (result == "OK") Serial.println("Data:\"" + payloadH + "\" Published to " + MQTTPubTopicH);
result = mqttDisconnect();
if (result == "OK") Serial.println("MQTT Disconnected");
MQTTLastPublishTime = millis();
MatrixInt(7, 0);
}
delay(1000);
}
String mqttConnect(String Host, String Port, String MQTTUser, String MQTTPassword) {
String result = "" ;
String IP = AT2WNB303("AT+EDNS=\"" + Host + "\"", "+EDNS:");
IP.trim(); IP = split( IP, ':', 1);
if (IP.length() <= 7) return "Error: Can't Get IP";
result = AT2WNB303("AT+EMQNEW=\"" + IP + "\",\"" + Port + "\"" + "," + 60000 + "," + 1024, "+EMQNEW:");
String mqttid = split( result, ':', 1);
String MQTTClientid = "NBIoT-" + String(random(1000000, 9999999));
result = AT2WNB303("AT+EMQCON=" + mqttid + ",3,\"" + MQTTClientid + "\"" + "," + 60000 + ",0,0,\"" + MQTTUser + "\",\"" + MQTTPassword + "\"", "OK");
return result;
}
String mqttPublish(String Topic, String QoS, String retained, String dup , String Payload) {
String result = "" ;
String hexPayload = Str2Hex(Payload);
String lenHexPayload = String(hexPayload.length());
result = AT2WNB303("AT+EMQPUB=0," + Topic + "," + QoS + "," + retained + "," + dup + "," + lenHexPayload + "," + hexPayload, "OK");
return result;
}
String mqttDisconnect() {
String result = "" ;
result = AT2WNB303("AT+EMQDISCON=0", "OK");
return result;
}
boolean WNB303CheckReg() {
String result = "";
boolean CEREG = false;
result = AT2WNB303("AT+CEREG?", "+CEREG:");
if (result.indexOf("0,1") >= 0 || result.indexOf("1,1") >= 0) {
MatrixInt(5, 0);
MatrixInt(6, 1);
CEREG = true;
}
else {
MatrixInt(5, 1);
MatrixInt(6, 0);
CEREG = false;
}
return CEREG;
}
int WNB303CheckRSSI() {
String result = "";
int RSSI = 0;
result = AT2WNB303("AT+CESQ", "+CESQ:");
if (!(result == "-1")) {
int CESQ = split(split(result, ':', 1), ',', 0).toInt();
RSSI = CESQ - 111;
}
if (RSSI == -111 || RSSI == 210) RSSI = 0;
MatrixLEDrssi(RSSI);
return RSSI;
}
void WNB303Restart(int dalayTime) {
AT2WNB303("POWEROFF", "");
delay(5000);
AT2WNB303("POWERON", "");
delay(dalayTime * 1000) ;
}
String HTTPGET(String Protocol, String Host, String port, String Url) {
String result = "" ;
String IP = AT2WNB303("AT+EDNS=\"" + Host + "\"", "+EDNS:");
IP.trim(); IP = split( IP, ':', 1);
if (IP.length() <= 7) return "Error: Can't Get IP";
String PIP = Protocol + "://" + IP + ":" + port + "/";
int PIPlen = PIP.length();
result = AT2WNB303("AT+EHTTPCREATE=0," + String(PIPlen) + "," + String(PIPlen) + ",\"" + PIP + "\"", "+EHTTPCREAT");
result.trim(); String clientid = split(result, ':', 1);
if (result == "") return "Error: Can't Create Connection";
else {
result = AT2WNB303("AT+EHTTPCON=" + clientid, "OK");
result.trim();
if (!(result == "OK")) result = "Error: Can't Connect to Server";
int LenUrl = Url.length();
Url = clientid + ",0," + String(LenUrl) + "," + Url + ",0,,0,,0,";
Url = "0," + String(Url.length()) + "," + String(Url.length()) + "," + Url;
result = AT2WNB303("AT+EHTTPSEND=" + Url, "OK");
if (!(result == "OK")) result = "Error: Can't Send to Server";
}
delay(1000);
AT2WNB303("AT+EHTTPDISCON=" + clientid, "OK");
delay(1000);
AT2WNB303("AT+EHTTPDESTROY=" + clientid, "OK");
delay(1000);
return result;
}
String HTTPPOST(String Protocol, String Host, String port, String Url , String contType , String Data) {
String result = "" ;
String IP = AT2WNB303("AT+EDNS=\"" + Host + "\"", "+EDNS:");
IP.trim(); IP = split( IP, ':', 1);
if (IP.length() <= 7) return "Error: Can't Get IP";
String PIP = Protocol + "://" + IP + ":" + port + "/";
int PIPlen = PIP.length();
result = AT2WNB303("AT+EHTTPCREATE=0," + String(PIPlen) + "," + String(PIPlen) + ",\"" + PIP + "\"", "+EHTTPCREAT");
result.trim(); String clientid = split(result, ':', 1);
if (result == "") return "Error: Can't Create Connection";
else {
result = AT2WNB303("AT+EHTTPCON=" + clientid, "OK");
result.trim();
if (!(result == "OK")) result = "Error: Can't Connect to Server";
int i = 0;
String PostCommand[10];
PostCommand[i++] = clientid + ",1," + Url.length() + "," + Url + ",0,," + contType.length() + "," + contType + ",";
String hexData = Str2Hex(Data);
int lenHexData = hexData.length();
PostCommand[i++] = String(lenHexData) + ",";
int num = 30;
for (int n = 0; n < lenHexData; n = n + num) {
String DataSend = "";
if (n + num < lenHexData) {
DataSend = hexData.substring(n, n + num);
} else if (lenHexData % num > 0) {
int remainder = lenHexData % num;
DataSend = hexData.substring(n, n + remainder);
}
PostCommand[i++] = DataSend;
}
int totalLenHexData = 0;
for (int j = 0; j <= i - 1; j++) {
totalLenHexData = totalLenHexData + PostCommand[j].length();
PostCommand[j] = String(PostCommand[j].length()) + "," + PostCommand[j];
}
for (int j = 0; j <= i - 1; j++) {
if (j == 1) PostCommand[j] = "AT+EHTTPSEND=1," + String(totalLenHexData) + "," + PostCommand[j];
else if (j == i - 1) PostCommand[j] = "AT+EHTTPSEND=0," + String(totalLenHexData) + "," + PostCommand[j];
else PostCommand[j] = "AT+EHTTPSEND=1," + String(totalLenHexData) + "," + PostCommand[j];
result = AT2WNB303(PostCommand[j], "OK");
}
}
delay(1000);
AT2WNB303("AT+EHTTPDISCON=" + clientid, "OK");
delay(1000);
AT2WNB303("AT+EHTTPDESTROY=" + clientid, "OK");
delay(1000);
return result;
}
String AT2WNB303(String ATdata, String StartWith) {
Serial.println("你的命令是:" + ATdata);
if (ATdata.length() > 0) {
ATdata.trim();
String command = ATdata;
command.toUpperCase();
if (command == "RESET") {
digitalWrite(WNB303ResetPIN, HIGH);
delay(10000);
digitalWrite(WNB303ResetPIN, LOW);
return "RESET OK";
}
else if (command == "POWERON") {
digitalWrite(WNB303PowerPIN, HIGH);
return "POWERON OK";
}
else if (command == "POWEROFF") {
digitalWrite(WNB303PowerPIN, LOW);
return "POWEROFF OK";
}
else {
Serial2.println(ATdata);
}
}
else return "";
String result = "";
long StartTime = millis();
while (1) {
result = "";
while (Serial2.available()) {
char c = Serial2.read();
result += c;
if (c == '\n') break;
}
result.trim();
if (result.startsWith(StartWith)) break;
if ((millis() - StartTime) >= WNB303Timeout ) {
result = "0";
break;
}
}
return result;
}
void ReadAHT(float *temperature, float *humidity, TwoWire& myWire) {
uint8_t data[6];
myWire.beginTransmission(AHT15_ADDRESS);
myWire.write(0xAC);
myWire.write(0x33);
myWire.write(0x00);
myWire.endTransmission();
delay(80);
myWire.requestFrom(AHT15_ADDRESS, 6);
for (int i = 0; i < 6; i++) {
data[i] = myWire.read();
}
*humidity = ((data[1] << 12) | (data[2] << 4) | data[3] >> 4) * 100.0 / (1 << 20);
*temperature = (((data[3] & 0x0F) << 16) | (data[4] << 8) | data[5]) * 200.0 / (1 << 20) - 50;
}
String Str2Hex(String msg) {
String a = "";
for (int i = 0; i < msg.length(); i++) {
a = a + String(msg.charAt(i), HEX);
}
return a;
}
String Hex2Str(String msg) {
char input[msg.length() + 1];
msg.toCharArray(input, msg.length() + 1);
char c[sizeof(input)];
String a = "";
for (int i = 0; i < sizeof(input) - 1; i += 2) {
char temp[3];
temp[0] = input[i];
temp[1] = input[i + 1];
int val = ASCIIHexToInt(temp[0]) * 16 + ASCIIHexToInt(temp[1]);
c[i] = toascii(val);
a = a + String(c[i]);
}
return a;
}
int ASCIIHexToInt(char c) {
int ret = 0;
if ((c >= '0') && (c <= '9')) ret = (ret << 4) + c - '0';
else ret = (ret << 4) + toupper(c) - 'A' + 10;
return ret;
}
String split(String data, char separator, int index) {
int found = 0;
int strIndex[] = { 0, -1 };
int maxIndex = data.length() - 1;
for (int i = 0; i <= maxIndex && found <= index; i++) {
if (data.charAt(i) == separator || i == maxIndex) {
found++;
strIndex[0] = strIndex[1] + 1;
strIndex[1] = (i == maxIndex) ? i + 1 : i;
}
}
return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
}