Собрался вот такой проект
на PC клиент с кнопками в браузере
для Arduino скетч
Нажимая на кнопки клиента посылать get запросы
в ESP8266->Arduino
Старт setup arduino uno + инициализайия AP ESP8266(Точки доступа)
на PC клиент с кнопками в браузере
для Arduino скетч
Код:
#include <SoftwareSerial.h>
#include <avr/wdt.h>
#define DEBUG true
#define RESPONSE_FASTTIME 150 // время ожидания ответа
#define CLEARSTREAM_FASTTIME 1 // время ожидания ответа при чистке буфера
#define CIPMODE 0// unvarnished transmission mode = 1
#define CIPMUX 1// configure for multiple connections
#define CWMODE 2// режим configure as access point (1=Station, 2=AP, 3=All)
#define CIPSERVER_PORT 80 // ПОРТ
#define CIPSTO_TIMEOUT 1 // не понятно что задает
#define BOUDFirst 57600 // скорость обмена по умолчанию
//4800 9600 19200 38400 57600
//115200 230400 345600 460800 576000 921600
#define BOUD BOUDFirst //
#define RESPONSE_START "ARDUINO UNO"
#define RESPONSE_END "BABAROBOT"
#define RESPONSE_CONNECTION ""
//#define RESPONSE_CONNECTION "KeepAliveTimeout 1\r\n"
//#define RESPONSE_CONNECTION "Connection: close\r\n" // закрыть connect
//#define RESPONSE_CONNECTION "Connection: keep-alive\r\n"
#define RESPONSE_CIPCLOSE ""
#define RESPONSE_SERVER "";
//#define RESPONSE_SERVER "Server: WebSevice\r\n";
#define RESPONSE_REFRESH ""
//#define RESPONSE_REFRESH "Refresh: 1\r\n"
long int time = millis(), time_1, time_2, time_3;
int loopIterat = 1;
SoftwareSerial esp8266(2, 3);
void setup()
{
Serial.begin(115200);
Serial.println("_SS_MAX_RX_BUFF="+String(_SS_MAX_RX_BUFF,DEC));
Serial.println("BOUD="+String(BOUD,DEC));
if (BOUDFirst != BOUD){
long b= BOUDFirst;
String s = "AT+CIOBAUD=" + String(BOUD, DEC);
String r = "";
while(true){
esp8266.begin(b);
Serial.println("esp8266 change BOUD for "+String(b, DEC));
while(true){
Serial.println(s);
esp8266.println(s);
Serial.println(esp8266.readString());
if(b!=BOUDFirst)break;
}
esp8266.end();
}
}
esp8266.begin(BOUD);
pinMode(11, OUTPUT);
digitalWrite(11, LOW);
pinMode(12, OUTPUT);
digitalWrite(12, LOW);
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
sendData("AT+RST", "reset module", 0);
sendData("AT", "test esp8266", RESPONSE_FASTTIME);
sendData("AT+CIOBAUD=?", "speed baud", RESPONSE_FASTTIME);
if (DEBUG)sendData("AT", "test esp8266", RESPONSE_FASTTIME);
sendData("AT+CIPMUX=" + String(CIPMUX), "configure for multiple connections " + String(CIPMUX), RESPONSE_FASTTIME);
//* sendData("AT+CWMODE=" + String(CWMODE), "configure as access point to " + String(CWMODE) + "(1=Station, 2=AP, 3=All)", RESPONSE_FASTTIME);
//sendData("AT+CIPMODE="+ String(CIPMODE), "unvarnished transmission mode = "+ String(CIPMODE), RESPONSE_FASTTIME);
//sendData("AT+CWSAP=\"ESP8266\",\"1234567890\",5,3", "configure as access", RESPONSE_FASTTIME);
sendData("AT+CIPSERVER=1," + String(CIPSERVER_PORT), "turn on server on port " + String(CIPSERVER_PORT), RESPONSE_FASTTIME);
sendData("AT+GMR", "version flash", RESPONSE_FASTTIME);
//* sendData("AT+CIFSR", "get ip address", RESPONSE_FASTTIME);
//* sendData("AT+CIPSTO=" + String(CIPSTO_TIMEOUT), "timeout " + String(CIPSTO_TIMEOUT), RESPONSE_FASTTIME);
if (DEBUG)sendData("AT", "AT esp8266", RESPONSE_FASTTIME);
//if(DEBUG)sendData("AT+CWLAP","View access point", 5000); //1 раз сработало
//Serial.println("# delay(2000)");delay(2000);
sendData("AT", "AT esp8266", RESPONSE_FASTTIME);
Serial.println(""); printTime();
Serial.println("# flush()"); esp8266.flush();
Serial.println("# init end -----"+String(RESPONSE_FASTTIME,DEC)+"---------"+String(CLEARSTREAM_FASTTIME,DEC)+"----------------------------");
time_1 = millis();time_2 = millis();
}
// Основной цикл- Ждем +IPD и выталкиваем буфер
void loop()
{
Serial.println("# main loop ---------------------------------\n");
//while(!esp8266.overflow()){
while (true) {
if (DEBUG) if (millis() - time_1 > 1000)Serial.println(printTime(time_1) + "second 1"); time_1 = millis();
time = millis();
while (esp8266.available()) {
time = millis();
// если найден +IPD, выполнить positive_answer
char c = 0;
if ( ( c = esp8266.read() ) == '+' ) {
while (esp8266.available()<64)delay(1);
//if(millis()-time_2>2000) Serial.println(printTime(time_2)+"available------second 2---------");time_2 = millis();
if ( (c = esp8266.read()) == 'I' && (c = esp8266.read()) == 'P' && (c = esp8266.read()) == 'D' && (c = esp8266.read()) == ',')
{
Serial.print("loop [" + String(loopIterat++) + "] ");
long conId = esp8266.parseInt();
if (DEBUG) {
Serial.println("");
Serial.print(printTime() + "++++++++++++++++++++++++ +IPD");
}
Serial.println(conId);
positive_response(conId);
}
} else
// иначе, выводить в лог
if((true || DEBUG) && c != 0) {
if (millis() - time_3 > 10) { Serial.println(""); printTime(time_3); }
Serial.print(c);
time_3 = millis();
}
}
}
}
void positive_response(long connId)
{
if (DEBUG)Serial.println(printTime() + "Start positive_response");
// ищем команду /set и номер pin=, и делаем реверс pin
if ( esp8266.find(" /") && esp8266.read() == 's' && esp8266.find("pin=") )
{
int pin = esp8266.parseInt();
if (DEBUG)Serial.print(printTime() + "Setup pin=");
if (DEBUG)Serial.println(pin);
digitalWrite(pin, digitalRead(pin) == LOW ? HIGH : LOW);
};
if (DEBUG)Serial.println(printTime()+"format HTTP response");
// Формируем HTTP ответ
String requestText = RESPONSE_START;
requestText +=" ("+String(loopIterat-1, DEC)+", "+String(connId, DEC)+")";
// собираем инфо для ответа
for (int pin = 11; pin <= 13; pin++) {
requestText += "\npin" + String(pin, DEC) + "=";
requestText += digitalRead(pin) == HIGH;
}
requestText += "\ntime=" + String(millis() - time, DEC) + "\n";
requestText += RESPONSE_END;
String request = "HTTP/1.1 200 OK\r\nAccess-Control-Allow-Origin: *\r\n";
request += RESPONSE_SERVER;
request += RESPONSE_CONNECTION;
request += RESPONSE_REFRESH;
request += "Content-Length: "; request += String(requestText.length(), DEC) + "\r\n";
request += "\r\n" + requestText;
// стартуем обмен данными
String sSend = "AT+CIPSEND";
sSend += "=" + String(connId, DEC) + ",";
sSend += request.length();
sSend +="\r\n";
// чистим буфер с задержкой
if (DEBUG){
Serial.print(printTime()+"ClearBuffer.."+String(CLEARSTREAM_FASTTIME, DEC)+"..>>\n");
while (esp8266.available()) {
char c;
Serial.print(c=esp8266.read());
if(!esp8266.available())if(CLEARSTREAM_FASTTIME>0)delay(CLEARSTREAM_FASTTIME);
}
Serial.println("<<");
} else while (esp8266.available()) {
esp8266.read();
if(!esp8266.available())if(CLEARSTREAM_FASTTIME>0)delay(CLEARSTREAM_FASTTIME);
}
if (DEBUG)Serial.println(printTime() + "send response...>");
//if (DEBUG)Serial.println(sSend);
esp8266.print(sSend+request);
if (DEBUG)Serial.println(printTime() + "send response ok \n"+
"++++++++++++++++++++++++");
}
// Отправка команды
void sendData(String command, String comment, long int delayTime)
{
Serial.print("\n# " + comment);
if(delayTime == 0)Serial.print("> ");
esp8266.println(command);
String response = delayTime != 0 ? esp8266readString(delayTime) : esp8266.readString();
{
String ss = response; ss.trim();
if (response.indexOf(command) < 0) Serial.println(command+">");
else {
ss.replace("\r\n\r\n", "\n");
String sss=command+"\r\nOK";
if( sss.equals(ss)){
Serial.print(command+" OK");
return;
}
Serial.println("");
}
printTime();
if (response.length() > 0)Serial.println(ss); else Serial.println("response = >null");
}
return;
}
// ждать ответ в течении заданного времени
String esp8266readString(long int delayTime) {
Serial.print(">");
String result = "";
long int delayT = delayTime + millis();
while (result.length()==0 || millis() <= delayT)
while (esp8266.available()) {
char c = esp8266.read();
result += c;
}
return result;
}
String printTime() {
return printTime(time);
}
String printTime(long int time) {
Serial.print("#");
Serial.print(LeftPad(String(millis() - time, DEC), 4, " "));
Serial.print(LeftPad(String(esp8266.available(), DEC), 4, " "));
Serial.print("\\");
Serial.print(esp8266.overflow());
Serial.print(":");
return "";
}
String LeftPad(String st, int n, String s) {
if(st.length()>=n)return st;
String ss = ""; for (int i = 0; i < n - st.length(); i++)ss += s; return ss + st;
}
String RightPad(String st, int n, String s) {
if(st.length()>=n)return st;
String ss = ""; for (int i = 0; i < n - st.length(); i++)ss += s; return st + ss;
}
// примеры рестарта Arduino
void(* resetFunc) (void) = 0;
void reboot() {
wdt_disable();
wdt_enable(WDTO_15MS);
while (1) {}
}
void restart(String meesage) {
Serial.println(printTime() + "Error!!!!Error!!!!Error!!!!Error!!!!");
Serial.println(meesage);
Serial.println(esp8266.readString());
return;
while (true) {
String s = esp8266.readString();
if (s.length() > 0)Serial.println(s);
}
reboot();
}
void loop1() {
if (esp8266.available()) Serial.print(esp8266.readString());
}
в ESP8266->Arduino
Старт setup arduino uno + инициализайия AP ESP8266(Точки доступа)
Вложения
-
1.6 KB Просмотры: 26
-
88.8 KB Просмотры: 82
-
13.3 KB Просмотры: 84
Последнее редактирование: