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

Сеть из нескольких esp8266 01-01s (3 шт к примеру)

nikolz

Well-known member
хорошо, я сделал, всё гуд, теперь всё работает, а как мне сделать синхронизацию отправки получения?? На АР поступили данные из вне для отправки, что та и сделала, они могут быть получены в любой момент, а вот сама АР получает данные каждые 5 секунд. Как не попасть на конфликт при работе. Типа вот данные надо отправить и они же пришли. Всё тот же UDP. Вот чего я хочу добиться: на АР может поступить команда об включении реле, что та и ожидает, а клиент - датчик влажности и температуры периодически отправляет те каждые 5 секунд на АР. И не надо угадывать, чего я хочу, сам написал)
Для этого есть функция колбека (обратного вызова) приема данных.
Эта функция вызывается автоматически когда поступили данные.
В эту функцию в качестве параметров будет переданы данные и IP адрес отправителя.
внутри этой функции Вы читаете данные и если надо отправляете ответ.
чтобы функцию использовать , ее надо зарегистрировать.
--------
Могу дать пример лишь на СИ, так как на ардуине не пишу.
Если надо, то скажите. Полагаю, что другие участники дадут пример на ардуине.
 

$Hunter$

Member
Для этого есть функция колбека (обратного вызова) приема данных.
Эта функция вызывается автоматически когда поступили данные.
В эту функцию в качестве параметров будет переданы данные и IP адрес отправителя.
внутри этой функции Вы читаете данные и если надо отправляете ответ.
чтобы функцию использовать , ее надо зарегистрировать.
--------
Могу дать пример лишь на СИ, так как на ардуине не пишу.
Если надо, то скажите. Полагаю, что другие участники дадут пример на ардуине.
ну как видите на ардуино пока нету, учу с#, думаю разберусь), и да, буду очень признателен)
 

$Hunter$

Member
Придумайте алгоритм работы есп.

Представьте, что есп это вы и опишите, что вы будите делать, если одновременно один датчик вам "кричит" температуру, а другой кричит включи реле, при этом, когда оба кричат, вы одновременно вы ничего не услышите, ну или услышите только одного.

А потом ваши действия по разруливании ситуаций, перенесите на логику работы есп.
по сути я б послушал одного, а потом другого, но вот как это реализовать
 

nikolz

Well-known member
ну как видите на ардуино пока нету, учу с#, думаю разберусь), и да, буду очень признателен)
C# не подходит для программирования микроконтроллеров.
Для микроконтроллеров
либо учите СИ,
либо учите ардуино (это как С++).
 

nikolz

Well-known member
этими функциями я регистрирую колбеки для передачи и приема
espconn_regist_recvcb(&udp_client,udp_recv_cb);
espconn_regist_sentcb(&udp_client,udp_sent_cb);
----------------------------
до этого описываю сами функции:
например:
void ICACHE_FLASH_ATTR udp_sent_cb(){
DeepSleepNK(time_us1);
} //после отправки сообщения уходит спать
------------------------
void ICACHE_FLASH_ATTR udp_recv_cb (void *arg, char *pdata, unsigned short _len){
...
DeepSleepNK(time_us1);
} //после приема сообщения уходит спать
------------------
описание этих и других функций найдете в документации которую выложил ранее.
В SDK можете найти примеры.
SDK можно найти на сайте разработчика ESP.
 

$Hunter$

Member
этими функциями я регистрирую колбеки для передачи и приема
espconn_regist_recvcb(&udp_client,udp_recv_cb);
espconn_regist_sentcb(&udp_client,udp_sent_cb);
----------------------------
до этого описываю сами функции:
например:
void ICACHE_FLASH_ATTR udp_sent_cb(){
DeepSleepNK(time_us1);
} //после отправки сообщения уходит спать
------------------------
void ICACHE_FLASH_ATTR udp_recv_cb (void *arg, char *pdata, unsigned short _len){
...
DeepSleepNK(time_us1);
} //после приема сообщения уходит спать
------------------
описание этих и других функций найдете в документации которую выложил ранее.
В SDK можете найти примеры.
SDK можно найти на сайте разработчика ESP.
пасиб
 

$Hunter$

Member
Слушайте одного, а температуру запрашивайте.
я вот опять же повторюсь, не должно ли возникать никаких проблем с выбором портов? А то там как-бы вроде не любые циферки можно написать, может посоветуете какие если что? И да, придумал алгоритм реализации этого кода более-менее), пасиб)
 

nikolz

Well-known member
я вот опять же повторюсь, не должно ли возникать никаких проблем с выбором портов? А то там как-бы вроде не любые циферки можно написать, может посоветуете какие если что? И да, придумал алгоритм реализации этого кода более-менее), пасиб)
если это Ваша сеть то порты любые
если выходите и заходите через роутер, то лишь те которые открыты на роутере.
 

nikolz

Well-known member
я вот опять же повторюсь, не должно ли возникать никаких проблем с выбором портов? А то там как-бы вроде не любые циферки можно написать, может посоветуете какие если что? И да, придумал алгоритм реализации этого кода более-менее), пасиб)
рекомендую сделать простенький сервер и клиента на сокетах на компьютере. и через них пообщаться с ESP.
можно все сделать на любом скриптовом языке например луа или питон.
Это поможет Вам в дальнейшем легко делать приложения на компе.
луа проще -рекомендую
На esp тоже можно на луа писать.
 

$Hunter$

Member
рекомендую сделать простенький сервер и клиента на сокетах на компьютере. и через них пообщаться с ESP.
можно все сделать на любом скриптовом языке например луа или питон.
Это поможет Вам в дальнейшем легко делать приложения на компе.
тема?
 

$Hunter$

Member
Слушайте одного, а температуру запрашивайте.
вот сделал, но не работает ни одно, ни другое, в чём ошибка, подскажете?
АР
C++:
#include <ESP8266WiFi.h>
#include <WiFiUDP.h>

WiFiUDP Udp;
int port = 8888;

unsigned long last_time;
String temp = "";
char bufer[100];

void setup() {
    Serial.begin(115200);
    WiFi.softAP("Xia_Bro", "YouAreFuckingCool");
    Udp.begin(port);
}

void loop() {
    if ((millis() - last_time) > 5000) {
        last_time = millis();

        Udp.beginPacket("192.168.4.10", 777);
        Udp.write("temp");
        Udp.endPacket();

        int packetSize = Udp.parsePacket();
          if (packetSize) {
            Serial.println("2-Yeah!");
            int len = Udp.read(bufer, 100);
               if (len > 0) {
                  bufer[len] = 0;
            }
            Serial.println(String(bufer));
          }
    }
}
С1-temp
C++:
#include <ESP8266WiFi.h>
#include <WiFiUDP.h>

WiFiUDP Udp;
int port = 777;
char bufer[100];
char temp[50];
int i = 0;
String j;

//configs of Wi-Fi
IPAddress ip(192, 168, 4, 10);
IPAddress gateway(192,168,4,1);
IPAddress subnet(255,255,255,0);

void setup() {
  WiFi.config(ip, gateway, subnet);
    WiFi.begin("Xia_Bro", "YouAreFuckingCool");
    Udp.begin(port);
}

void loop() {
  if (WiFi.status() != WL_CONNECTED) {
    WiFi.begin("Xia_Bro", "YouAreFuckingCool");
  }
  j = String(i);
  j.toCharArray(temp, 50);
  int packetSize = Udp.parsePacket();
    if (packetSize) {
      i++;
      Serial.println("2-Yeah!");
      int len = Udp.read(bufer, 100);
      if (len > 0) {
        bufer[len] = 0;
      }
      if (String(bufer) == "temp") {
        Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
        Udp.write(temp);
        Udp.endPacket();
      }
    }
}
C2-rele
C++:
#include <ESP8266WiFi.h>
#include <WiFiUDP.h>

WiFiUDP Udp;
int port = 999;
char bufer[100];

//configs of Wi-Fi
IPAddress ip(192, 168, 4, 20);
IPAddress gateway(192,168,4,1);
IPAddress subnet(255,255,255,0);

void setup() {
    pinMode(2, OUTPUT);
    digitalWrite(2, HIGH);
    WiFi.config(ip, gateway, subnet);
      WiFi.begin("Xia_Bro", "YouAreFuckingCool");
      Udp.begin(port);
}

void loop() {
    if (WiFi.status() != WL_CONNECTED) {
        WiFi.begin("Xia_Bro", "YouAreFuckingCool");
    }
    int packetSize = Udp.parsePacket();
      if (packetSize) {
          i++;
           Serial.println("2-Yeah!");
           int len = Udp.read(bufer, 100);
           if (len > 0) {
               bufer[len] = 0;
        }
        if (String(bufer) == "on") {
            digitalWrite(2, LOW);
        } else if (String(bufer) == "off") {
            digitalWrite(2, HIGH);
        }
    }
}
 

nikolz

Well-known member
Вам надо написать сервер и клиента
Сервер должен слушать а клиент должен посылать
--------------------
Рекомендую сделать и сервер и клиент как станции через домашний роутер
Когда освоите работа со стациями будете осваивать точку доступа.
 

CodeNameHawk

Moderator
Команда форума
Куда торопитесь? Двери не закрылись а уже в бой.
Есть такое waitForConnectResult

Добавьте в код отладочную информацию и выводите ее в сериал, ну и сюда выложите.
Что на АР, что на клиенте или вы думаете что тут все все в уме решают.

На клиенте это
Код:
  if (WiFi.status() != WL_CONNECTED) {
    WiFi.begin("Xia_Bro", "YouAreFuckingCool");
  }
как то жестковато, включите autoconneсt, autoreconeсt, вам их описание найти?
Попробуйте так
Код:
  if (WiFi.status() == WL_CONNECTED)
{
    посылать по сети
}
\\если подключения нет ничего не делать.
 
Последнее редактирование:

$Hunter$

Member
Куда торопитесь? Двери не закрылись а уже в бой.
Есть такое waitForConnectResult

Добавьте в код отладочную информацию и выводите ее в сериал, ну и сюда выложите.
Что на АР, что на клиенте или вы думаете что тут все все в уме решают.

На клиенте это
Код:
  if (WiFi.status() != WL_CONNECTED) {
    WiFi.begin("Xia_Bro", "YouAreFuckingCool");
  }
как то жестковато, включите autoconneсt, autoreconeсt, вам их описание найти?
Попробуйте так
Код:
  if (WiFi.status() == WL_CONNECTED)
{
    посылать по сети
}
\\если подключения нет ничего не делать.
постараюсь, хорошо, по поводу первого кода - да, та я попутал, вместо этого оно должно реконектить если соединение потеряно, а второй код - да, да, это оч полезно, спасибо, забыл это добавить, прост уже несколько недель пытаюсь заставить его работать, а одни только траблы
 
Сверху Снизу