Created
October 17, 2019 09:03
-
-
Save YukinaMochizuki/8cbc7e5d2986f6f22a55739efc013569 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <Arduino.h> | |
#include <SoftwareSerial.h> | |
#include <DHT.h> | |
byte stateLedPins[] = {4 ,5 ,6 ,7}; | |
const byte stateLedCount = 4; | |
int state = -1; | |
SoftwareSerial AT( 2, 3 ); // RX, TX | |
DHT DHT(A0, DHT22); | |
void sendToAT(String cmd); | |
void stateSendToAT(String cmd); | |
void beginBufferSendToAT(String cmd); | |
void bufferSendToAT(String cmd); | |
void endBufferSendToAT(String cmd); | |
void stateEndBufferSendToAT(String cmd); | |
void waitMessage(); | |
void stateWaitMessage(); | |
void WifiConnect(); | |
void connectServer(String ip); | |
void sendMessageToServer(String message,String size); | |
void endHeaderFields(); | |
String waitSockMessage(); | |
void setPinOutput(byte pin); | |
void setPinInput(byte pin); | |
void setPinHigh(byte pin); | |
void setPinLow(byte pin); | |
float DHT22Input(String type); | |
void error(String errorMessage); | |
void logicJudgment(String input); | |
void setup() { | |
for (byte thisLed = 0; thisLed < stateLedCount; thisLed++) { | |
pinMode(stateLedPins[thisLed], OUTPUT); | |
} | |
Serial.begin(9600); | |
while (!Serial) { | |
; // wait for serial port to connect. | |
} | |
AT.begin(9600); | |
delay(400); | |
stateSendToAT("AT"); | |
sendToAT("AT+CWMODE=1"); | |
WifiConnect(); | |
connectServer("35.200.69.236"); | |
// connectServer("192.168.43.32"); | |
sendMessageToServer("ID:Main","7"); | |
endHeaderFields(); | |
waitSockMessage(); | |
// String input = "setPinOutput 8"; | |
// String input1 = "setPinHigh 8"; | |
// if(input.startsWith("setPinOutput")){ | |
// String str_num = input.substring(13); | |
// long num = str_num.toInt(); | |
// Serial.println(num); | |
// setPinOutput((byte)num); | |
// } | |
// String str_num1 = input1.substring(11); | |
// long num1 = str_num1.toInt(); | |
// Serial.println(num1); | |
// setPinHigh((byte)num1); | |
// setPinOutput(8); | |
// setPinHight(8); | |
} | |
void loop() { | |
delay(5000); | |
sendMessageToServer("waiting for command","19"); | |
endHeaderFields(); | |
logicJudgment(waitSockMessage()); | |
} | |
// ===============Logic layer=============== | |
void logicJudgment(String input) { | |
if(input.startsWith("setPinOutput")){ | |
String str_num = input.substring(13); | |
long num = str_num.toInt(); | |
// Serial.println(num); | |
setPinOutput((byte)num); | |
sendMessageToServer("OK","2"); | |
endHeaderFields(); | |
}else if(input.startsWith("setPinInput")){ | |
String str_num = input.substring(12); | |
long num = str_num.toInt(); | |
// Serial.println(num); | |
setPinInput((byte)num); | |
sendMessageToServer("OK","2"); | |
endHeaderFields(); | |
}else if(input.startsWith("setPinHigh")){ | |
String str_num = input.substring(11); | |
long num = str_num.toInt(); | |
// Serial.println(num); | |
setPinHigh((byte)num); | |
sendMessageToServer("OK","2"); | |
endHeaderFields(); | |
}else if(input.startsWith("setPinLow")){ | |
String str_num = input.substring(9); | |
long num = str_num.toInt(); | |
// Serial.println(num); | |
setPinLow((byte)num); | |
sendMessageToServer("OK","2"); | |
endHeaderFields(); | |
}else if(input.startsWith("nowDHT")){ | |
String str_num = input.substring(7); | |
Serial.println(str_num); | |
String dhtReturn = String(DHT22Input(str_num)); | |
sendMessageToServer(dhtReturn,"5"); | |
endHeaderFields(); | |
} | |
} | |
// ===============Socket=============== | |
String waitSockMessage() { | |
String str=""; | |
char c; | |
for (int timeout=0 ; timeout<10 ; timeout++){ | |
if(AT.find("+IPD,")){ | |
while (AT.available()) { | |
c = AT.read(); | |
str.concat(c); //串接回應字元 | |
delay(10); | |
} | |
str = str.substring(str.indexOf(":") + 1); | |
int subStrNum = str.indexOf("\r"); | |
str = str.substring(0 , subStrNum); | |
int subStrNum1 = str.indexOf("\n"); | |
str = str.substring(0 , subStrNum1); | |
// str.trim(); //去除頭尾空白字元 | |
// String string = AT.readString(); | |
Serial.println("Server response:" + str); | |
return str; | |
break; | |
} | |
else if(timeout==9){ | |
error("ERROR"); | |
} | |
else{ | |
delay(500); | |
} | |
} | |
} | |
void closeSocketConnect() { | |
sendMessageToServer("complete","8"); | |
endHeaderFields(); | |
waitSockMessage(); | |
} | |
// ===============Pin=============== | |
void setPinOutput(byte pin) { | |
pinMode(pin , OUTPUT); | |
} | |
void setPinInput(byte pin) { | |
pinMode(pin , INPUT); | |
} | |
void setPinHigh(byte pin) { | |
digitalWrite(pin, HIGH); | |
} | |
void setPinLow(byte pin) { | |
digitalWrite(pin, LOW); | |
} | |
// ===============Sensor Unit=============== | |
float DHT22Input(String type) { | |
if(type.equals("C")){ | |
return DHT.readTemperature(); | |
}else if(type.equals("F")){ | |
return DHT.readHumidity(true); | |
}else if(type.equals("H")){ | |
return DHT.readHumidity(); | |
} | |
} | |
// ===============WIFI=============== | |
void connectServer(String ip) { | |
beginBufferSendToAT("AT+CIPSTART=\"TCP\","); | |
bufferSendToAT("\""); | |
bufferSendToAT(ip); | |
bufferSendToAT("\","); | |
stateEndBufferSendToAT("80"); | |
} | |
void endHeaderFields() { | |
sendToAT("AT+CIPSEND=4"); | |
sendToAT("\r\n"); | |
} | |
void sendMessageToServer(String message,String size) { | |
beginBufferSendToAT("AT+CIPSEND="); | |
endBufferSendToAT(size); | |
sendToAT(message); | |
} | |
void WifiConnect(){ | |
String cmd="AT+CWJAP=\"HTC Portable Hotspot 38CD\",\"123456789\""; | |
stateSendToAT(cmd); | |
} | |
void waitMessage(){ | |
for (int timeout=0 ; timeout<10 ; timeout++){ | |
if(AT.find("OK")){ | |
Serial.println("RECEIVED: OK"); | |
delay(10); | |
break; | |
} | |
else if(timeout==9){ | |
error("ERROR"); | |
} | |
else{ | |
delay(500); | |
} | |
} | |
} | |
void stateWaitMessage(){ | |
for (int timeout=0 ; timeout<10 ; timeout++){ | |
if(AT.find("OK")){ | |
Serial.println("RECEIVED: OK"); | |
state++; | |
digitalWrite(stateLedPins[state], HIGH); | |
delay(10); | |
break; | |
} | |
else if(timeout==9){ | |
error("ERROR"); | |
} | |
else{ | |
delay(500); | |
} | |
} | |
} | |
void sendToAT(String cmd){ | |
Serial.print("SEND: "); | |
Serial.println(cmd); | |
AT.println(cmd); | |
waitMessage(); | |
} | |
void stateSendToAT(String cmd){ | |
Serial.print("SEND: "); | |
Serial.println(cmd); | |
AT.println(cmd); | |
stateWaitMessage(); | |
} | |
void beginBufferSendToAT(String cmd) { | |
Serial.print("SEND: "); | |
Serial.print(cmd); | |
AT.print(cmd); | |
} | |
void bufferSendToAT(String cmd) { | |
Serial.print(cmd); | |
AT.print(cmd); | |
} | |
void endBufferSendToAT(String cmd) { | |
Serial.println(cmd); | |
AT.println(cmd); | |
waitMessage(); | |
} | |
void stateEndBufferSendToAT(String cmd) { | |
Serial.println(cmd); | |
AT.println(cmd); | |
stateWaitMessage(); | |
} | |
// ===============Unit=============== | |
void error(String errorMessage) { | |
digitalWrite(stateLedPins[3], HIGH); | |
Serial.println(errorMessage); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment