• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь ESP-12F без Blynk без remotexy без интернета и роутера

Мурат

New member
Здравствуйте.
Большая просьба помочь в решении следующей проблемы.
Создаю простейшую RC модель: движение вперед назад (задний привод - коллекторный мотор) повороты влево вправо (передняя подвеска с серво мотором - обычный дешевый китайский сервопривод).
Железо: ESP-12F в комплекте с платой для разработчика и двойной H-мост для основного электромотора (Модуль контроллера L298N).
Необходима работа без интерната, без роутера, без Blynk, без remotexy. Управление напрямую с айфона.
Нашел похожий проект - Делаем бюджетный чудо корабль с управлением по WiFi на базе ESP8266, но Arduino IDE выдает ошибку при компиляции - missing terminating " character
ESP-12F работает - проверил через Blynk
Компьютер на Windows 10.
ARDUINO 1.8.5 2017.09.29
ESP8266 Arduino Core - установил.
 

CodeNameHawk

Moderator
Команда форума
Строки разбились, поправьте.
Код:
#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);
}
}
 

Мурат

New member
Строки разбились, поправьте.
Код:
#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);
}
}
Огромное спасибо! Компиляция прошла успешно. Вам случайно не попадались еще аналогичные проекты? Я в русскоязычных источниках не нашел.
 
Сверху Снизу