Skip to content

Instantly share code, notes, and snippets.

@YukinaMochizuki
Created October 17, 2019 09:03
Show Gist options
  • Save YukinaMochizuki/8cbc7e5d2986f6f22a55739efc013569 to your computer and use it in GitHub Desktop.
Save YukinaMochizuki/8cbc7e5d2986f6f22a55739efc013569 to your computer and use it in GitHub Desktop.
#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