Помогите! Спасите! СОС! :) (SoftwareSerial, i2c, WiFiServer server(80))

Flidi
Offline
Зарегистрирован: 23.07.2020

Хотел сделать машинку на вай-фай управлении через веб сервер, но дополнительно надо подключить GPS геолокацию.

Имеется 

Node MCU

Neo 6m gps

arduino micro

Суть проблемы..

Когда я напрямую подключал Neo 6m gps к Node MCU  возникла проблема, что SoftwareSerial и WiFiServer server(80); не дружат. В зависимости того что первой запустилось то и работает. Если запустился Neo 6m gps и передает данные то на Node MCU перестают работать кнопки управление. Геолокация отображается, но кнопки не работают, если отключить Neo 6m ясным делом не работает геолокация, но работают кнопки.

Перелопатил гугл, дошёл до того что понял что WiFiServer server(80); и SoftwareSerial работают за одним и тем же принципом, но так как SoftwareSerial нормально может работать только 1 то и возникает проблема что работает то или другое. Точней за принципом если 1 модуль читает, то второй может только передавать.

Читал, читал. Дошел что есть i2c которое позволяет делать несколько подключений. Решил немного схитрить, подключил дополнительно arduino micro по i2c. Стал генерировать данные и передавать на Node MCU. Все работает, точней данные з arduino micro передаются на Node MCU и отображает их на Web Server, кнопки тоже работают. Казалось вот он финиш осталось подключить Neo 6m gps к GPS и все гуд. Но, нет эта c#$%^ Neo 6m gps как писал раньше работает по SoftwareSerial. И как оказалось этот SoftwareSerial тоже не дружит з i2c. Так как i2c должен сделать запрос, и получить ответ. От чего SoftwareSerial и Neo 6m gps висит. И опять или работает SoftwareSerial, или i2c.

Теперь вопрос есть ли способ Neo 6m gps по i2c или какой GPS купить что бы был норм и мог работать з i2c. Или как можно подружить SoftwareSerial и  i2c. Пробувал даже в void loop() писать SoftwareSerial.begin и Wire.begin(8); что типа по очереди запускать то или другое нифига не работает.

 

Это код последние на чём я зашёл в тупик в void loop()  там где //  Gps , //exolot дальномер, //i2c. Работает или  //  Gps или  //i2c

#include <TinyGPS++.h>  
#include <SoftwareSerial.h>
/*
   This sample sketch demonstrates the normal use of a TinyGPS++ (TinyGPSPlus) object.
   It requires the use of SoftwareSerial, and assumes that you have a
   4800-baud serial GPS device hooked up on pins 4(rx) and 3(tx).
*/
static const int RXPin = 10, TXPin = 9;
static const uint32_t GPSBaud = 9600;

// The TinyGPS++ object
TinyGPSPlus gps;

// The serial connection to the GPS device
SoftwareSerial ss(RXPin, TXPin);


//i2c
int timer;
#include <Wire.h>
bool marker1 = false, marker2= false;

String value1,value2;
String GPSlat,GPSlon;

String strLat,strLon,strJsn;
float Lat,Lon,Jsn;
char cstrLat[16];
char cstrLon[16];
char cstrJsn[16];


//exolot
#include <NewPing.h>
#include <MedianFilter.h>
#include <Wire.h>
#include <MedianFilter.h>


#define TRIGGER_PIN  12  // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN     11  // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 2000 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.

MedianFilter filter(31,0);

void setup() {
  //gps
  ss.begin(GPSBaud);
  //i2c
 Wire.begin(8);                /* задаем на шине i2c 8 адрес */
 Wire.onReceive(receiveEvent); /* регистрируем полученное событие */
 Wire.onRequest(requestEvent); /* регистрируем запрошенное событие */
 Serial.begin(115200);           /* открываем серийный порт для дебаггинга */
}
 
void loop() {

//  Gps
  while (ss.available() > 0)
    if (gps.encode(ss.read())){
      displayInfo();
        strLat = String(gps.location.lat(), 6); //6 чисел после запятой
        strLon = String(gps.location.lng(), 6);
    }
 

//exolot дальномер
  exolot();

 //i2c
 delay(100);
 GPSlat = value1.substring(1);
 GPSlon = value2.substring(1);
 Serial.println("Lat =" + GPSlat);             /* переходим на новую строку */
 Serial.println("Lon =" + GPSlon);             /* переходим на новую строку */

}
 
// Функция для извлечения любых принимаемых данных от мастера на шину
void receiveEvent() {
  
  value1 = "";
  value2 = "";
 while (0 <Wire.available()) {
    char i2c = Wire.read();      /* получаем байт как символ*/
   
    if (i2c=='a') 
    {
      marker1 = true;
      marker2 = false;
    }
    if (i2c=='b') 
    { 
      marker1 = false;
      marker2 = true;
    }
    if (marker1 == true) value1 += i2c;
    if (marker2 == true) value2 += i2c;
  }

}
 
// Функция для извлечения любых отправляемых данных от мастера на шину
void requestEvent() {
  
 //Lat = random(1,1000);
 //strLat = String(Lat);
 strLat.toCharArray(cstrLat,16);
 Wire.write("a");
 Wire.write(cstrLat);  /* Отправляем "чар" */
 //Serial.print(cstrLat);

 //Lon = random(1,1000);
 //strLon = String(Lon);
 strLon.toCharArray(cstrLon,16);
 Wire.write("b");
 Wire.write(cstrLon);  /* Отправляем "чар" */
//Serial.print(cstrLon);
 
 strJsn = String(Jsn);
 strJsn.toCharArray(cstrJsn,16);
 Wire.write("c");
 Wire.write(cstrJsn);  /* Отправляем "чар" */
 Wire.write("z");
// Serial.println(cstrJsn);

}

//exolot
void exolot()
{
  for (int i=0; i <= 2; i++)
      {
        delay (5);
        unsigned int o,uS = sonar.ping(); // Send ping, get ping time in microseconds (uS).
      
        filter.in(uS);
        o = filter.out();
        //Serial.print("Ping: ");
        //Serial.print( o / US_ROUNDTRIP_CM); // Convert ping time to distance in cm and print result (0 = outside set distance range)
        //Serial.println("cm");
        Jsn = o / US_ROUNDTRIP_CM;
      }
}

void displayInfo()
{
  Serial.print(F("Location: ")); 
  if (gps.location.isValid())
  {
    Serial.print(gps.location.lat(), 6);
    Serial.print(F(","));
    Serial.print(gps.location.lng(), 6);
  }
  else
  {
    Serial.print(F("INVALID"));
  }

  Serial.print(F("  Date/Time: "));
  if (gps.date.isValid())
  {
    Serial.print(gps.date.month());
    Serial.print(F("/"));
    Serial.print(gps.date.day());
    Serial.print(F("/"));
    Serial.print(gps.date.year());
  }
  else
  {
    Serial.print(F("INVALID"));
  }

  Serial.print(F(" "));
  if (gps.time.isValid())
  {
    if (gps.time.hour() < 10) Serial.print(F("0"));
    Serial.print(gps.time.hour());
    Serial.print(F(":"));
    if (gps.time.minute() < 10) Serial.print(F("0"));
    Serial.print(gps.time.minute());
    Serial.print(F(":"));
    if (gps.time.second() < 10) Serial.print(F("0"));
    Serial.print(gps.time.second());
    Serial.print(F("."));
    if (gps.time.centisecond() < 10) Serial.print(F("0"));
    Serial.print(gps.time.centisecond());
  }
  else
  {
    Serial.print(F("INVALID"));
  }

  Serial.println();
}

 

Flidi
Offline
Зарегистрирован: 23.07.2020

Странно... по идеи через то что пост длинный 3 одинаковых темы получилось..

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Надо было сначала светлодиодиком помигать. 

Flidi
Offline
Зарегистрирован: 23.07.2020

DetSimen пишет:

Надо было сначала светлодиодиком помигать. 

Ем..?

Logik
Offline
Зарегистрирован: 05.08.2014

Flidi пишет:

DetSimen пишет:

Надо было сначала светлодиодиком помигать. 

Ем..?

Ну доешь и поморгай ;)

Поделюсь сокровенными знаниями. Ежели есть куча либ ардуиновских, совершенно рабочих по отдельности и реализующих все что хочется иметь в своем коде, то будучи включенными в код ни фига не заработает.

Flidi
Offline
Зарегистрирован: 23.07.2020

Предлагаешь написать собственную библиотеку? Тоже вариант. Если честно что-то такое в голе проскакивало что придётся с 0 создавать способ передачи данных. Есть еще варианты?

b707
Offline
Зарегистрирован: 26.05.2017

Flidi пишет:

Есть еще варианты?

учиться учиться учиться

Пока история написания вами программы выглядит как поиски черной кошки в темноте...Я нифига не понял, зачем вам понадобился софтсериал на ЕСп

Logik
Offline
Зарегистрирован: 05.08.2014

Flidi пишет:

Предлагаешь написать собственную библиотеку? Тоже вариант.

Нет. Как раз не библиотеку. Просто напиши себе программу.

Flidi
Offline
Зарегистрирован: 23.07.2020

b707 пишет:

Flidi пишет:

Есть еще варианты?

учиться учиться учиться

Пока история написания вами программы выглядит как поиски черной кошки в темноте...Я нифига не понял, зачем вам понадобился софтсериал на ЕСп

Потому что ДЖПС Нео 6м на И2С не работает. Он работает только через СофтСериал. Точней я информации как запустить Нео 6м по И2С не нашол. Так как СофтСериал делает передачу напрямую, а И2С надо указать порт. Через что получєаться что ДЖПС надо или прошивать, или хз.

Проблема в тому что, что все эти библиотеки как оказалось вместе не работают, и в режиме чтение-запись может работать только что-то одно.

Как я писал Софт Сериал через который работает ДЖПС и Вайфай-сервер не дают друг другу нормально работать. Так как Вай фай использует, тоже Софт сериал как основу на сколько я понял, ну или ее часть кода. А 2 Софт сериала одновременно работать не могут, нету такой возможности в библиотеках точней в Софт Сериал есть такая штука как СофтСериал.listen(). Что позволяет прерывать одно и работать з другим. Но на библиотеку ВайФая, listen() не распространяться, нету у него такой функции. Сам СофтСериал.listen() работает через жопу, так как время переключения ужасно большое.

А проблема в считывании данных з буфера. Они как бы накладываются друг на друга, или даже точней сказать занимают место друг у друга. Я могу ошибаться... но в своих экспериментах я сделал такой вывод. Так как другого объяснения почему у меня, данные не могут одновременно считывать з ДЖПС и ВайФая, или даже по очереди... у меня нет. Такое ощущения, что ДЖПС и Вайфай во время считывания, занимают одну и ту саму ячейку в памяти. Типа идет сначала считывания з ДЖПС они загоняют по индексах в первую ячейку и т.д, а потом идет считывание з Вайфая и оно перезаписывает поверх того что считал коллега. В результате данные отображаются только от одного модуля.

То же самое з СофтСерал и И2С. Принцип передачи другой. Но работа з буфером одна и та сама.. по моем понимании. Через что они оба работать не могут.

Через что и возникает проблема. Как узгодить считывание двоих похожих за принципом оброки данных, но одновременно разных модуля? Когда у них разные библиотеки, но похожие за принципом работы , я думаю что часть, где идет работа з буфером тупо скопирована друг у друга.

Вот такой коллапс,  я б сказал даже бред получаться.

И что-то жопой начинаю чувствовать что придется делать свой способ передачи данных, для того что бы обойти этот бред.

 

 

Flidi
Offline
Зарегистрирован: 23.07.2020

Logik пишет:

Flidi пишет:

Предлагаешь написать собственную библиотеку? Тоже вариант.

Нет. Как раз не библиотеку. Просто напиши себе программу.

Вот что-то начинает в голову приходить. Так как в этих библиотеках (по идеи) при роботе з буфером нет понятия это моё , а это коллеги и они работают тупо по индексах в памяти, через что тупо затирают то, что было раньше. То придётся что-то шаманить похоже на передачу двоичного кода (мерцающего светодиода). Так как что-то написать, на подобии библиотек по работе з GPS или Wifi точно не смогу. Остаеться светодиодик. Начинаю понимать что имел в виду автор первого сообщения. Могу и ошибаться... 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

почему не взял нормальный хардовый серийный порт народ спрашивал?

Flidi
Offline
Зарегистрирован: 23.07.2020

ua6em пишет:

почему не взял нормальный хардовый серийный порт народ спрашивал?

Тот что 0, 1 ? Пытался что-то не получилось. Или у меня руки из жопы или GPS странный. Возможно первое. Ах б%:?*(.... кажись знаю почему. Ведь у меня серийный запущенный на 11520, а GPS больше 9600 не воспринимает. Спасибо... попробую еще раз

Flidi
Offline
Зарегистрирован: 23.07.2020

Хочу сказать всем спасибо! Теперь у меня есть идеи з чем надо поработать.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Flidi пишет:

Теперь у меня есть идеи з чем надо поработать.

З чем Вас и поздравляем!

b707
Offline
Зарегистрирован: 26.05.2017

Flidi пишет:

Проблема в тому что, что все эти библиотеки как оказалось вместе не работают, и в режиме чтение-запись может работать только что-то одно.

не, проблема не в этом. проблема в том, что некий Flidi, как оказалось, нифига не понимает, как этими библиотеками пользоваться.

Когда человек всерьез уверен, что любой модуль должен работать и по Сериал и по I2C ... и несет вский бред про "пересекающиеся буфера" и "общие ячейки памяти" - тут варианта только два. Либо долго-долго учиться, либо бросить это дело сразу.

Flidi
Offline
Зарегистрирован: 23.07.2020

b707 пишет:

Flidi пишет:

Проблема в тому что, что все эти библиотеки как оказалось вместе не работают, и в режиме чтение-запись может работать только что-то одно.

не, проблема не в этом. проблема в том, что некий Flidi, как оказалось, нифига не понимает, как этими библиотеками пользоваться.

Когда человек всерьез уверен, что любой модуль должен работать и по Сериал и по I2C ... и несет вский бред про "пересекающиеся буфера" и "общие ячейки памяти" - тут варианта только два. Либо долго-долго учиться, либо бросить это дело сразу.

Извините за то что прокомментировал "ваше сообщение" в "моем топике". Где у меня склалась мысль, о том, что вы не совсем поняли суть проблемы, через что я пытался вам более детально ее описать, во всех аспектах как я ее вижу.

b707
Offline
Зарегистрирован: 26.05.2017

Flidi пишет:

 Где у меня склалась мысль, о том, что вы не совсем поняли суть проблемы, через что я пытался вам более детально ее описать, во всех аспектах как я ее вижу.

Ваше видение проблемы неверное, а Ваши рассуждения о необходимости писать свою библиотеку или специальный протокол - выглядят несколько смешно на фоне того, что вы абсолютно не разбираетесь в предмете. На самом деле никакой несовместимости модуля GPS и Вебсервера нет. Проблема решается в рамках существующих библиотек и решали ее до вас сотни людей. Вам просто стоило бы для начала сделать пару-тройку проектов попроще ("светодиодиками помигать" - как вам другой участник посоветовал) - и понять, как на микроконтроллере совместить несколько задач одновременно. Это не такая простая задача, как кажется и простым слиянием двух отдельных скетчей ее не решить.

Что я и пытался до вас донести. Видимо не получилось. А обижать вас цели у меня не было.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Flidi пишет:

ua6em пишет:

почему не взял нормальный хардовый серийный порт народ спрашивал?

Тот что 0, 1 ? Пытался что-то не получилось. Или у меня руки из жопы или GPS странный. Возможно первое. Ах б%:?*(.... кажись знаю почему. Ведь у меня серийный запущенный на 11520, а GPS больше 9600 не воспринимает. Спасибо... попробую еще раз

тут два варианта или запустить сериал на 9600 или перевести модуль на 115200 )))

Flidi
Offline
Зарегистрирован: 23.07.2020

b707 пишет:

Flidi пишет:

 Где у меня склалась мысль, о том, что вы не совсем поняли суть проблемы, через что я пытался вам более детально ее описать, во всех аспектах как я ее вижу.

Ваше видение проблемы неверное, а Ваши рассуждения о необходимости писать свою библиотеку или специальный протокол - выглядят несколько смешно на фоне того, что вы абсолютно не разбираетесь в предмете. На самом деле никакой несовместимости модуля GPS и Вебсервера нет. Проблема решается в рамках существующих библиотек и решали ее до вас сотни людей. Вам просто стоило бы для начала сделать пару-тройку проектов попроще ("светодиодиками помигать" - как вам другой участник посоветовал) - и понять, как на микроконтроллере совместить несколько задач одновременно. Это не такая простая задача, как кажется и простым слиянием двух отдельных скетчей ее не решить.

Что я и пытался до вас донести. Видимо не получилось. А обижать вас цели у меня не было.

Запустить веб сервер з геолокация действительно не проблема. 

https://forum.arduino.cc/index.php?topic=695618.0

Это моя тема, по части Веб Сервер + GPS.  Проблема в том что метод client.readStringUntil(inByte) который я знаю, для обработки нажатия кнопок перестает работать, точней в зависимости от того что я ставлю в приоритете, работает.

Мне сказали что стандартными методами то что я хочу сделать нельзя, точней функциями Ардуино. По этому я решил использовать хитрость, пошёл по не стандартному методе, использовал I2C и Ардуино микро, как посредника. Если в части веб сервера посредник хорошо справился, то в части GPS возникла похожая проблема. 

От чего и возник вопрос.

Цитата:

Теперь вопрос есть ли способ Neo 6m gps по i2c или какой GPS купить что бы был норм и мог работать з i2c. Или как можно подружить SoftwareSerial и  i2c. Пробувал даже в void loop() писать SoftwareSerial.begin и Wire.begin(8); что типа по очереди запускать то или другое нифига не работает.

То что функции из GPS мешают работать остальному или наоборот, я и так понял. Вопрос как это исправить. Для чего и нужна помощь, а точней хотя бы взгляд со стороны. В чём ошибка? Надо делать по очереди байтовое чтение из каждого устройства?  

У меня кончились идеи до того когда зашёл сюда на форум. 

b707
Offline
Зарегистрирован: 26.05.2017

идею с промежуточной ардуино выкиньте, она дает вам больше проблем, чем пользы. Выкладывайте скетч. где вы подключали GPS прямо к ЕСП

Flidi
Offline
Зарегистрирован: 23.07.2020

b707 пишет:

идею с промежуточной ардуино выкиньте, она дает вам больше проблем, чем пользы. Выкладывайте скетч. где вы подключали GPS прямо к ЕСП

 

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ArduinoOTA.h>
#include <EEPROM.h>
//exolot
#include <NewPing.h>
#include <MedianFilter.h>
#include <Wire.h>
#include <MedianFilter.h>


#define TRIGGER_PIN  16  
#define ECHO_PIN     5  
#define MAX_DISTANCE 2000 

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

MedianFilter filter(31,0);

int timer1,timer2;
String value1="0";
String value2="0";
int exo;
//web server
const char* ssidAP = "ESPWebServer"; 
const char* passwordAP = "1234567890";

const char* ssid = "EnergyCores_Majic-Power"; 
const char* password = "12481632"; 

IPAddress StaticIP(192, 168, 1, 35); 
IPAddress GateIP(192, 168, 1, 1); 


WiFiServer server(80);

//gps
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
 
TinyGPSPlus gps;
 
#define S_RX    0                // Вывод RX
#define S_TX    4                // Вывод TX
 
SoftwareSerial SoftSerial(S_RX, S_TX);


void setup() {
  //gps
  SoftSerial.begin(9600); 
  
  // Wifi Server
  Serial.begin(115200);
  delay(10);

  // prepare GPIO16
  pinMode(14, OUTPUT); //d5
  pinMode(12, OUTPUT); //d6
  pinMode(13, OUTPUT); //d7
  pinMode(15, OUTPUT); //d8
  analogWriteFreq(150); 
  analogWriteRange(9); 


  
    CreateWiFiAP(); 
    delay(1500);    
  
  //ConnectWiFiLan();
  
  server.begin();
  analogWrite(16, 0); 
  
  // Start OTA server.
  ArduinoOTA.setHostname("OTA->ESP");
  ArduinoOTA.begin();


}

void loop() {

//exolot
  timer1 ++;
  if (timer1 == 100000) {
  timer1 =0;
  for (int i=0; i <= 2; i++){
  delay (5);
  unsigned int o,uS = sonar.ping(); 

  filter.in(uS);
  o = filter.out();
  Serial.print("Ping: ");
  Serial.print( o / US_ROUNDTRIP_CM); 
  Serial.println("cm");
  exo = o / US_ROUNDTRIP_CM;
  
}
  }

//Gps
 static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;
  
       while (SoftSerial.available() > 0) {
 
    if (gps.encode(SoftSerial.read())) {
 
      if (gps.location.isValid()) {

        Serial.print("Latitude   = ");
        Serial.println(gps.location.lat(), 6);
        Serial.print("Longitude  = ");
        Serial.println(gps.location.lng(), 6);
        value1 = String (gps.location.lat(), 6); 
        value2 = String (gps.location.lng(), 6);


      }
      else
        Serial.println("Location Invalid");
 
      if (gps.altitude.isValid()) {
        Serial.print("Altitude   = ");
        Serial.print(gps.altitude.meters());
        Serial.println(" meters");
      }
      else
        Serial.println("Altitude Invalid");
 
      if (gps.speed.isValid()) {
        Serial.print("Speed      = ");
        Serial.print(gps.speed.kmph());
        Serial.println(" kmph");
      }
      else
        Serial.println("Speed Invalid");
 
      if (gps.time.isValid()) {
        Serial.print("Time (GMT) : ");
        if(gps.time.hour() < 10)     Serial.print("0");
        Serial.print(gps.time.hour());
        Serial.print(":");
        if(gps.time.minute() < 10)   Serial.print("0");
        Serial.print(gps.time.minute());
        Serial.print(":");
        if(gps.time.second() < 10)   Serial.print("0");
        Serial.println(gps.time.second());
      }
      else
        Serial.println("Time Invalid");
 
      if (gps.date.isValid()) {
        Serial.print("Date       : ");
        if(gps.date.day() < 10)      Serial.print("0");
        Serial.print(gps.date.day());
        Serial.print("/");
        if(gps.date.month() < 10)    Serial.print("0");
        Serial.print(gps.date.month());
        Serial.print("/");
        Serial.println(gps.date.year());
      }
      else
        Serial.println("Date Invalid");
 
      if (gps.satellites.isValid()) {
        Serial.print("Satellites = ");
        Serial.println(gps.satellites.value());
      }
      else {
        Serial.println("Satellites Invalid");}

        if (gps.course.isValid()) {
        Serial.print("Course = ");
        const char *curse = TinyGPSPlus::cardinal(gps.course.deg());
        Serial.println(curse);
      }
      else {
        Serial.println("Course Invalid");}

//to point

        unsigned long distanceKmToLondon =
        (unsigned long)TinyGPSPlus::distanceBetween(
            gps.location.lat(),
            gps.location.lng(),
            LONDON_LAT, 
            LONDON_LON) / 1000;
        Serial.print("Distans to london = ");
        Serial.println(distanceKmToLondon);
        
       double courseToLondon =
          TinyGPSPlus::courseTo(
            gps.location.lat(),
            gps.location.lng(),
            LONDON_LAT, 
            LONDON_LON);
      
        Serial.print("Course to london = ");
        Serial.println(courseToLondon);
      
        const char *cardinalToLondon = TinyGPSPlus::cardinal(courseToLondon);
         Serial.print("Cardinal to london = ");
          Serial.println(cardinalToLondon);
 
    }
         
  }



//Wifi Server

  ArduinoOTA.handle();
 
  WiFiClient client = server.available();
  if (!client) {
    return;
  }


  while (!client.available()) {
    ArduinoOTA.handle();
    delay(1);
  }


  String req = client.readStringUntil('\r'); // если удалить зчитывание кнопок будет работать геолокация
  Serial.println(req); 
  client.flush();
//  Serial.print("\nMessage recieved");



//gpio 14, d5
  if (req.indexOf("d5=") != -1) 
  {
    int val = (int)req[req.indexOf("=") + 1] - 48; 
    analogWrite(14, 0 + val);
    analogWrite(12, 0);
  }

//gpio 12, d6
    if (req.indexOf("d6=") != -1) 
  {
    int val = (int)req[req.indexOf("=") + 1] - 48; 
    analogWrite(12, 0 + val);
    analogWrite(14, 0);
  }

 //gpio 13, d7
  if (req.indexOf("d7=") != -1) 
  {
    int val = (int)req[req.indexOf("=") + 1] - 48; 
    analogWrite(13, 0 + val);
    analogWrite(15, 0);
  }
 //gpio 15, d8
    if (req.indexOf("d8=") != -1) 
  {
    int val = (int)req[req.indexOf("=") + 1] - 48; 
    analogWrite(15, 0 + val);
    analogWrite(13, 0);
  }

    if (req.indexOf("Off=") != -1) 
  {
    int val = (int)req[req.indexOf("=") + 1] - 48; 
    analogWrite(15, 0);
    analogWrite(13, 0);
    analogWrite(12, 0);
    analogWrite(14, 0);
  }

  client.flush();
  String s1 = "HTTP/1.1 200 OK\r\nConnection: keep-alive\r\nCache-Control: private, no-store\r\n\r\n"
             "<!DOCTYPE HTML>"
             "<html>"
             "<head>"
             " <meta charset=\"UTF-8\" />"
             "<meta http-equiv='refresh' content='2'/>"
             " <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\"> "
             " <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"> "
             " <title>LED</title>"
             " </head><body>";
             
      s1 += exo;
      s1 += value1;
      s1 += value2;
    
   String  s2 = "     <div class=\"container\">"
             "         <section class=\"color-1\">"
             "             <p>"
             "                 <a href=\"/gpio?LEDd5=0\"><button class=\"btn btn-4 btn-4a\">d5=0</button></a>"
             "                 <a href=\"/gpio?LEDd5=1\"><button class=\"btn btn-4 btn-4a\">d5=1</button></a>" 
             "                 <a href=\"/gpio?LEDd5=2\"><button class=\"btn btn-4 btn-4a\">d5=2</button></a>" 
             "                 <a href=\"/gpio?LEDd5=3\"><button class=\"btn btn-4 btn-4a\">d5=3</button></a>" 
             "                 <a href=\"/gpio?LEDd5=4\"><button class=\"btn btn-4 btn-4a\">d5=4</button></a>"              
             "                 <a href=\"/gpio?LEDd5=5\"><button class=\"btn btn-4 btn-4a\">d5=5</button></a>" 
             "                 <a href=\"/gpio?LEDd5=6\"><button class=\"btn btn-4 btn-4a\">d5=6</button></a>" 
             "                 <a href=\"/gpio?LEDd5=7\"><button class=\"btn btn-4 btn-4a\">d5=7</button></a>" 
             "                 <a href=\"/gpio?LEDd5=8\"><button class=\"btn btn-4 btn-4a\">d5=8</button></a>" 
             "                 <a href=\"/gpio?LEDd5=9\"><button class=\"btn btn-4 btn-4a\">d5=9</button></a>" 
             "<br>"                                                                                            
             "                 <a href=\"/gpio?LEDd6=0\"><button class=\"btn btn-4 btn-4a\">d6=0</button></a>"      
             "                 <a href=\"/gpio?LEDd6=1\"><button class=\"btn btn-4 btn-4a\">d6=1</button></a>"
             "                 <a href=\"/gpio?LEDd6=2\"><button class=\"btn btn-4 btn-4a\">d6=2</button></a>"
             "                 <a href=\"/gpio?LEDd6=3\"><button class=\"btn btn-4 btn-4a\">d6=3</button></a>"
             "                 <a href=\"/gpio?LEDd6=4\"><button class=\"btn btn-4 btn-4a\">d6=4</button></a>"
             "                 <a href=\"/gpio?LEDd6=5\"><button class=\"btn btn-4 btn-4a\">d6=5</button></a>"
             "                 <a href=\"/gpio?LEDd6=6\"><button class=\"btn btn-4 btn-4a\">d6=6</button></a>"
             "                 <a href=\"/gpio?LEDd6=7\"><button class=\"btn btn-4 btn-4a\">d6=7</button></a>"
             "                 <a href=\"/gpio?LEDd6=8\"><button class=\"btn btn-4 btn-4a\">d6=8</button></a>"
             "                 <a href=\"/gpio?LEDd6=9\"><button class=\"btn btn-4 btn-4a\">d6=9</button></a>"
             "<br>"      
             "                 <a href=\"/gpio?LEDd7=0\"><button class=\"btn btn-4 btn-4a\">d7=0</button></a>"
             "                 <a href=\"/gpio?LEDd7=1\"><button class=\"btn btn-4 btn-4a\">d7=1</button></a>"
             "                 <a href=\"/gpio?LEDd7=2\"><button class=\"btn btn-4 btn-4a\">d7=2</button></a>"
             "                 <a href=\"/gpio?LEDd7=3\"><button class=\"btn btn-4 btn-4a\">d7=3</button></a>"
             "                 <a href=\"/gpio?LEDd7=4\"><button class=\"btn btn-4 btn-4a\">d7=4</button></a>"
             "                 <a href=\"/gpio?LEDd7=5\"><button class=\"btn btn-4 btn-4a\">d7=5</button></a>"
             "                 <a href=\"/gpio?LEDd7=6\"><button class=\"btn btn-4 btn-4a\">d7=6</button></a>"
             "                 <a href=\"/gpio?LEDd7=7\"><button class=\"btn btn-4 btn-4a\">d7=7</button></a>"
             "                 <a href=\"/gpio?LEDd7=8\"><button class=\"btn btn-4 btn-4a\">d7=8</button></a>"                                                                                                              
             "                 <a href=\"/gpio?LEDd7=9\"><button class=\"btn btn-4 btn-4a\">d7=9</button></a>"
             "<br>"   
             "                 <a href=\"/gpio?LEDd8=0\"><button class=\"btn btn-4 btn-4a\">0</button></a>"
             "                 <a href=\"/gpio?LEDd8=1\"><button class=\"btn btn-4 btn-4a\">1</button></a>"
             "                 <a href=\"/gpio?LEDd8=2\"><button class=\"btn btn-4 btn-4a\">2</button></a>"
             "                 <a href=\"/gpio?LEDd8=3\"><button class=\"btn btn-4 btn-4a\">3</button></a>"
             "                 <a href=\"/gpio?LEDd8=4\"><button class=\"btn btn-4 btn-4a\">4</button></a>"
             "                 <a href=\"/gpio?LEDd8=5\"><button class=\"btn btn-4 btn-4a\">5</button></a>"
             "                 <a href=\"/gpio?LEDd8=6\"><button class=\"btn btn-4 btn-4a\">6</button></a>"
             "                 <a href=\"/gpio?LEDd8=7\"><button class=\"btn btn-4 btn-4a\">7</button></a>"
             "                 <a href=\"/gpio?LEDd8=8\"><button class=\"btn btn-4 btn-4a\">8</button></a>"                                                                                 
             "                 <a href=\"/gpio?LEDd8=9\"><button class=\"btn btn-4 btn-4a\">9</button></a>"    
                "<br>"   
             "                 <a href=\"/gpio?LEDOff=0\"><button class=\"btn btn-4 btn-4a\">0</button></a>"
             "             </p>"
             "         </section>"
             "     </div>"
             "</body></html>";

 
  client.print(s1+s2); 
  delay(1);
  

}
//exolot



//Wifi server
void CreateWiFiAP()
{
  WiFi.disconnect();
  WiFi.mode(WIFI_AP);
  WiFi.softAPConfig(StaticIP, StaticIP, IPAddress(255, 255, 255, 0)); 
  WiFi.softAP(ssidAP, passwordAP);
}

void ConnectWiFiLan()
{
  WiFi.disconnect();
  WiFi.mode(WIFI_STA);
  WiFi.softAPdisconnect(true); 
  WiFi.enableAP(false); 


  delay(500);
  Serial.print("\nWi-Fi connecting");
  WiFi.config(StaticIP, GateIP, IPAddress(255, 255, 255, 0));
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.print("\nConnected!");
}

Говорю сразу я переделывал его десятки раз. Может что-то уже быть не так как было изначально.
Flidi
Offline
Зарегистрирован: 23.07.2020

Считать одновременно или поочереди з SoftSerial и client у меня не получается. В результате считывание происходить з чего-то одного иногда очень редко проскакивает и другое. 

b707
Offline
Зарегистрирован: 26.05.2017

Flidi пишет:

Считать одновременно или поочереди з SoftSerial и client у меня не получается.

Как я и думал, библиотеки к вашей проблеме отношения не имеют. Затык в кривом коде. Вы взяли два скетча - один ТОЛЬКО для веб, другой ТОЛЬКО для GPS - и просто слили их вместе.  В результате пока у вас идут данные с GPS - вы не читаете клиента, а потом перескакиваете в клиент и зависаете в нем. Например, посмотрите на цикл while в строчках 223-226. Вы в курсе что он делает? - этот цикл тупо ждет, пока у client не появится подключения. И при этом не дает работать всей остальной программе.

Большинство контроллеров Ардуино - однозадачные. Это значит, что они не могут делать одновременно более одного дела. Но это не значит. что решить вашу задачу на ардуино невозможно. Чтобы выполнять два и больше задач разом - надо особым образом писать программу, чтобы контроллер постоянно переключался между задачами. В вашем случае - проверил быстренько GPS, получил с него строчку - тут же переключился в клиент, проверил подключение. Если нет нового - обратно в GPS. И так десятки раз в секунду.

Но для этого код нужно писать таким образом с самого начала. Все процедуры должны быть короткими и быстрымы, желательно без операторов delay и циклов while.

И из этого следует, что нельзя просто взять два готовых кода, каждый из которых делает что-то одно и слить - работать не будет. Ваш код просто так не исправить, его надо переписывать заново.

Flidi
Offline
Зарегистрирован: 23.07.2020

b707 пишет:

Flidi пишет:

Считать одновременно или поочереди з SoftSerial и client у меня не получается.

Как я и думал, библиотеки к вашей проблеме отношения не имеют. Затык в кривом коде. Вы взяли два скетча - один ТОЛЬКО для веб, другой ТОЛЬКО для GPS - и тупо слили их вместе.  В результате пока у вас идут данные с GPS - вы не читаете клиента, а потом перескакиваете в клиент и тупо зависаете в нем. Например, посмотрите на цикл while в строчках 223-226. Вы в курсе что он делает? - этот цикл тупо ждет, пока у client не появится подключения. И при этом не дает работать всей остальной программе.

Большинство контроллеров Ардуино - однозадачные. Это значит, что они не могут делать одновременно более одного дела. Но это не значит. что решить вашу задачу на ардуино невозможно. Чтобы выполнять два и больше задач разом - надо особым образом писать программу, чтобы контроллер постоянно переключался между задачами. В вашем случае - проверил быстренько GPS, получил с него строчку - тут же переключился в клиент, проверил подключение. Если нет нового - обратно в GPS. И так десятки раз в секунду.

Но для этого код нужно писать таким образом с самого начала. Все процедуры должны быть короткими и быстрымы, желательно без операторов delay и циклов while.

И из этого следует, что нельзя просто взять два готовых кода, каждый из которых делает что-то одно и слить - работать не будет. Ваш код просто так не исправить, его надо переписывать заново.

 

Если данных нет надо ждать

  while (!client.available()) {
    ArduinoOTA.handle();
    delay(1);
  }

Вот блин начинаю вспоминать что там где ДЖПС

while (SoftSerial.available() > 0) { 

Я ставил 

if (SoftSerial.available() > 0) { 

А вот об этом я забыл. 

  while (!client.available()) {

    ArduinoOTA.handle();
    delay(1);
  }
 
Это надо удалить и поставить...  if (client.available()) { и делать  обработку кнопок.
 
Я правильно понял?
 
 
b707
Offline
Зарегистрирован: 26.05.2017

Flidi пишет:

  while (!client.available()) {

    ArduinoOTA.handle();
    delay(1);
  }
 
Это надо удалить и поставить...  if (client.available()) { и делать  обработку кнопок.
 
Я правильно понял?
 
попробуйте. Вряд ли это полностью решит все проблемы, но помочь должно
Flidi
Offline
Зарегистрирован: 23.07.2020

b707 пишет:

Flidi пишет:

  while (!client.available()) {

    ArduinoOTA.handle();
    delay(1);
  }
 
Это надо удалить и поставить...  if (client.available()) { и делать  обработку кнопок.
 
Я правильно понял?
 
попробуйте. Вряд ли это полностью решит все проблемы, но помочь должно

Спасибо!! Обязательно попробую.

Flidi
Offline
Зарегистрирован: 23.07.2020

b707 пишет:

Flidi пишет:

  while (!client.available()) {

    ArduinoOTA.handle();
    delay(1);
  }
 
Это надо удалить и поставить...  if (client.available()) { и делать  обработку кнопок.
 
Я правильно понял?
 
попробуйте. Вряд ли это полностью решит все проблемы, но помочь должно

Вот таким макаром 

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ArduinoOTA.h>

//exolot
#include <NewPing.h>
#include <MedianFilter.h>
#include <Wire.h>
#include <MedianFilter.h>


#define TRIGGER_PIN  16 
#define ECHO_PIN     5  
#define MAX_DISTANCE 2000 

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); 

MedianFilter filter(31, 0);

int timer1, timer2;
String value1, value2, value3;

//web server
const char* ssidAP = "ESPWebServer";
const char* passwordAP = "1234567890";

const char* ssid = "EnergyCores_Majic-Power"; 
const char* password = "12481632"; 

IPAddress StaticIP(192, 168, 1, 35); 
IPAddress GateIP(192, 168, 1, 1);

WiFiServer server(80);

//gps
#include <TinyGPS++.h>
#include <SoftwareSerial.h>

TinyGPSPlus gps;

#define S_RX    0                // Вывод RX
#define S_TX    4                // Вывод TX

SoftwareSerial SoftSerial(S_RX, S_TX);


void setup() {
  //gps
  SoftSerial.begin(9600);

  // Wifi Server
  Serial.begin(115200);
  delay(10);

  // prepare GPIO16
  pinMode(14, OUTPUT); //d5
  pinMode(12, OUTPUT); //d6
  pinMode(13, OUTPUT); //d7
  pinMode(15, OUTPUT); //d8
  analogWriteFreq(150); 
  analogWriteRange(9); 



  CreateWiFiAP(); 
  delay(1500);    

  //ConnectWiFiLan(); 

  server.begin();
  analogWrite(16, 0); 

  // Start OTA server.
  ArduinoOTA.setHostname("OTA->ESP");
  ArduinoOTA.begin();


}

void loop() {
  //exolot
  timer1 ++;
  if (timer1 == 1000) {
    timer1 = 0;
    exolot();
  }

  //Gps
  static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;


  if (!SoftSerial.available()) {
    return;
  }
  
  if (SoftSerial.available() > 0) {

    if (gps.encode(SoftSerial.read())) {

      if (gps.location.isValid()) {

        Serial.print("Latitude   = ");
        Serial.println(gps.location.lat(), 6);
        Serial.print("Longitude  = ");
        Serial.println(gps.location.lng(), 6);
        value1 = String(gps.location.lat(), 6); 
        value2 = String(gps.location.lng(), 6);

      }
      else
        Serial.println("Location Invalid");

      if (gps.speed.isValid()) {
        Serial.print("Speed      = ");
        Serial.print(gps.speed.kmph());
        Serial.println(" kmph");
      }
      else
        Serial.println("Speed Invalid");

      if (gps.satellites.isValid()) {
        Serial.print("Satellites = ");
        Serial.println(gps.satellites.value());
      }
      else {
        Serial.println("Satellites Invalid");
      }

      if (gps.course.isValid()) {
        Serial.print("Course = ");
        const char *curse = TinyGPSPlus::cardinal(gps.course.deg());
        Serial.println(curse);
      }
      else {
        Serial.println("Course Invalid");
      }

      //to point

      unsigned long distanceKmToLondon =
        (unsigned long)TinyGPSPlus::distanceBetween(
          gps.location.lat(),
          gps.location.lng(),
          LONDON_LAT,
          LONDON_LON) / 1000;
      Serial.print("Distans to london = ");
      Serial.println(distanceKmToLondon);

      double courseToLondon =
        TinyGPSPlus::courseTo(
          gps.location.lat(),
          gps.location.lng(),
          LONDON_LAT,
          LONDON_LON);

      Serial.print("Course to london = ");
      Serial.println(courseToLondon);

      const char *cardinalToLondon = TinyGPSPlus::cardinal(courseToLondon);
      Serial.print("Cardinal to london = ");
      Serial.println(cardinalToLondon);

    }

  }



  //Wifi Server

  ArduinoOTA.handle();
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }

  // Wait until the client sends some data
  if (client.available()) {
    //ArduinoOTA.handle();
    //delay(1);


    // Read the first line of the request
    String req = client.readStringUntil('\r');
    Serial.println(req); 
    client.flush();
    //  Serial.print("\nMessage recieved");



    //gpio 14, d5
    if (req.indexOf("d5=") != -1) 
    {
      int val = (int)req[req.indexOf("=") + 1] - 48; 
      analogWrite(14, 0 + val);
      analogWrite(12, 0);
    }

    //gpio 12, d6
    if (req.indexOf("d6=") != -1) 
    {
      int val = (int)req[req.indexOf("=") + 1] - 48; 
      analogWrite(12, 0 + val);
      analogWrite(14, 0);
    }

    //gpio 13, d7
    if (req.indexOf("d7=") != -1) 
    {
      int val = (int)req[req.indexOf("=") + 1] - 48; 
      analogWrite(13, 0 + val);
      analogWrite(15, 0);
    }
    //gpio 15, d8
    if (req.indexOf("d8=") != -1) 
    {
      int val = (int)req[req.indexOf("=") + 1] - 48; 
      analogWrite(15, 0 + val);
      analogWrite(13, 0);
    }

    if (req.indexOf("Off=") != -1) 
    {
      int val = (int)req[req.indexOf("=") + 1] - 48; 
      analogWrite(15, 0);
      analogWrite(13, 0);
      analogWrite(12, 0);
      analogWrite(14, 0);
    }

  }

  client.flush();
  String s1 = "HTTP/1.1 200 OK\r\nConnection: keep-alive\r\nCache-Control: private, no-store\r\n\r\n"
              "<!DOCTYPE HTML>"
              "<html>"
              "<head>"
              " <meta charset=\"UTF-8\" />"
              "<meta http-equiv='refresh' content='2'/>"
              " <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\"> "
              " <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"> "
              " <title>LED</title>"
              " </head><body>";

  String s2 = "<input type=\"text\" size=\"10\" name=\"value1\" value=\"" + value1 + "\">" ;

  String s3 = "<input type=\"text\" size=\"10\" name=\"value2\" value=\"" + value2 + "\">" ;

  s3 += "<input type=\"text\" size=\"10\" name=\"value2\" value=\"" + value3 + "\">" ;

  String ss = "     <div class=\"container\">"
              "         <section class=\"color-1\">"
              "             <p>"
              "                 <a href=\"/gpio?LEDd5=0\"><button class=\"btn btn-4 btn-4a\">d5=0</button></a>"
              "                 <a href=\"/gpio?LEDd5=1\"><button class=\"btn btn-4 btn-4a\">d5=1</button></a>"
              "                 <a href=\"/gpio?LEDd5=2\"><button class=\"btn btn-4 btn-4a\">d5=2</button></a>"
              "                 <a href=\"/gpio?LEDd5=3\"><button class=\"btn btn-4 btn-4a\">d5=3</button></a>"
              "                 <a href=\"/gpio?LEDd5=4\"><button class=\"btn btn-4 btn-4a\">d5=4</button></a>"
              "                 <a href=\"/gpio?LEDd5=5\"><button class=\"btn btn-4 btn-4a\">d5=5</button></a>"
              "                 <a href=\"/gpio?LEDd5=6\"><button class=\"btn btn-4 btn-4a\">d5=6</button></a>"
              "                 <a href=\"/gpio?LEDd5=7\"><button class=\"btn btn-4 btn-4a\">d5=7</button></a>"
              "                 <a href=\"/gpio?LEDd5=8\"><button class=\"btn btn-4 btn-4a\">d5=8</button></a>"
              "                 <a href=\"/gpio?LEDd5=9\"><button class=\"btn btn-4 btn-4a\">d5=9</button></a>"
              "<br>"
              "                 <a href=\"/gpio?LEDd6=0\"><button class=\"btn btn-4 btn-4a\">d6=0</button></a>"
              "                 <a href=\"/gpio?LEDd6=1\"><button class=\"btn btn-4 btn-4a\">d6=1</button></a>"
              "                 <a href=\"/gpio?LEDd6=2\"><button class=\"btn btn-4 btn-4a\">d6=2</button></a>"
              "                 <a href=\"/gpio?LEDd6=3\"><button class=\"btn btn-4 btn-4a\">d6=3</button></a>"
              "                 <a href=\"/gpio?LEDd6=4\"><button class=\"btn btn-4 btn-4a\">d6=4</button></a>"
              "                 <a href=\"/gpio?LEDd6=5\"><button class=\"btn btn-4 btn-4a\">d6=5</button></a>"
              "                 <a href=\"/gpio?LEDd6=6\"><button class=\"btn btn-4 btn-4a\">d6=6</button></a>"
              "                 <a href=\"/gpio?LEDd6=7\"><button class=\"btn btn-4 btn-4a\">d6=7</button></a>"
              "                 <a href=\"/gpio?LEDd6=8\"><button class=\"btn btn-4 btn-4a\">d6=8</button></a>"
              "                 <a href=\"/gpio?LEDd6=9\"><button class=\"btn btn-4 btn-4a\">d6=9</button></a>"
              "<br>"
              "                 <a href=\"/gpio?LEDd7=0\"><button class=\"btn btn-4 btn-4a\">d7=0</button></a>"
              "                 <a href=\"/gpio?LEDd7=1\"><button class=\"btn btn-4 btn-4a\">d7=1</button></a>"
              "                 <a href=\"/gpio?LEDd7=2\"><button class=\"btn btn-4 btn-4a\">d7=2</button></a>"
              "                 <a href=\"/gpio?LEDd7=3\"><button class=\"btn btn-4 btn-4a\">d7=3</button></a>"
              "                 <a href=\"/gpio?LEDd7=4\"><button class=\"btn btn-4 btn-4a\">d7=4</button></a>"
              "                 <a href=\"/gpio?LEDd7=5\"><button class=\"btn btn-4 btn-4a\">d7=5</button></a>"
              "                 <a href=\"/gpio?LEDd7=6\"><button class=\"btn btn-4 btn-4a\">d7=6</button></a>"
              "                 <a href=\"/gpio?LEDd7=7\"><button class=\"btn btn-4 btn-4a\">d7=7</button></a>"
              "                 <a href=\"/gpio?LEDd7=8\"><button class=\"btn btn-4 btn-4a\">d7=8</button></a>"
              "                 <a href=\"/gpio?LEDd7=9\"><button class=\"btn btn-4 btn-4a\">d7=9</button></a>"
              "<br>"
              "                 <a href=\"/gpio?LEDd8=0\"><button class=\"btn btn-4 btn-4a\">0</button></a>"
              "                 <a href=\"/gpio?LEDd8=1\"><button class=\"btn btn-4 btn-4a\">1</button></a>"
              "                 <a href=\"/gpio?LEDd8=2\"><button class=\"btn btn-4 btn-4a\">2</button></a>"
              "                 <a href=\"/gpio?LEDd8=3\"><button class=\"btn btn-4 btn-4a\">3</button></a>"
              "                 <a href=\"/gpio?LEDd8=4\"><button class=\"btn btn-4 btn-4a\">4</button></a>"
              "                 <a href=\"/gpio?LEDd8=5\"><button class=\"btn btn-4 btn-4a\">5</button></a>"
              "                 <a href=\"/gpio?LEDd8=6\"><button class=\"btn btn-4 btn-4a\">6</button></a>"
              "                 <a href=\"/gpio?LEDd8=7\"><button class=\"btn btn-4 btn-4a\">7</button></a>"
              "                 <a href=\"/gpio?LEDd8=8\"><button class=\"btn btn-4 btn-4a\">8</button></a>"
              "                 <a href=\"/gpio?LEDd8=9\"><button class=\"btn btn-4 btn-4a\">9</button></a>"
              "<br>"
              "                 <a href=\"/gpio?LEDOff=0\"><button class=\"btn btn-4 btn-4a\">0</button></a>"
              "             </p>"
              "         </section>"
              "     </div>"
              "</body></html>";


  client.print(s1 + s2 + s3 + ss); 
  delay(1);

}
//exolot
void exolot()
{
  for (int i = 0; i <= 2; i++) {
    delay (5);
    unsigned int o, uS = sonar.ping(); 

    filter.in(uS);
    o = filter.out();
    Serial.print("Ping: ");
    Serial.print( o / US_ROUNDTRIP_CM); 
    Serial.println("cm");
    value3 = o / US_ROUNDTRIP_CM;
  }
}

//Wifi server
void CreateWiFiAP()
{
  WiFi.disconnect();
  WiFi.mode(WIFI_AP);
  WiFi.softAPConfig(StaticIP, StaticIP, IPAddress(255, 255, 255, 0)); 
  WiFi.softAP(ssidAP, passwordAP);
}

void ConnectWiFiLan()
{
  WiFi.disconnect();
  WiFi.mode(WIFI_STA);
  WiFi.softAPdisconnect(true); 
  WiFi.enableAP(false); 


  delay(500);
  Serial.print("\nWi-Fi connecting");
  WiFi.config(StaticIP, GateIP, IPAddress(255, 255, 255, 0));
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.print("\nConnected!");
}

Работает GPS, но кнопка срабатывает если нажимать ее десятки раз в секунду. Это лучшее что у меня получилось.
 
По инфе 
 
 
Софт сериал нельзя отключать и включать по желанию. Есть listen(); , но его нельзя использовать для ВайФай точней я пробивал брать client.listen(); или server.listen(); и ошибка одна  'class WiFiClient' has no member named 'listen'
 
Теперь надо думать над тем как тормознуть Софт сериал... Есть пара идей, но уже завтра буду проводить эксперименты, а то снова уснуть не смогу.
b707
Offline
Зарегистрирован: 26.05.2017

Flidi пишет:

По инфе 
 
 
Софт сериал нельзя отключать и включать по желанию. Есть listen(); , но его нельзя использовать для ВайФай точней я пробивал брать client.listen(); или server.listen(); и ошибка одна  'class WiFiClient' has no member named 'listen'
 
Теперь надо думать над тем как тормознуть Софт сериал... Есть пара идей, но уже завтра буду проводить эксперименты, а то снова уснуть не смогу.

не хочу вас расстраивать, но инфа по приведенной ссылке опять не имеет ничего общего с вашими проблемами.  Отключать софтсериал требуется в одном случае - когда их в скетче два и более. А у вас он - один, поэтому "тормозить" его не надо.

И уверяю вас, что Софтсериал и Webclient не могут конфликтовать, потому что работают на совершенно разных принципах. И оба они не влияют на работоспособность кнопок.

Я уже писал раньше - у вас нет в скетче аппаратных проблем и нет конфликта библиотек. Проблема в вашем коде.

 

b707
Offline
Зарегистрирован: 26.05.2017

Ну и как иллюстрация к предыдущему сообщению - строчки 93-95 и 175-177 - полный бред. Их надо обязательно выкинуть, особенно первое условие. Думаю. кстати, когда вы их удалите - ситуация с работой программы станет значительно лучше.

Попробуйте сами догадаться, почему они мешают, это не сложно. Не догадаетесь - завтра обьясню.

Flidi
Offline
Зарегистрирован: 23.07.2020

b707 пишет:

Ну и как иллюстрация к предыдущему сообщению - строчки 93-95 и 175-177 - полный бред. Их надо обязательно выкинуть, особенно первое условие. Думаю. кстати, когда вы их удалите - ситуация с работой программы станет значительно лучше.

Попробуйте сами догадаться, почему они мешают, это не сложно. Не догадаетесь - завтра обьясню.

Как я понимаю If з return запускают ардуино полностью по новому циклу void loop(), или я ошибаюсь ?

Буду очень благодарен разъяснению.

Дело в том если я убираю If з return клиентская часть перестает реагировать на кнопки, даже если я отправляю их, по десятку раз в секунду. Но, если я делаю на ПК скрипт который отправляет беспрерывно поток нажатий тогда есть реакция.

Логика без иф ретурн должна быть правильная, но она не работает. А логика з If з return не правильная, но в даном случае частично работает. Что я упускаю?

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ArduinoOTA.h>

//exolot
#include <NewPing.h>
#include <MedianFilter.h>
#include <Wire.h>
#include <MedianFilter.h>


#define TRIGGER_PIN  16
#define ECHO_PIN     5
#define MAX_DISTANCE 2000

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

MedianFilter filter(31, 0);

int timer1, timer2;
String value1, value2, value3, req;

//web server
const char* ssidAP = "ESPWebServer";
const char* passwordAP = "1234567890";

const char* ssid = "EnergyCores_Majic-Power";
const char* password = "12481632";

IPAddress StaticIP(192, 168, 1, 35);
IPAddress GateIP(192, 168, 1, 1);

WiFiServer server(80);

//gps
#include <TinyGPS++.h>
#include <SoftwareSerial.h>

TinyGPSPlus gps;

#define S_RX    0                // Вывод RX
#define S_TX    4                // Вывод TX

SoftwareSerial SoftSerial(S_RX, S_TX);


void setup() {
  //gps
  SoftSerial.begin(9600);

  // Wifi Server
  Serial.begin(115200);
  delay(10);

  // prepare GPIO16
  pinMode(14, OUTPUT); //d5
  pinMode(12, OUTPUT); //d6
  pinMode(13, OUTPUT); //d7
  pinMode(15, OUTPUT); //d8
  analogWriteFreq(150);
  analogWriteRange(9);



  CreateWiFiAP();
  delay(1500);

  //ConnectWiFiLan();

  server.begin();
  analogWrite(16, 0);

  // Start OTA server.
  ArduinoOTA.setHostname("OTA->ESP");
  ArduinoOTA.begin();


}

void loop() {

  ArduinoOTA.handle();
  // Check if a client has connected
  WiFiClient client = server.available();
  
  //exolot
  timer1 ++;
  if (timer1 == 1000) {
    timer1 = 0;
    exolot();
  }

  //Gps
  static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;
  

  if (SoftSerial.available() > 0) {

    if (gps.encode(SoftSerial.read())) {

      if (gps.location.isValid()) {

        Serial.print("Latitude   = ");
        Serial.println(gps.location.lat(), 6);
        Serial.print("Longitude  = ");
        Serial.println(gps.location.lng(), 6);
        value1 = String(gps.location.lat(), 6);
        value2 = String(gps.location.lng(), 6);

      }
      else
        Serial.println("Location Invalid");

      if (gps.speed.isValid()) {
        Serial.print("Speed      = ");
        Serial.print(gps.speed.kmph());
        Serial.println(" kmph");
      }
      else
        Serial.println("Speed Invalid");

      if (gps.satellites.isValid()) {
        Serial.print("Satellites = ");
        Serial.println(gps.satellites.value());
      }
      else {
        Serial.println("Satellites Invalid");
      }

      if (gps.course.isValid()) {
        Serial.print("Course = ");
        const char *curse = TinyGPSPlus::cardinal(gps.course.deg());
        Serial.println(curse);
      }
      else {
        Serial.println("Course Invalid");
      }

      //to point

      unsigned long distanceKmToLondon =
        (unsigned long)TinyGPSPlus::distanceBetween(
          gps.location.lat(),
          gps.location.lng(),
          LONDON_LAT,
          LONDON_LON) / 1000;
      Serial.print("Distans to london = ");
      Serial.println(distanceKmToLondon);

      double courseToLondon =
        TinyGPSPlus::courseTo(
          gps.location.lat(),
          gps.location.lng(),
          LONDON_LAT,
          LONDON_LON);

      Serial.print("Course to london = ");
      Serial.println(courseToLondon);

      const char *cardinalToLondon = TinyGPSPlus::cardinal(courseToLondon);
      Serial.print("Cardinal to london = ");
      Serial.println(cardinalToLondon);

    }

  }



  //Wifi Server



  // Wait until the client sends some data
  if (client.available()) {
    //ArduinoOTA.handle();
    //delay(1);


    // Read the first line of the request
    req = client.readStringUntil('\r');
    Serial.println(req);
    client.flush();
    //  Serial.print("\nMessage recieved");



    //gpio 14, d5
    if (req.indexOf("d5=") != -1)
    {
      int val = (int)req[req.indexOf("=") + 1] - 48;
      analogWrite(14, 0 + val);
      analogWrite(12, 0);
      req = "";
    }

    //gpio 12, d6
    if (req.indexOf("d6=") != -1)
    {
      int val = (int)req[req.indexOf("=") + 1] - 48;
      analogWrite(12, 0 + val);
      analogWrite(14, 0);
      req = "";
    }

    //gpio 13, d7
    if (req.indexOf("d7=") != -1)
    {
      int val = (int)req[req.indexOf("=") + 1] - 48;
      analogWrite(13, 0 + val);
      analogWrite(15, 0);
      req = "";
    }
    //gpio 15, d8
    if (req.indexOf("d8=") != -1)
    {
      int val = (int)req[req.indexOf("=") + 1] - 48;
      analogWrite(15, 0 + val);
      analogWrite(13, 0);
      req = "";
    }

    if (req.indexOf("Off=") != -1)
    {
      int val = (int)req[req.indexOf("=") + 1] - 48;
      analogWrite(15, 0);
      analogWrite(13, 0);
      analogWrite(12, 0);
      analogWrite(14, 0);
      req = "";
    }

  }

  client.flush();
  client.print( "HTTP/1.1 200 OK\r\nConnection: keep-alive\r\nCache-Control: private, no-store\r\n\r\n");
  client.print("<!DOCTYPE HTML>");
  client.print("<html>");
  client.print("<head>");
  client.print(" <meta charset=\"UTF-8\" />");
  client.print("<meta http-equiv='refresh' content='2'/>");
  client.print(" <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\"> ");
  client.print(" <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"> ");
  client.print(" <title>LED</title>");
  client.print(" </head><body>");

  String s1 = ("<input type=\"text\" size=\"10\" name=\"value1\" value=\"" + value1 + "\">");

  String s2 = ("<input type=\"text\" size=\"10\" name=\"value2\" value=\"" + value2 + "\">");

  String s3 = ("<input type=\"text\" size=\"10\" name=\"value2\" value=\"" + value3 + "\">");
  client.print(s1 + s2 + s3);

  client.print("     <div class=\"container\">");
  client.print("         <section class=\"color-1\">");
  client.print("             <p>");
  client.print("                 <a href=\"/gpio?LEDd5=0\"><button class=\"btn btn-4 btn-4a\">d5=0</button></a>");
  client.print("                 <a href=\"/gpio?LEDd5=1\"><button class=\"btn btn-4 btn-4a\">d5=1</button></a>");
  client.print("                 <a href=\"/gpio?LEDd5=2\"><button class=\"btn btn-4 btn-4a\">d5=2</button></a>");
  client.print("                 <a href=\"/gpio?LEDd5=3\"><button class=\"btn btn-4 btn-4a\">d5=3</button></a>");
  client.print("                 <a href=\"/gpio?LEDd5=4\"><button class=\"btn btn-4 btn-4a\">d5=4</button></a>");
  client.print("                 <a href=\"/gpio?LEDd5=5\"><button class=\"btn btn-4 btn-4a\">d5=5</button></a>");
  client.print("                 <a href=\"/gpio?LEDd5=6\"><button class=\"btn btn-4 btn-4a\">d5=6</button></a>");
  client.print("                 <a href=\"/gpio?LEDd5=7\"><button class=\"btn btn-4 btn-4a\">d5=7</button></a>");
  client.print("                 <a href=\"/gpio?LEDd5=8\"><button class=\"btn btn-4 btn-4a\">d5=8</button></a>");
  client.print("                 <a href=\"/gpio?LEDd5=9\"><button class=\"btn btn-4 btn-4a\">d5=9</button></a>");
  client.print("<br>");
  client.print("                 <a href=\"/gpio?LEDd6=0\"><button class=\"btn btn-4 btn-4a\">d6=0</button></a>");
  client.print("                 <a href=\"/gpio?LEDd6=1\"><button class=\"btn btn-4 btn-4a\">d6=1</button></a>");
  client.print("                 <a href=\"/gpio?LEDd6=2\"><button class=\"btn btn-4 btn-4a\">d6=2</button></a>");
  client.print("                 <a href=\"/gpio?LEDd6=3\"><button class=\"btn btn-4 btn-4a\">d6=3</button></a>");
  client.print("                 <a href=\"/gpio?LEDd6=4\"><button class=\"btn btn-4 btn-4a\">d6=4</button></a>");
  client.print("                 <a href=\"/gpio?LEDd6=5\"><button class=\"btn btn-4 btn-4a\">d6=5</button></a>");
  client.print("                 <a href=\"/gpio?LEDd6=6\"><button class=\"btn btn-4 btn-4a\">d6=6</button></a>");
  client.print("                 <a href=\"/gpio?LEDd6=7\"><button class=\"btn btn-4 btn-4a\">d6=7</button></a>");
  client.print("                 <a href=\"/gpio?LEDd6=8\"><button class=\"btn btn-4 btn-4a\">d6=8</button></a>");
  client.print("                 <a href=\"/gpio?LEDd6=9\"><button class=\"btn btn-4 btn-4a\">d6=9</button></a>");
  client.print("<br>");
  client.print("                 <a href=\"/gpio?LEDd7=0\"><button class=\"btn btn-4 btn-4a\">d7=0</button></a>");
  client.print("                 <a href=\"/gpio?LEDd7=1\"><button class=\"btn btn-4 btn-4a\">d7=1</button></a>");
  client.print("                 <a href=\"/gpio?LEDd7=2\"><button class=\"btn btn-4 btn-4a\">d7=2</button></a>");
  client.print("                 <a href=\"/gpio?LEDd7=3\"><button class=\"btn btn-4 btn-4a\">d7=3</button></a>");
  client.print("                 <a href=\"/gpio?LEDd7=4\"><button class=\"btn btn-4 btn-4a\">d7=4</button></a>");
  client.print("                 <a href=\"/gpio?LEDd7=5\"><button class=\"btn btn-4 btn-4a\">d7=5</button></a>");
  client.print("                 <a href=\"/gpio?LEDd7=6\"><button class=\"btn btn-4 btn-4a\">d7=6</button></a>");
  client.print("                 <a href=\"/gpio?LEDd7=7\"><button class=\"btn btn-4 btn-4a\">d7=7</button></a>");
  client.print("                 <a href=\"/gpio?LEDd7=8\"><button class=\"btn btn-4 btn-4a\">d7=8</button></a>");
  client.print("                 <a href=\"/gpio?LEDd7=9\"><button class=\"btn btn-4 btn-4a\">d7=9</button></a>");
  client.print("<br>");
  client.print("                 <a href=\"/gpio?LEDd8=0\"><button class=\"btn btn-4 btn-4a\">0</button></a>");
  client.print("                 <a href=\"/gpio?LEDd8=1\"><button class=\"btn btn-4 btn-4a\">1</button></a>");
  client.print("                 <a href=\"/gpio?LEDd8=2\"><button class=\"btn btn-4 btn-4a\">2</button></a>");
  client.print("                 <a href=\"/gpio?LEDd8=3\"><button class=\"btn btn-4 btn-4a\">3</button></a>");
  client.print("                 <a href=\"/gpio?LEDd8=4\"><button class=\"btn btn-4 btn-4a\">4</button></a>");
  client.print("                 <a href=\"/gpio?LEDd8=5\"><button class=\"btn btn-4 btn-4a\">5</button></a>");
  client.print("                 <a href=\"/gpio?LEDd8=6\"><button class=\"btn btn-4 btn-4a\">6</button></a>");
  client.print("                 <a href=\"/gpio?LEDd8=7\"><button class=\"btn btn-4 btn-4a\">7</button></a>");
  client.print("                 <a href=\"/gpio?LEDd8=8\"><button class=\"btn btn-4 btn-4a\">8</button></a>");
  client.print("                 <a href=\"/gpio?LEDd8=9\"><button class=\"btn btn-4 btn-4a\">9</button></a>");
  client.print("<br>");
  client.print("                 <a href=\"/gpio?LEDOff=0\"><button class=\"btn btn-4 btn-4a\">0</button></a>");
  client.print("             </p>");
  client.print("         </section>");
  client.print("     </div>");
  client.print("</body></html>");




  req = "";
}
//exolot
void exolot()
{
  for (int i = 0; i <= 2; i++) {
    delay (5);
    unsigned int o, uS = sonar.ping();

    filter.in(uS);
    o = filter.out();
    Serial.print("Ping: ");
    Serial.print( o / US_ROUNDTRIP_CM);
    Serial.println("cm");
    value3 = o / US_ROUNDTRIP_CM;
  }
}

//Wifi server
void CreateWiFiAP()
{
  WiFi.disconnect();
  WiFi.mode(WIFI_AP);
  WiFi.softAPConfig(StaticIP, StaticIP, IPAddress(255, 255, 255, 0));
  WiFi.softAP(ssidAP, passwordAP);
}

void ConnectWiFiLan()
{
  WiFi.disconnect();
  WiFi.mode(WIFI_STA);
  WiFi.softAPdisconnect(true);
  WiFi.enableAP(false);


  delay(500);
  Serial.print("\nWi-Fi connecting");
  WiFi.config(StaticIP, GateIP, IPAddress(255, 255, 255, 0));
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.print("\nConnected!");
}

Я даже client.print изменил что бы оперативную памать освободить. Но оно не работает как должно. Что я упускаю?

v258
Offline
Зарегистрирован: 25.05.2020

return - это выход из процедуры. Как только он у вас срабатывает в лупе, тут луп и заканчивается. И МК просто останавливается. Естественно, ни на какие кнопки он реагировать уже не будет. До перезапуска

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

v258 пишет:

тут луп и заканчивается. И МК просто останавливается

с хрена ли? 

Flidi
Offline
Зарегистрирован: 23.07.2020

b707 пишет:

Ну и как иллюстрация к предыдущему сообщению - строчки 93-95 и 175-177 - полный бред. Их надо обязательно выкинуть, особенно первое условие. Думаю. кстати, когда вы их удалите - ситуация с работой программы станет значительно лучше.

Попробуйте сами догадаться, почему они мешают, это не сложно. Не догадаетесь - завтра обьясню.

Кажись понять проблему логики. Но возник вопрос ...

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ArduinoOTA.h>

//exolot
#include <NewPing.h>
#include <MedianFilter.h>
#include <Wire.h>
#include <MedianFilter.h>


#define TRIGGER_PIN  16
#define ECHO_PIN     5
#define MAX_DISTANCE 2000

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

MedianFilter filter(31, 0);

int timer1, timer2;
String value1, value2, value3, req;

//web server
const char* ssidAP = "ESPWebServer";
const char* passwordAP = "1234567890";

const char* ssid = "EnergyCores_Majic-Power";
const char* password = "12481632";

IPAddress StaticIP(192, 168, 1, 35);
IPAddress GateIP(192, 168, 1, 1);

WiFiServer server(80);

//gps
#include <TinyGPS++.h>
#include <SoftwareSerial.h>

TinyGPSPlus gps;

#define S_RX    0                // Вывод RX
#define S_TX    4                // Вывод TX

SoftwareSerial SoftSerial(S_RX, S_TX);


void setup() {
  //gps
  SoftSerial.begin(9600);

  // Wifi Server
  Serial.begin(115200);
  delay(10);

  // prepare GPIO16
  pinMode(14, OUTPUT); //d5
  pinMode(12, OUTPUT); //d6
  pinMode(13, OUTPUT); //d7
  pinMode(15, OUTPUT); //d8
  analogWriteFreq(150);
  analogWriteRange(9);



  CreateWiFiAP();
  delay(1500);

  //ConnectWiFiLan();

  server.begin();
  analogWrite(16, 0);

  // Start OTA server.
  ArduinoOTA.setHostname("OTA->ESP");
  ArduinoOTA.begin();


}

void loop() {

  //Gps
  static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;
  

  if (SoftSerial.available() > 0) {
    for (int j = 0; j <= 1; j++) 
    {

            if (gps.encode(SoftSerial.read())) 
            {
        
              if (gps.location.isValid()) 
              {
        
                Serial.print("Latitude   = ");
                Serial.println(gps.location.lat(), 6);
                Serial.print("Longitude  = ");
                Serial.println(gps.location.lng(), 6);
                value1 = String(gps.location.lat(), 6);
                value2 = String(gps.location.lng(), 6);
        
              }
              else
                Serial.println("Location Invalid");
        
              if (gps.speed.isValid()) {
                Serial.print("Speed      = ");
                Serial.print(gps.speed.kmph());
                Serial.println(" kmph");
              }
              else
                Serial.println("Speed Invalid");
        
              if (gps.satellites.isValid()) {
                Serial.print("Satellites = ");
                Serial.println(gps.satellites.value());
              }
              else {
                Serial.println("Satellites Invalid");
              }
        
              if (gps.course.isValid()) {
                Serial.print("Course = ");
                const char *curse = TinyGPSPlus::cardinal(gps.course.deg());
                Serial.println(curse);
              }
              else {
                Serial.println("Course Invalid");
              }
        
              //to point
        
              unsigned long distanceKmToLondon =
                (unsigned long)TinyGPSPlus::distanceBetween(
                  gps.location.lat(),
                  gps.location.lng(),
                  LONDON_LAT,
                  LONDON_LON) / 1000;
              Serial.print("Distans to london = ");
              Serial.println(distanceKmToLondon);
        
              double courseToLondon =
                TinyGPSPlus::courseTo(
                  gps.location.lat(),
                  gps.location.lng(),
                  LONDON_LAT,
                  LONDON_LON);
        
              Serial.print("Course to london = ");
              Serial.println(courseToLondon);
        
              const char *cardinalToLondon = TinyGPSPlus::cardinal(courseToLondon);
              Serial.print("Cardinal to london = ");
              Serial.println(cardinalToLondon);
        
            }
    }

  }



  //Wifi Server
  else {
    //exolot
    exolot();
    //ArduinoOTA.handle();
    //delay(1);
    ArduinoOTA.handle();
    // Check if a client has connected
    WiFiClient client = server.available();

    // Read the first line of the request
    req = client.readStringUntil('\r');
    Serial.println(req);
    client.flush();
    //  Serial.print("\nMessage recieved");



    //gpio 14, d5
    if (req.indexOf("d5=") != -1)
    {
      int val = (int)req[req.indexOf("=") + 1] - 48;
      analogWrite(14, 0 + val);
      analogWrite(12, 0);
      req = "";
    }

    //gpio 12, d6
    if (req.indexOf("d6=") != -1)
    {
      int val = (int)req[req.indexOf("=") + 1] - 48;
      analogWrite(12, 0 + val);
      analogWrite(14, 0);
      req = "";
    }

    //gpio 13, d7
    if (req.indexOf("d7=") != -1)
    {
      int val = (int)req[req.indexOf("=") + 1] - 48;
      analogWrite(13, 0 + val);
      analogWrite(15, 0);
      req = "";
    }
    //gpio 15, d8
    if (req.indexOf("d8=") != -1)
    {
      int val = (int)req[req.indexOf("=") + 1] - 48;
      analogWrite(15, 0 + val);
      analogWrite(13, 0);
      req = "";
    }

    if (req.indexOf("Off=") != -1)
    {
      int val = (int)req[req.indexOf("=") + 1] - 48;
      analogWrite(15, 0);
      analogWrite(13, 0);
      analogWrite(12, 0);
      analogWrite(14, 0);
      req = "";
    }

  
  
  client.flush();
  client.print( "HTTP/1.1 200 OK\r\nConnection: keep-alive\r\nCache-Control: private, no-store\r\n\r\n");
  client.print("<!DOCTYPE HTML>");
  client.print("<html>");
  client.print("<head>");
  client.print(" <meta charset=\"UTF-8\" />");
  client.print("<meta http-equiv='refresh' content='2'/>");
  client.print(" <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\"> ");
  client.print(" <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"> ");
  client.print(" <title>LED</title>");
  client.print(" </head><body>");

  String s1 = ("<input type=\"text\" size=\"10\" name=\"value1\" value=\"" + value1 + "\">");

  String s2 = ("<input type=\"text\" size=\"10\" name=\"value2\" value=\"" + value2 + "\">");

  String s3 = ("<input type=\"text\" size=\"10\" name=\"value2\" value=\"" + value3 + "\">");
  client.print(s1 + s2 + s3);

  client.print("     <div class=\"container\">");
  client.print("         <section class=\"color-1\">");
  client.print("             <p>");
  client.print("                 <a href=\"/gpio?LEDd5=0\"><button class=\"btn btn-4 btn-4a\">d5=0</button></a>");
  client.print("                 <a href=\"/gpio?LEDd5=1\"><button class=\"btn btn-4 btn-4a\">d5=1</button></a>");
  client.print("                 <a href=\"/gpio?LEDd5=2\"><button class=\"btn btn-4 btn-4a\">d5=2</button></a>");
  client.print("                 <a href=\"/gpio?LEDd5=3\"><button class=\"btn btn-4 btn-4a\">d5=3</button></a>");
  client.print("                 <a href=\"/gpio?LEDd5=4\"><button class=\"btn btn-4 btn-4a\">d5=4</button></a>");
  client.print("                 <a href=\"/gpio?LEDd5=5\"><button class=\"btn btn-4 btn-4a\">d5=5</button></a>");
  client.print("                 <a href=\"/gpio?LEDd5=6\"><button class=\"btn btn-4 btn-4a\">d5=6</button></a>");
  client.print("                 <a href=\"/gpio?LEDd5=7\"><button class=\"btn btn-4 btn-4a\">d5=7</button></a>");
  client.print("                 <a href=\"/gpio?LEDd5=8\"><button class=\"btn btn-4 btn-4a\">d5=8</button></a>");
  client.print("                 <a href=\"/gpio?LEDd5=9\"><button class=\"btn btn-4 btn-4a\">d5=9</button></a>");
  client.print("<br>");
  client.print("                 <a href=\"/gpio?LEDd6=0\"><button class=\"btn btn-4 btn-4a\">d6=0</button></a>");
  client.print("                 <a href=\"/gpio?LEDd6=1\"><button class=\"btn btn-4 btn-4a\">d6=1</button></a>");
  client.print("                 <a href=\"/gpio?LEDd6=2\"><button class=\"btn btn-4 btn-4a\">d6=2</button></a>");
  client.print("                 <a href=\"/gpio?LEDd6=3\"><button class=\"btn btn-4 btn-4a\">d6=3</button></a>");
  client.print("                 <a href=\"/gpio?LEDd6=4\"><button class=\"btn btn-4 btn-4a\">d6=4</button></a>");
  client.print("                 <a href=\"/gpio?LEDd6=5\"><button class=\"btn btn-4 btn-4a\">d6=5</button></a>");
  client.print("                 <a href=\"/gpio?LEDd6=6\"><button class=\"btn btn-4 btn-4a\">d6=6</button></a>");
  client.print("                 <a href=\"/gpio?LEDd6=7\"><button class=\"btn btn-4 btn-4a\">d6=7</button></a>");
  client.print("                 <a href=\"/gpio?LEDd6=8\"><button class=\"btn btn-4 btn-4a\">d6=8</button></a>");
  client.print("                 <a href=\"/gpio?LEDd6=9\"><button class=\"btn btn-4 btn-4a\">d6=9</button></a>");
  client.print("<br>");
  client.print("                 <a href=\"/gpio?LEDd7=0\"><button class=\"btn btn-4 btn-4a\">d7=0</button></a>");
  client.print("                 <a href=\"/gpio?LEDd7=1\"><button class=\"btn btn-4 btn-4a\">d7=1</button></a>");
  client.print("                 <a href=\"/gpio?LEDd7=2\"><button class=\"btn btn-4 btn-4a\">d7=2</button></a>");
  client.print("                 <a href=\"/gpio?LEDd7=3\"><button class=\"btn btn-4 btn-4a\">d7=3</button></a>");
  client.print("                 <a href=\"/gpio?LEDd7=4\"><button class=\"btn btn-4 btn-4a\">d7=4</button></a>");
  client.print("                 <a href=\"/gpio?LEDd7=5\"><button class=\"btn btn-4 btn-4a\">d7=5</button></a>");
  client.print("                 <a href=\"/gpio?LEDd7=6\"><button class=\"btn btn-4 btn-4a\">d7=6</button></a>");
  client.print("                 <a href=\"/gpio?LEDd7=7\"><button class=\"btn btn-4 btn-4a\">d7=7</button></a>");
  client.print("                 <a href=\"/gpio?LEDd7=8\"><button class=\"btn btn-4 btn-4a\">d7=8</button></a>");
  client.print("                 <a href=\"/gpio?LEDd7=9\"><button class=\"btn btn-4 btn-4a\">d7=9</button></a>");
  client.print("<br>");
  client.print("                 <a href=\"/gpio?LEDd8=0\"><button class=\"btn btn-4 btn-4a\">0</button></a>");
  client.print("                 <a href=\"/gpio?LEDd8=1\"><button class=\"btn btn-4 btn-4a\">1</button></a>");
  client.print("                 <a href=\"/gpio?LEDd8=2\"><button class=\"btn btn-4 btn-4a\">2</button></a>");
  client.print("                 <a href=\"/gpio?LEDd8=3\"><button class=\"btn btn-4 btn-4a\">3</button></a>");
  client.print("                 <a href=\"/gpio?LEDd8=4\"><button class=\"btn btn-4 btn-4a\">4</button></a>");
  client.print("                 <a href=\"/gpio?LEDd8=5\"><button class=\"btn btn-4 btn-4a\">5</button></a>");
  client.print("                 <a href=\"/gpio?LEDd8=6\"><button class=\"btn btn-4 btn-4a\">6</button></a>");
  client.print("                 <a href=\"/gpio?LEDd8=7\"><button class=\"btn btn-4 btn-4a\">7</button></a>");
  client.print("                 <a href=\"/gpio?LEDd8=8\"><button class=\"btn btn-4 btn-4a\">8</button></a>");
  client.print("                 <a href=\"/gpio?LEDd8=9\"><button class=\"btn btn-4 btn-4a\">9</button></a>");
  client.print("<br>");
  client.print("                 <a href=\"/gpio?LEDOff=0\"><button class=\"btn btn-4 btn-4a\">0</button></a>");
  client.print("             </p>");
  client.print("         </section>");
  client.print("     </div>");
  client.print("</body></html>");




  req = "";
  }
}
//exolot
void exolot()
{
  for (int i = 0; i <= 1; i++) {
    delay (5);
    unsigned int o, uS = sonar.ping();

    filter.in(uS);
    o = filter.out();
    Serial.print("Ping: ");
    Serial.print( o / US_ROUNDTRIP_CM);
    Serial.println("cm");
    value3 = o / US_ROUNDTRIP_CM;
  }
}

//Wifi server
void CreateWiFiAP()
{
  WiFi.disconnect();
  WiFi.mode(WIFI_AP);
  WiFi.softAPConfig(StaticIP, StaticIP, IPAddress(255, 255, 255, 0));
  WiFi.softAP(ssidAP, passwordAP);
}

void ConnectWiFiLan()
{
  WiFi.disconnect();
  WiFi.mode(WIFI_STA);
  WiFi.softAPdisconnect(true);
  WiFi.enableAP(false);


  delay(500);
  Serial.print("\nWi-Fi connecting");
  WiFi.config(StaticIP, GateIP, IPAddress(255, 255, 255, 0));
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.print("\nConnected!");
}
Не знаю в чем причина,  мне пришлось использовать For для того что бы прогнать считывание GPS 2 раза. Почему то без него данные GPS практически не обновляться. 
 
Есть еще нюансы которые я упустил?

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DetSimen пишет:

v258 пишет:

тут луп и заканчивается. И МК просто останавливается

с хрена ли? 

Ну, это ... типа ... "highly likely" :-)

Я бы сказал, даже не "просто останавливается", а начинает обратный отсчёт до взрыва и саморазрушения. Это  "highly likely" такая защита, чтоб прошивку не взломали и не стырили.

sadman41
Offline
Зарегистрирован: 19.10.2016

Ещё double break combo можно применить в конце - штоп чип разломился напополам.

v258
Offline
Зарегистрирован: 25.05.2020

Во-во, какой-то дед сурьёзный сегодня 

Flidi
Offline
Зарегистрирован: 23.07.2020

v258 пишет:

Во-во, какой-то дед сурьёзный сегодня 

Любителей по тролить хватает...

Спасибо я немного разобрался в ошибке логики программы.

Но не могу понять..

 if (SoftSerial.available() > 0) {
088     for (int j = 0; j <= 1; j++)
089     {
090  
091             if (gps.encode(SoftSerial.read()))
092             {

Вот здесь я поставил фор, что бы процедура считывания прошла 2 раза. Потому как з первого раза он не срабатывает как надо. Точней Иф срабатывает, процедура считывания проходит, но значения нулевые. Это через то что слишком быстро проходит программа чем считываются данные?

Нормально такое использование ? Или можно как-то поправить?

b707
Offline
Зарегистрирован: 26.05.2017

Flidi пишет:

Нормально такое использование ? Или можно как-то поправить?

нет, конечно. Читать из Сериал нужно не 2 символа, а ровно столько, сколько там есть. Иначе один раз может оказаться, что их там было 20 и вы прочитали только начало, а другой - что там был всего один символ и второе чтение прочитало ерунду из космоса...

Flidi - вы не хотите книжки какие-то почитать? А то тыкаетесь как слепой котенок... Раз сами не угадывайте - значит надо учиться.

Flidi
Offline
Зарегистрирован: 23.07.2020

b707 пишет:

Flidi пишет:

Нормально такое использование ? Или можно как-то поправить?

нет, конечно. Читать из Сериал нужно не 2 символа, а ровно столько, сколько там есть. Иначе один раз может оказаться, что их там было 20 и вы прочитали только начало, а другой - что там был всего один символ и второе чтение прочитало ерунду из космоса...

Flidi - вы не хотите книжки какие-то почитать? А то тыкаетесь как слепой котенок... Раз сами не угадывайте - значит надо учиться.

Gps без For по логике должен считывать все символы из SoftSerial после чего должен приступать к работе з веб сервером. Когда я поставил Фор разве он считывает два символа? А не один и тот же 2 раза? Я могу ошибаться... По этому и спросил что не так з логикой без фора?

Причина почему я поставил фор это потому что данные из SoftSerial приходят очень редко, по етому и подумал о том что бы считать символ дважды, так как паузу (delay) ставить не хочеться, так как вы сами говорили, что надо избегать пауз и циклов. Пустив считывания одного и того же символа дважды я избегаю паузы... первый раз символ возможно не успел записаться, а вторым разом считываю его наверняка? Я могу ошибаться.  Хоча по идеи без фор считывание должно приходить всегда и в приоритете. Но почему без фора данные так плохо приходят?

Да и буду очень благодарен за решением проблемы, что могу выразить в денежном эквиваленте. И да буду благодарен за рекомендацию о книги которую можно почитать. Я и так стараюсь читать форумы и статьи, книгам не особо доверяю. Так как мне не раз приходилось сталкиваться з старой инфой где, то не работает, то не так надо теперь использовать и т.д. и т.п. Очень много примеров от первых версий ардуино не работают. 

b707
Offline
Зарегистрирован: 26.05.2017

Flidi пишет:

Gps без For по логике должен считывать все символы из SoftSerial после чего должен приступать к работе з веб сервером. Когда я поставил Фор разве он считывает два символа? А не один и тот же 2 раза?

Вы можете читать из Сериал сколько угодно раз, независимо от того, есть там реальные данные или нет. Никаких ошибок в программе от этого не будет. Но если данные есть - вы читаете данные, а если уже прочитали все и нового нет - то дальше читаете либо случайные числа, либо предустановленное число типа 255. В любом случае читать дважды в цикле For - бессмысленно и вредно, вместо данных вы получите неизвестно что. Читать Сериал нужно только тогда, когда Serial.availiable() больше нуля.

 

Что касается помощи - пробуйте, учитесь, готов и дальше помогать вам советами в форуме. Брать вашу работу как платный заказ сейчас возможности нет, все время занято. Возможно через неделю будет попроще. Если до тех пор не решите - обращайтесь.

Flidi
Offline
Зарегистрирован: 23.07.2020

b707 пишет:

Flidi пишет:

Gps без For по логике должен считывать все символы из SoftSerial после чего должен приступать к работе з веб сервером. Когда я поставил Фор разве он считывает два символа? А не один и тот же 2 раза?

Вы можете читать из Сериал сколько угодно раз, независимо от того, есть там реальные данные или нет. Никаких ошибок в программе от этого не будет. Но если данные есть - вы читаете данные, а если уже прочитали все и нового нет - то дальше читаете либо случайные числа, либо предустановленное число типа 255. В любом случае читать дважды в цикле For - бессмысленно и вредно, вместо данных вы получите неизвестно что. Читать Сериал нужно только тогда, когда Serial.availiable() больше нуля.

 

Что касается помощи - пробуйте, учитесь, готов и дальше помогать вам советами в форуме. Брать вашу работу как платный заказ сейчас возможности нет, все время занято. Возможно через неделю будет попроще. Если до тех пор не решите - обращайтесь.

Спасибо. Кое-чего кажется я добился. Я вспомнил что в примерах GPS была умная пауза решил ее попробовать. Кажется что теперь все ок. 

Вот куда я ее вставил.

if (SoftSerial.available() > 0) {
        
        smartDelay(1); //сюда
        
              if (gps.location.isValid()) 
              {
        
                Serial.print("Latitude   = ");
                Serial.println(gps.location.lat(), 6);
                Serial.print("Longitude  = ");
                Serial.println(gps.location.lng(), 6);
                value1 = String(gps.location.lat(), 6);
                value2 = String(gps.location.lng(), 6);
        
              }

А вот сама пауза

// Эта пользовательская версия delay () гарантирует, что объект gps будет «подан».
static void smartDelay(unsigned long ms)
{
  unsigned long start = millis();
  do 
  {
    while (SoftSerial.available())
      gps.encode(SoftSerial.read());
  } while (millis() - start < ms);
}

Как то так.

b707
Offline
Зарегистрирован: 26.05.2017

Ну если помогло...

не знаю, по-моему эта пауза вам ничего не дает. Она предназаначена для вставки в какие-то другие медленные процессы, чтобы эти процессы не тормозили вывод данных из GPS. Вставлять эту паузу в код чтения того самого GPS - "масло масляное"

не говоря уже о том, что подобный метод - вообще говоря "костыль", то есть неправильный подход к решению проблемы...

Flidi
Offline
Зарегистрирован: 23.07.2020

b707 пишет:

Ну если помогло...

не знаю, по-моему эта пауза вам ничего не дает. Она предназаначена для вставки в какие-то другие медленные процессы, чтобы эти процессы не тормозили вывод данных из GPS. Вставлять эту паузу в код чтения того самого GPS - "масло масляное"

не говоря уже о том, что подобный метод - вообще говоря "костыль", то есть неправильный подход к решению проблемы...

без масла масляного это типа кокто так?

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ArduinoOTA.h>

//exolot
#include <NewPing.h>
#include <MedianFilter.h>
#include <Wire.h>
#include <MedianFilter.h>


#define TRIGGER_PIN  16
#define ECHO_PIN     5
#define MAX_DISTANCE 2000

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

MedianFilter filter(31, 0);

int timer1, timer2;
String value1, value2, value3, req;

//web server
const char* ssidAP = "ESPWebServer";
const char* passwordAP = "1234567890";

const char* ssid = "EnergyCores_Majic-Power";
const char* password = "12481632";

IPAddress StaticIP(192, 168, 1, 35);
IPAddress GateIP(192, 168, 1, 1);

WiFiServer server(80);

//gps
#include <TinyGPS++.h>
#include <SoftwareSerial.h>

TinyGPSPlus gps;

#define S_RX    0                // Вывод RX
#define S_TX    4                // Вывод TX

SoftwareSerial SoftSerial(S_RX, S_TX);


void setup() {
  //gps
  SoftSerial.begin(9600);

  // Wifi Server
  Serial.begin(115200);
  delay(10);

  // prepare GPIO16
  pinMode(14, OUTPUT); //d5
  pinMode(12, OUTPUT); //d6
  pinMode(13, OUTPUT); //d7
  pinMode(15, OUTPUT); //d8
  analogWriteFreq(150);
  analogWriteRange(9);



  CreateWiFiAP();
  delay(1500);

  //ConnectWiFiLan();

  server.begin();
  analogWrite(16, 0);

  // Start OTA server.
  ArduinoOTA.setHostname("OTA->ESP");
  ArduinoOTA.begin();


}

void loop() {

  //Gps
  static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;
  
       
        smartDelay(100);
        
              if (gps.location.isValid()) 
              {
        
                Serial.print("Latitude   = ");
                Serial.println(gps.location.lat(), 6);
                Serial.print("Longitude  = ");
                Serial.println(gps.location.lng(), 6);
                value1 = String(gps.location.lat(), 6);
                value2 = String(gps.location.lng(), 6);
        
              }
              else
                Serial.println("Location Invalid");
        
              if (gps.speed.isValid()) {
                Serial.print("Speed      = ");
                Serial.print(gps.speed.kmph());
                Serial.println(" kmph");
              }
              else
                Serial.println("Speed Invalid");
        
              if (gps.satellites.isValid()) {
                Serial.print("Satellites = ");
                Serial.println(gps.satellites.value());
              }
              else {
                Serial.println("Satellites Invalid");
              }
        
              if (gps.course.isValid()) {
                Serial.print("Course = ");
                const char *curse = TinyGPSPlus::cardinal(gps.course.deg());
                Serial.println(curse);
              }
              else {
                Serial.println("Course Invalid");
              }
        
              //to point
        
              unsigned long distanceKmToLondon =
                (unsigned long)TinyGPSPlus::distanceBetween(
                  gps.location.lat(),
                  gps.location.lng(),
                  LONDON_LAT,
                  LONDON_LON) / 1000;
              Serial.print("Distans to london = ");
              Serial.println(distanceKmToLondon);
        
              double courseToLondon =
                TinyGPSPlus::courseTo(
                  gps.location.lat(),
                  gps.location.lng(),
                  LONDON_LAT,
                  LONDON_LON);
        
              Serial.print("Course to london = ");
              Serial.println(courseToLondon);
        
              const char *cardinalToLondon = TinyGPSPlus::cardinal(courseToLondon);
              Serial.print("Cardinal to london = ");
              Serial.println(cardinalToLondon);
    
    //exolot
    exolot();

    //Wifi Server
    //ArduinoOTA.handle();
    //delay(1);
    ArduinoOTA.handle();
    // Check if a client has connected
    WiFiClient client = server.available();

    // Read the first line of the request
    req = client.readStringUntil('\r');
    Serial.println(req);
    client.flush();
    //  Serial.print("\nMessage recieved");



    //gpio 14, d5
    if (req.indexOf("d5=") != -1)
    {
      int val = (int)req[req.indexOf("=") + 1] - 48;
      analogWrite(14, 0 + val);
      analogWrite(12, 0);
      req = "";
    }

    //gpio 12, d6
    if (req.indexOf("d6=") != -1)
    {
      int val = (int)req[req.indexOf("=") + 1] - 48;
      analogWrite(12, 0 + val);
      analogWrite(14, 0);
      req = "";
    }

    //gpio 13, d7
    if (req.indexOf("d7=") != -1)
    {
      int val = (int)req[req.indexOf("=") + 1] - 48;
      analogWrite(13, 0 + val);
      analogWrite(15, 0);
      req = "";
    }
    //gpio 15, d8
    if (req.indexOf("d8=") != -1)
    {
      int val = (int)req[req.indexOf("=") + 1] - 48;
      analogWrite(15, 0 + val);
      analogWrite(13, 0);
      req = "";
    }

    if (req.indexOf("Off=") != -1)
    {
      int val = (int)req[req.indexOf("=") + 1] - 48;
      analogWrite(15, 0);
      analogWrite(13, 0);
      analogWrite(12, 0);
      analogWrite(14, 0);
      req = "";
    }

  
  
  client.flush();
  client.print( "HTTP/1.1 200 OK\r\nConnection: keep-alive\r\nCache-Control: private, no-store\r\n\r\n");
  client.print("<!DOCTYPE HTML>");
  client.print("<html>");
  client.print("<head>");
  client.print(" <meta charset=\"UTF-8\" />");
  client.print("<meta http-equiv='refresh' content='2'/>");
  client.print(" <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\"> ");
  client.print(" <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"> ");
  client.print(" <title>LED</title>");
  client.print(" </head><body>");

  String s1 = ("<input type=\"text\" size=\"10\" name=\"value1\" value=\"" + value1 + "\">");

  String s2 = ("<input type=\"text\" size=\"10\" name=\"value2\" value=\"" + value2 + "\">");

  String s3 = ("<input type=\"text\" size=\"10\" name=\"value2\" value=\"" + value3 + "\">");
  client.print(s1 + s2 + s3);

  client.print("     <div class=\"container\">");
  client.print("         <section class=\"color-1\">");
  client.print("             <p>");
  client.print("                 <a href=\"/gpio?LEDd5=0\"><button class=\"btn btn-4 btn-4a\">d5=0</button></a>");
  client.print("                 <a href=\"/gpio?LEDd5=1\"><button class=\"btn btn-4 btn-4a\">d5=1</button></a>");
  client.print("                 <a href=\"/gpio?LEDd5=2\"><button class=\"btn btn-4 btn-4a\">d5=2</button></a>");
  client.print("                 <a href=\"/gpio?LEDd5=3\"><button class=\"btn btn-4 btn-4a\">d5=3</button></a>");
  client.print("                 <a href=\"/gpio?LEDd5=4\"><button class=\"btn btn-4 btn-4a\">d5=4</button></a>");
  client.print("                 <a href=\"/gpio?LEDd5=5\"><button class=\"btn btn-4 btn-4a\">d5=5</button></a>");
  client.print("                 <a href=\"/gpio?LEDd5=6\"><button class=\"btn btn-4 btn-4a\">d5=6</button></a>");
  client.print("                 <a href=\"/gpio?LEDd5=7\"><button class=\"btn btn-4 btn-4a\">d5=7</button></a>");
  client.print("                 <a href=\"/gpio?LEDd5=8\"><button class=\"btn btn-4 btn-4a\">d5=8</button></a>");
  client.print("                 <a href=\"/gpio?LEDd5=9\"><button class=\"btn btn-4 btn-4a\">d5=9</button></a>");
  client.print("<br>");
  client.print("                 <a href=\"/gpio?LEDd6=0\"><button class=\"btn btn-4 btn-4a\">d6=0</button></a>");
  client.print("                 <a href=\"/gpio?LEDd6=1\"><button class=\"btn btn-4 btn-4a\">d6=1</button></a>");
  client.print("                 <a href=\"/gpio?LEDd6=2\"><button class=\"btn btn-4 btn-4a\">d6=2</button></a>");
  client.print("                 <a href=\"/gpio?LEDd6=3\"><button class=\"btn btn-4 btn-4a\">d6=3</button></a>");
  client.print("                 <a href=\"/gpio?LEDd6=4\"><button class=\"btn btn-4 btn-4a\">d6=4</button></a>");
  client.print("                 <a href=\"/gpio?LEDd6=5\"><button class=\"btn btn-4 btn-4a\">d6=5</button></a>");
  client.print("                 <a href=\"/gpio?LEDd6=6\"><button class=\"btn btn-4 btn-4a\">d6=6</button></a>");
  client.print("                 <a href=\"/gpio?LEDd6=7\"><button class=\"btn btn-4 btn-4a\">d6=7</button></a>");
  client.print("                 <a href=\"/gpio?LEDd6=8\"><button class=\"btn btn-4 btn-4a\">d6=8</button></a>");
  client.print("                 <a href=\"/gpio?LEDd6=9\"><button class=\"btn btn-4 btn-4a\">d6=9</button></a>");
  client.print("<br>");
  client.print("                 <a href=\"/gpio?LEDd7=0\"><button class=\"btn btn-4 btn-4a\">d7=0</button></a>");
  client.print("                 <a href=\"/gpio?LEDd7=1\"><button class=\"btn btn-4 btn-4a\">d7=1</button></a>");
  client.print("                 <a href=\"/gpio?LEDd7=2\"><button class=\"btn btn-4 btn-4a\">d7=2</button></a>");
  client.print("                 <a href=\"/gpio?LEDd7=3\"><button class=\"btn btn-4 btn-4a\">d7=3</button></a>");
  client.print("                 <a href=\"/gpio?LEDd7=4\"><button class=\"btn btn-4 btn-4a\">d7=4</button></a>");
  client.print("                 <a href=\"/gpio?LEDd7=5\"><button class=\"btn btn-4 btn-4a\">d7=5</button></a>");
  client.print("                 <a href=\"/gpio?LEDd7=6\"><button class=\"btn btn-4 btn-4a\">d7=6</button></a>");
  client.print("                 <a href=\"/gpio?LEDd7=7\"><button class=\"btn btn-4 btn-4a\">d7=7</button></a>");
  client.print("                 <a href=\"/gpio?LEDd7=8\"><button class=\"btn btn-4 btn-4a\">d7=8</button></a>");
  client.print("                 <a href=\"/gpio?LEDd7=9\"><button class=\"btn btn-4 btn-4a\">d7=9</button></a>");
  client.print("<br>");
  client.print("                 <a href=\"/gpio?LEDd8=0\"><button class=\"btn btn-4 btn-4a\">0</button></a>");
  client.print("                 <a href=\"/gpio?LEDd8=1\"><button class=\"btn btn-4 btn-4a\">1</button></a>");
  client.print("                 <a href=\"/gpio?LEDd8=2\"><button class=\"btn btn-4 btn-4a\">2</button></a>");
  client.print("                 <a href=\"/gpio?LEDd8=3\"><button class=\"btn btn-4 btn-4a\">3</button></a>");
  client.print("                 <a href=\"/gpio?LEDd8=4\"><button class=\"btn btn-4 btn-4a\">4</button></a>");
  client.print("                 <a href=\"/gpio?LEDd8=5\"><button class=\"btn btn-4 btn-4a\">5</button></a>");
  client.print("                 <a href=\"/gpio?LEDd8=6\"><button class=\"btn btn-4 btn-4a\">6</button></a>");
  client.print("                 <a href=\"/gpio?LEDd8=7\"><button class=\"btn btn-4 btn-4a\">7</button></a>");
  client.print("                 <a href=\"/gpio?LEDd8=8\"><button class=\"btn btn-4 btn-4a\">8</button></a>");
  client.print("                 <a href=\"/gpio?LEDd8=9\"><button class=\"btn btn-4 btn-4a\">9</button></a>");
  client.print("<br>");
  client.print("                 <a href=\"/gpio?LEDOff=0\"><button class=\"btn btn-4 btn-4a\">0</button></a>");
  client.print("             </p>");
  client.print("         </section>");
  client.print("     </div>");
  client.print("</body></html>");





  
}
//exolot
void exolot()
{
  for (int i = 0; i <= 1; i++) {
    delay (5);
    unsigned int o, uS = sonar.ping();

    filter.in(uS);
    o = filter.out();
    Serial.print("Ping: ");
    Serial.print( o / US_ROUNDTRIP_CM);
    Serial.println("cm");
    value3 = o / US_ROUNDTRIP_CM;
  }
}

// Эта пользовательская версия delay () гарантирует, что объект gps будет «подан».
static void smartDelay(unsigned long ms)
{
  unsigned long start = millis();
  do 
  {
    while (SoftSerial.available())
      gps.encode(SoftSerial.read());
  } while (millis() - start < ms);
}

//Wifi server
void CreateWiFiAP()
{
  WiFi.disconnect();
  WiFi.mode(WIFI_AP);
  WiFi.softAPConfig(StaticIP, StaticIP, IPAddress(255, 255, 255, 0));
  WiFi.softAP(ssidAP, passwordAP);
}

void ConnectWiFiLan()
{
  WiFi.disconnect();
  WiFi.mode(WIFI_STA);
  WiFi.softAPdisconnect(true);
  WiFi.enableAP(false);


  delay(500);
  Serial.print("\nWi-Fi connecting");
  WiFi.config(StaticIP, GateIP, IPAddress(255, 255, 255, 0));
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.print("\nConnected!");
}

 

Morroc
Offline
Зарегистрирован: 24.10.2016

Вам эта так называемая пауза вообще зачем ? (хотя зачем она автору этой функции я тоже представляю с трудом). В начале loop проверили есть ли байты в serial, если есть - считали сколько есть, все, дальше работаете с буфером, в который эти байты складываете.

Flidi
Offline
Зарегистрирован: 23.07.2020

Morroc пишет:
Вам эта так называемая пауза вообще зачем ? (хотя зачем она автору этой функции я тоже представляю с трудом). В начале loop проверили есть ли байты в serial, если есть - считали сколько есть, все, дальше работаете с буфером, в который эти байты складываете.

Пробувал 

  while (SoftSerial.available() > 0) 
        {
          gps.encode(SoftSerial.read());
        }
              if (gps.location.isValid()) 
              {
        
                Serial.print("Latitude   = ");
                Serial.println(gps.location.lat(), 6);
 
И так
 
  while (SoftSerial.available()) 
        {
          gps.encode(SoftSerial.read());
        }
              if (gps.location.isValid()) 
              {
        
                Serial.print("Latitude   = ");
                Serial.println(gps.location.lat(), 6);

Не читает он GPS, нет данных. Без паузы он почему-то не хочет работать. Может это быть через то что MCU быстрей GPS?

Я так понимаю пауза дает время на то что бы считать данные. Типа у тебя есть 100 млсек для того что бы получить данные если их нет, иди дале. Мне кажется что данные без паузы могут приходить в то время когда MCU занят другими делами, а до Софт сериал не дошел, таким образом он их пропускает, от чего постоянно попадает на 0 пакет данных.. типа так?