#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
ESP8266WebServer server(80);
const char* ssid="ABPOPA"; //название точки доступа
const char* password=""; // пароль не будем писать
//const char* ssid="HomeIoT"; // здесь пишем название домашней точки доступа
//const char* password="DDV987654321"; // и пароль
String webSite,javaScript,XML;
unsigned long wait000=0UL,wait001=1000UL;
int OUT1=14, OUT2=12, BAT=17;//Назначение выводов
int Sila, SilaLow = -43; // Контроль силы сигнала WiFi
int Batareya, BatLow = 400; //Контроль напряжения батареи
float Povorot = 0.8, Trimer; // Переменные для значений поворота и тримера двигателя
String Bat, SilaW;
const int sliderMAX=3; // This sets the number of sliders you want
int sliderVal[3]={100, 50, 50}; //Начальные значения 1 слайдера - скорость, 2-го - поворот, 3- тример
int ESPval[sliderMAX];
void Batare(){
Batareya = analogRead(BAT); // Меряем напряжение батареи
if (Batareya < BatLow){ // Если напряжение батареи меньше порогового значения
Bat = " Батарея села, ПОРА на ЗАРЯДКУ"; // Пишем предупреждение
}
else{ // Если норма
Bat = ""; // Ничего не пишем
}
}
void SilaWifi(){
Sila = WiFi.RSSI(); // Меряем силу сигнала WiFi
if (Sila < SilaLow){
SilaW = " Сигнал слабый, РАЗВОРАЧИВАЙ";
}
else{
SilaW = "";
}
}
void buildJavascript(){
javaScript="<SCRIPT>\n";
javaScript+="xmlHttp=createXmlHttpObject();\n";
javaScript+="function createXmlHttpObject(){\n";
javaScript+=" if(window.XMLHttpRequest){\n";
javaScript+=" xmlHttp=new XMLHttpRequest();\n";
javaScript+=" }else{\n";
javaScript+=" xmlHttp=new ActiveXObject('Microsoft.XMLHTTP');\n";
javaScript+=" }\n";
javaScript+=" return xmlHttp;\n";
javaScript+="}\n";
javaScript+="function process(){\n";
javaScript+=" if(xmlHttp.readyState==0||xmlHttp.readyState==4){\n";
javaScript+=" xmlHttp.onreadystatechange=function(){\n";
javaScript+=" if(xmlHttp.readyState==4&&xmlHttp.status==200){\n";
javaScript+=" xmlDoc=xmlHttp.responseXML;\n";
javaScript+=" xmlmsg=xmlDoc.getElementsByTagName('millistime')[0].firstChild.nodeValue;\n";
javaScript+=" document.getElementById('runtime').innerHTML=xmlmsg;\n"; // Добавляем наши данные
javaScript+=" xmlmsg=xmlDoc.getElementsByTagName('Sila')[0].firstChild.nodeValue;\n";// Сила сигнала WiFi
javaScript+=" document.getElementById('Sila').innerHTML=xmlmsg;\n"; // Сила сигнала WiFi
javaScript+=" xmlmsg=xmlDoc.getElementsByTagName('Batareya')[0].firstChild.nodeValue;\n";// Напряжение батареи
javaScript+=" document.getElementById('Batareya').innerHTML=xmlmsg;\n"; // Напряжение батареи
javaScript+=" for(i=0;i<"+(String)sliderMAX+";i++){\n";
javaScript+=" xmlmsg=xmlDoc.getElementsByTagName('sliderval'+i)[0].firstChild.nodeValue;\n";
javaScript+=" document.getElementById('slider'+i).value=xmlmsg;\n";
javaScript+=" document.getElementById('Sliderval'+i).innerHTML=xmlmsg;\n";
javaScript+=" xmlmsg=xmlDoc.getElementsByTagName('ESPval'+i)[0].firstChild.nodeValue;\n";
javaScript+=" document.getElementById('ESPval'+i).innerHTML=xmlmsg;\n";
javaScript+=" }\n";
javaScript+=" }\n";
javaScript+=" }\n";
javaScript+=" xmlHttp.open('PUT','xml',true);\n";
javaScript+=" xmlHttp.send(null);\n";
javaScript+=" }\n";
javaScript+=" setTimeout('process()',1000);\n";
javaScript+="}\n";
javaScript+="function Slider(cnt){\n";
javaScript+=" sliderVal=document.getElementById('slider'+cnt).value;\n";
javaScript+=" document.getElementById('Sliderval'+cnt).innerHTML=sliderVal;\n";
javaScript+=" document.getElementById('ESPval'+cnt).innerHTML=9*(100-sliderVal)+100;\n";
javaScript+=" if(xmlHttp.readyState==0||xmlHttp.readyState==4){\n";
javaScript+=" xmlHttp.open('PUT','setESPval?cnt='+cnt+'&val='+sliderVal,true);\n";
javaScript+=" xmlHttp.send(null);\n";
javaScript+=" }\n";
javaScript+="}\n";
javaScript+="</SCRIPT>\n";
}
void buildWebsite(){ // Создаём страницу с элементами управления
buildJavascript();
webSite="<!DOCTYPE HTML>\n";
webSite+="<META name='viewport' content='width=device-width, initial-scale=1', charset=\"utf-8\">\n";
webSite+=javaScript;
webSite+="<BODY onload='process()'>\n";
webSite+="Кораблик\n";
webSite+="Время работы = <A ID='runtime'></A>\n";
webSite+="Сила сигнала <A ID='Sila'></A>\n";
// Сила сигнала WiFi
webSite+="Напряжение батареи <A ID='Batareya'></A>\n"; // Напряжение батареи
webSite+="<TABLE BORDER=1 width='700' height='200' style='text-align:center;border-collapse:collapse'>\n";
// webSite+="<INPUT ' TYPE='range' width='600'> \n"; // это пример слайдера
webSite+="<TR>\n"; // 1 слайдер
webSite+="<TD><INPUT ID='slider"+(String)0+"' TYPE='range' ONCHANGE='Slider("+(String)0+")'></TD>\n";
webSite+="<TD>Обороты = <A ID='Sliderval"+(String)0+"'></A>\n";
webSite+="Моторов = <A ID='ESPval"+(String)0+"'></A> * </TD>\n";
webSite+="</TR>\n";
webSite+="<TR>\n"; // 2 слайдер
webSite+="<TD><INPUT ID='slider"+(String)1+"' TYPE='range' ONCHANGE='Slider("+(String)1+")'></TD>\n";
webSite+="<TD>Направление = <A ID='Sliderval"+(String)1+"'></A>\n";
webSite+="Движения = <A ID='ESPval"+(String)1+"'></A></TD>\n";
webSite+="</TR>\n";
webSite+="<TR>\n"; // 3 слайдер
webSite+="<TD><INPUT ID='slider"+(String)2+"' TYPE='range' ONCHANGE='Slider("+(String)2+")'></TD>\n";
webSite+="<TD>Корекция = <A ID='Sliderval"+(String)2+"'></A>\n";
webSite+="Моторов = <A ID='ESPval"+(String)2+"'></A></TD>\n";
webSite+="</TR>\n";
webSite+="</TABLE>\n";
webSite+="</BODY>\n";
webSite+="</HTML>\n";
}
String millis2time(){ // преобразование милисекунд в вид ч/м/с
String Time="";
unsigned long ss;
byte mm,hh;
ss=millis()/1000;
hh=ss/3600;
mm=(ss-hh*3600)/60;
ss=(ss-hh*3600)-mm*60;
if(hh<10)Time+="0";
Time+=(String)hh+":";
if(mm<10)Time+="0";
Time+=(String)mm+":";
if(ss<10)Time+="0";
Time+=(String)ss;
return Time;
}
void buildXML(){
XML="<?xml version='1.0'?>";
XML+="<xml>";
XML+="<millistime>";
XML+=millis2time();
XML+="</millistime>"; // Добавляем наши данные
SilaWifi(); // Здесь измеряем силу сигнала
XML+="<Sila>"; // Сила сигнала WiFi
XML+=String(Sila)+SilaW;// Сила сигнала WiFi
XML+="</Sila>"; // Сила сигнала WiFi
Batare(); // Здесь измеряем напряжение батареи
XML+="<Batareya>"; // Напряжение батареи
XML+=String(Batareya)+Bat;// Напряжение батареи
XML+="</Batareya>"; // Напряжение батареи
for(int i=0;i<sliderMAX;i++){
XML+="<sliderval"+(String)i+">";
XML+=String(sliderVal[i]);
XML+="</sliderval"+(String)i+">";
XML+="<ESPval"+(String)i+">";
ESPval[i]=9*(100-sliderVal[i])+100;
XML+=String(ESPval[i]);
XML+="</ESPval"+(String)i+">";
}
XML+="</xml>";
}
void handleWebsite(){
buildWebsite();
server.send(200,"text/html",webSite);
}
void handleXML(){
buildXML();
server.send(200,"text/xml",XML);
}
void handleESPval(){
int sliderCNT=server.arg("cnt").toInt();
sliderVal[sliderCNT]=server.arg("val").toInt();
buildXML();
server.send(200,"text/xml",XML);
}
void setup() {
Serial.begin(115200);
pinMode(OUT1,OUTPUT);
pinMode(OUT2,OUTPUT);
pinMode(BAT,INPUT);
WiFi.softAP(ssid, password); // Создаём точку доступа
// WiFi.begin(ssid,password); //Это вариант для подключения к существующей точке
// while(WiFi.status()!=WL_CONNECTED)delay(500);
// WiFi.mode(WIFI_STA);
Serial.println("\n\nBOOTING ESP8266 ...");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("Station IP address: ");
Serial.println(WiFi.localIP()); // Вывод в монитор порта присвоенный IP
server.on("/",handleWebsite);
server.on("/xml",handleXML);
server.on("/setESPval",handleESPval);
server.begin();
}
void loop() {
server.handleClient();
if(millis()>wait000){
buildXML();
wait000=millis()+1000UL;
}
if(millis()>wait001){
wait001=millis()+300; //Обновляем значения раз в 300 милисекунд
Trimer = (ESPval[2]*.0015);
Serial.print(" Skorost] ");
Serial.print(ESPval[0]);
Serial.print(" Povorot ");
Serial.print(ESPval[1]);
Serial.print(" Trimer ");
Serial.print(ESPval[2]);
Serial.print(Trimer);
if (ESPval[0] > 200){ // Если слайдер скорости > 200
if ( ESPval[1] > 600) { // Если слайдер поворота > 600 то поворачиваем на лево
analogWrite(OUT1, ESPval[0]);
analogWrite(OUT2, int(ESPval[0] * Povorot*Trimer));
Serial.print(" Le ");
Serial.print(ESPval[0] * Povorot*Trimer);
}
else if (400 > ESPval[1] ){ // Если слайдер поворота < 400 то поворачиваем на право
analogWrite(OUT1, int(ESPval[0] * Povorot));
analogWrite(OUT2, int(ESPval[0]*Trimer));
Serial.print(" Pr ");
Serial.print(int(ESPval[0] * Povorot));
}
else { // Если слайдер поворота > 400 и < 600то едем прямо
analogWrite(OUT1, ESPval[0]);
analogWrite(OUT2, int(ESPval[0]*Trimer));
Serial.print(" OK ");
}
}
else { // Если слайдер скорости < 200 - выключить моторы
analogWrite(OUT1, 0);
analogWrite(OUT2, 0);
Serial.print(" Stop ");
}
Serial.print(" Batareya ");
Serial.println(Batareya);
}
}