Выключатель на андроиде


android esp8266 Предыстория,.. Я электрик, ну и каждый рабочий день минут за 15-20 до начала смены и к концу смены я хожу и выключаю свет по всему цеху, который в длину метров 100 и в ширину метров 60 наверное ( Альметьевский Трубный Завод). Только к сожалению сама идея(я не настаивал применять эту систему, а даже рекомендовал внедрить коммерческую систему «умный дом») не нашла понимания и поддержку со стороны руководства, но может мои скромные наработки кому-то пригодятся и кто-то решит повторить или довести до ума. До начала реализации идеи я облазил множество форумов и сайтов, но не найдя проектов с подходящими для меня требованиями, решил доработать существующие. Основные требования это- управление 2-я и более модулями, наличие получения ответки в реальном времени о состоянии(вкл или выкл), желательно чтобы работала без доступа к интернету, ну и одно из самых главных требований-стабильность. Возможно уже к написанию статьи появились работы отвечающим всем этим требованием, т.к искал и занимался этим пол года назад, а руки для написания дошли только сейчас. Поначалу сборка имело такую схему. esp9266 И соответственно прошивку для модуля: Кстати, после заливки скетча на модуль, надо определить ip адрес модуля в ArduinoIDE через «Инструменты»->»Монитор порта», или другим удобным для вас способом и приложением.

#include <ESP8266WiFi.h>
const char* ssid = "?????"; //вместо вопросов название вашего WI-FI соединения 
const char* password = "????"; // пароль
int ledPin = 2; // GPIO2
WiFiServer server(80);
int status = WL_IDLE_STATUS;
void setup() {
 Serial.begin(115200);
 delay(10);
 
 pinMode(ledPin, OUTPUT);
 digitalWrite(ledPin, LOW);
 
 // Connect to WiFi network
 Serial.println();
 Serial.println();
 Serial.print("Connecting to ");
 Serial.println(ssid);
 
 WiFi.begin(ssid, password);
 
 while (WiFi.status() != WL_CONNECTED) {
 delay(500);
 Serial.print(".");
 }
 Serial.println("");
 Serial.println("WiFi connected");
 
 // Start the server
 server.begin();
 Serial.println("Server started");
 
 // Print the IP address
 Serial.print("Сonnect: ");
 Serial.print("http://");
 Serial.print(WiFi.localIP());
 Serial.println("/");
 
}
 
void loop() {
 // Check if a client has connected
 WiFiClient client = server.available();
 if (!client) {
 return;
 }
 
 // Wait until the client sends some data
 Serial.println("new client");
 while(!client.available()){
 delay(1);
 }
 
 // Read the first line of the request
 String request = client.readStringUntil('\r');
Serial.println(request);
client.flush();
// Match the request
int value = digitalRead(2);
if (request.indexOf("/LED=ON") != -1) {
digitalWrite(ledPin, HIGH);
value = HIGH;
}
if (request.indexOf("/LED=OFF") != -1) {
digitalWrite(ledPin, LOW);
value = LOW;
}
// Set ledPin according to the request
//digitalWrite(ledPin, value);
// Return the response
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println(""); // do not forget this one
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.print("Led pin is now: ");
if(value == HIGH) {
client.print("On");
} else {
client.print("Off");
}
client.println("<br><br>");
client.println("Click <a href=\"/LED=ON\">here</a> turn the LED on pin 2 ON<br>");
client.println("Click <a href=\"/LED=OFF\">here</a> turn the LED on pin 2 OFF<br>");
client.println("</html>");
delay(1);
Serial.println("Client disonnected");
Serial.println("");
}

Но данная сборка и метод оказался не приемлемым для стабильной и долгосрочной работы. Для «поиграться» и посмотреть принцип работы сойдет, для долгой и стабильной работы не имеет шансов на жизнь. Когда я впервые собрал и запустил, наигравшись, я оставил на 5-6 часов прогона. И какого же было мое разочарование, когда придя я увидел что вместо включенной релюшки и желтого фона на телефоне я обнаружил что модуль перевел все в режим «выкл». И раз, за разом, это повторялось, возможно он перезагружался из-за перегрева(модули реально сильно грелись), либо по каким-то другим причинам, но этого я не знаю, модуль менял свое состояние на выходе на сое усмотрение. Решение пришло не совсем удобное с точки зрения простоты схемы: схема усложнилась, увеличились общие габариты и соответственно удорожало. Добавилось всем известное и бюджетное ардуино, у меня как раз дома валялись nano и UNO. esp8266 Основное отличие от предыдущего, это то что ардуино уже решает когда включать реле, а когда выключать. Для этого он должен получить стабильную высокую на 10-м входе arduino с задержкой не менее 400, а для этого с esp8266  мы посылаем единичку с задержкой 500 (кстати, если будут какие-то глюки связанные с изменение состояния на 11 или 12 выходе без вашего ведома, то можете поиграться с этими параметрами). 11 выход с ардуино управляет состоянием реле, а 12 просто его дублирует, с него модуль считывает состояние ( high или low). Это дает нам защиту от ложных сигналов с esp, потери сигнала с wi-fi или от временного его отключения или перезагрузки. После того как он перейдет в нормальный режим, он считает состояние 12 контакта с ардуино, который проходит через потенциометр, для преобразования 5 вольтового сигнала в 3.3. в моем случае стоял на 4,7кОм, но этого придерживаться не обязательно, можно собрать обычный делитель напряжения, он передает по wi-fi на ваш смартфон. Ну и новый скетч…

#include <ESP8266WiFi.h>
const char* ssid = "Keenetic-5033";
const char* password = "s87A9h9Q";




int DOutput = 0; // GPIO2
int DOinput = 2; // GPIO0
WiFiServer server(80);

int status = WL_IDLE_STATUS;

void setup() {
 Serial.begin(115200);
 delay(10);


 
 pinMode(DOutput, OUTPUT);
 pinMode(DOinput, INPUT);
 digitalWrite(DOutput, LOW);
 
 // Connect to WiFi network
 Serial.println();
 Serial.println();
 Serial.print("Connecting to ");
 Serial.println(ssid);
 
 WiFi.begin(ssid, password);
 
 while (WiFi.status() != WL_CONNECTED) {
 delay(500);
 Serial.print(".");
 }
 Serial.println("");
 Serial.println("WiFi connected");
 
 // Start the server
 server.begin();
 Serial.println("Server started");
 
 // Print the IP address
 Serial.print("Use this URL to connect: ");
 Serial.print("http://");
 Serial.print(WiFi.localIP());
 Serial.println("/");
 
}
 
void loop() {
 // Check if a client has connected
 WiFiClient client = server.available();
 if (!client) {
 return;
 }
 
 // Wait until the client sends some data
 Serial.println("new client");
 while(!client.available()){
 delay(1);
 }
 
 // Read the first line of the request
 String request = client.readStringUntil('\r');
Serial.println(request);
client.flush();

// Match the request

int value = digitalRead(2);
if (request.indexOf("/LED=ON") != -1) {
digitalWrite(DOutput, HIGH);
delay(500); 
digitalWrite(DOutput, LOW); 
//value = HIGH;
}
if (request.indexOf("/LED=OFF") != -1) {
digitalWrite(DOutput, LOW);
//value = LOW;
}

// Set DOutput according to the request
//digitalWrite(DOutput, value);

// Return the response
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println(""); // do not forget this one
client.println("<!DOCTYPE HTML>");
client.println("<html>");

client.print("Led pin is now: ");

if(value == HIGH) {
client.print("On");
} else {
client.print("Off");
}
client.println("<br><br>");
client.println("Click <a href=\"/LED=ON\">here</a> turn the LED on pin 2 ON<br>");
client.println("Click <a href=\"/LED=OFF\">here</a> turn the LED on pin 2 OFF<br>");
client.println("</html>");

delay(1);
Serial.println("Client disonnected");
Serial.println("");

}

Приложение написано для управления двумя модулями(кнопка линия 3 и линия 4), Поменять название, количество управляемых кнопок, их форму или рисунок думаю вы без труда сумеете поменять без подробного описания по написанной мною аналогии.esp8266 aia Внимание, если вы будете переписывать приложение для андроида, а если вы будете использовать для своих целей, то вы обязательно это будете делать, то при возникновении ошибки в http://ai2.appinventor.mit.edu/ типа восклицательного знака в красном треугольнике, то поменяйте язык с английского, на русский, в верхнем углу страницы сайта. Есть два момента которые можно доработать, это написать на есп8266 прошивку с динамическим ip адресом, для того чтобы каждый раз не цеплять к компу с программатором и связать «общение» модуля с ардуиной не высоким и низким уровнем сигнала (high и low), а последовательными портами(rx и tx) для повышения функциональности. Но этим займусь, наверное, если появится интерес к проекту у народа. Так же если надо описать какой-то этап по подробнее, пишите, постараюсь ответить или залить видео.

Файлы для скачивания Ard+Esp

Ну думаю  все, удачных поделок!