Arduino mega + esp8266 проект электронное табло

Тема в разделе "ESP8266, ESP32", создана пользователем AVU1974, 29 апр 2021.

  1. AVU1974

    AVU1974 Нерд

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

    Собираемся сделать такой проект: табло в спортивный зал. Идея следующая.
    Делаем табло из умных лент, ставим управлять интересной платой Arduino Mega + ESP8266, туда же модуль часов, хотим поставить модуль mp-плеера, чтобы подавать сигналы, сирены и прочее. Как это заставить работать на ардуино я понимаю, знаю и представляю. Да нужно много пинов (я хочу ленту разбить на несколько частей, чтобы было легче прописывать функции по зажиганию цифр, да и включать разные блоки табло (для волейбола одни, для баскетбола другие и т.п.), для этого и взята мега. Плюс, я купился на встроенный модуль ESP.
    И вот теперь моя проблема. Как управлять табло с ПК (ноута, планшета и прочее). Как это сделать через com-порт я умею, но хочу не привязываться к проводу. Блютуз отмёл (почему-то). Решил делать это по вафле.
    Есть опыт создания приложений в visual basic. Надеялся на него.
    Плату настроил, ESP работает, я вижу по IP-адресу фейс с кнопками ON/OFF внутреннего диода. все работает.
    Вот теперь стою на перепутье:
    1. Двигаться в сторону создания приложения в visual basic и передачи из этого приложения команд в плату через wifi (по типу параллельного порта)
    2. Создавать web-приложение и управление платой через wifi
    3. Воспользоваться arduino mega server AMS и создать там управляющее приложение (там вроде как вообще не надо будет соединяться через роутер, а это все работает напрямую с бука, планша, смартфона и прочее - типа плата сама становится точкой доступа)

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

    Помогай Апмерка.
     
  2. issaom

    issaom Гуру

    Я бы web интерфейс прикрутил и усе))) что мешает доработать фейс с кнопками, добавив ещё кнопок?
     
  3. AVU1974

    AVU1974 Нерд

    То есть это второй вариант?
    Фейс, который я сейчас вижу - это, я так понимаю, нередактируемый внутри самой платы (типа тестовый). Мне надо создавать отдельное web-приложение. Но я не знаю как передавать с него данные в плату. Плюс, наверное, надо иметь роутер рядом. Это не проблема. Хотя, я вижу плату как точку доступа и к ней могу подключиться. А что дальше?
     
  4. AVU1974

    AVU1974 Нерд

  5. Рокки1945

    Рокки1945 Гуру

    Приветствую.
    Сделайте "морду" на visual basic - купите преобразователь на CH340G и к нему радиомодуль HC12 или JDY40 и т.д.
     
  6. issaom

    issaom Гуру

    Это старье - копипасту в рунете лучше не читать - читайте подлинник!
    Вот более современная технология:
    https://randomnerdtutorials.com/esp8266-nodemcu-async-web-server-espasyncwebserver-library/
    Рисуете WEB страницу на html с нужными элементами управления, заталкиваете её в ESP и потом запрашиваете её с любого устройства через любой WEB браузер. Если ESP объявить как точку доступа то скорее всего страницу тоже запросить получится.
    Пример того, что можно сделать есть тут
    (там правда еще javascript используется, чтобы не передергивать всю страницу целиком и отправлять команды с каждого элемента управления отдельно)
     
    Andrey12 нравится это.
  7. AVU1974

    AVU1974 Нерд

    Да. Я уже разобрался, что в ESP можно затолкать свою страницу. И даже понял как ее создавать. И спасибо за статью. Помогло в понимании. Но кода там не меряно.
    Свою маленькую страничку я сделал, попробовал управлять светодиодами (читай пинами). Все получилось.
    upload_2021-4-30_16-59-16.png

    Но на смартфоне все очень плохо масштабируется, надо в html все максимально прописывать.
    Вот у меня и возникла идея поюзать arduino mega server. Насколько я понял из мануала на сайте это некая графическая оболочка внутри ESP в которой можно создавать страницы и они вроде как там имеют свой внутренний конструктор. Что-то меня это дело заинтересовало. Но главное! Если это позволит отказаться от роутера и обращаться к меге напрямую с устройства. Вот это самое ценное. Тогда мне роутер будет не нужен.
     
  8. Рокки1945

    Рокки1945 Гуру

    А сейчас разве через роутер обращаетесь?
     
  9. AVU1974

    AVU1974 Нерд

    При загрузке скейча в ESP указывал имя роутера и его пароль.
     
  10. Рокки1945

    Рокки1945 Гуру

    Незнаю поможет или нет
    Снимок.PNG
     
  11. AVU1974

    AVU1974 Нерд

    Типа внутри домашней сети.
    Не поленился. Попробовал, вырубил роутер. Соединение прервалось. Подключился на ноуте напрямую к плате (ее видно как точку доступа). Страницы сервера не видно. Подключился к другому роутеру домашней сети, связь восстановилась. Вернул роутер, который вырубал, связь есть. Делаю вывод - роутер необходим.
     
  12. AVU1974

    AVU1974 Нерд

    Интересно. Надо попробовать. Но, наверное, надо в ESP соответствующий скейтч заливать? Который позволит ему работать как точка доступа.
     
  13. Рокки1945

    Рокки1945 Гуру

    Вот так делал - но это так простенько по дилетански
    Я морду на питоне делаю
    Код (C++):
    #include <ESP8266WiFi.h>
    #include <ESP8266WebServer.h>
    /* Установить свой SSID и пароль */
    const char* ssid = "COBRA";
    const char* password = "19811961";
    /* Настройка IP-адрес */
    IPAddress local_ip(192,168,2,100);//
    IPAddress gateway(192,168,2,1);
    IPAddress subnet(255,255,255,0);
    ESP8266WebServer server(80);
    uint8_t LED1pin = D4;
    bool LED1status = LOW;
    uint8_t LED2pin = D6;
    bool LED2status = LOW;
    void setup() {
      Serial.begin(115200);
      pinMode(LED1pin, OUTPUT);
      pinMode(LED2pin, OUTPUT);
      WiFi.softAP(ssid, password);
      WiFi.softAPConfig(local_ip, gateway, subnet);
      delay(100);

      server.on("/", handle_OnConnect);
      server.on("/led1on", handle_led1on);
      server.on("/led1off", handle_led1off);
      server.on("/led2on", handle_led2on);
      server.on("/led2off", handle_led2off);
      server.onNotFound(handle_NotFound);

      server.begin();
      Serial.println("HTTP server started");
    }
    void loop() {
      server.handleClient();
      if(LED1status)
      {digitalWrite(LED1pin, HIGH);}
      else
      {digitalWrite(LED1pin, LOW);}

      if(LED2status)
      {digitalWrite(LED2pin, HIGH);}
      else
      {digitalWrite(LED2pin, LOW);}
    }
    void handle_OnConnect() {
      LED1status = LOW;
      LED2status = LOW;
      Serial.println("GPIO7 Status: OFF | GPIO6 Status: OFF");
      server.send(200, "text/html", SendHTML(LED1status,LED2status));
    }
    void handle_led1on() {
      LED1status = HIGH;
      Serial.println("GPIO7 Status: ON");
      server.send(200, "text/html", SendHTML(true,LED2status));
    }
    void handle_led1off() {
      LED1status = LOW;
      Serial.println("GPIO7 Status: OFF");
      server.send(200, "text/html", SendHTML(false,LED2status));
    }
    void handle_led2on() {
      LED2status = HIGH;
      Serial.println("GPIO6 Status: ON");
      server.send(200, "text/html", SendHTML(LED1status,true));
    }
    void handle_led2off() {
      LED2status = LOW;
      Serial.println("GPIO6 Status: OFF");
      server.send(200, "text/html", SendHTML(LED1status,false));
    }
    void handle_NotFound(){
      server.send(404, "text/plain", "Not found");
    }
    String SendHTML(uint8_t led1stat,uint8_t led2stat){
      String ptr = "<!DOCTYPE html> <html>\n";
      ptr +="<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
      ptr +="<title>LED Control</title>\n";
      ptr +="<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n";
      ptr +="body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;} h3 {color: #444444;margin-bottom: 50px;}\n";
      ptr +=".button {display: block;width: 80px;background-color: #1abc9c;border: none;color: white;padding: 13px 30px;text-decoration: none;font-size: 25px;margin: 0px auto 35px;cursor: pointer;border-radius: 4px;}\n";
      ptr +=".button-on {background-color: #1abc9c;}\n";
      ptr +=".button-on:active {background-color: #16a085;}\n";
      ptr +=".button-off {background-color: #34495e;}\n";
      ptr +=".button-off:active {background-color: #2c3e50;}\n";
      ptr +="p {font-size: 14px;color: #888;margin-bottom: 10px;}\n";
      ptr +="</style>\n";
      ptr +="</head>\n";
      ptr +="<body>\n";
      ptr +="<h1>ESP8266 Web Server</h1>\n";
      ptr +="<h3>Using Access Point(AP) Mode</h3>\n";

       if(led1stat)
      {ptr +="<p>LED1 Status: ON</p><a class=\"button button-off\" href=\"/led1off\">OFF</a>\n";}
      else
      {ptr +="<p>LED1 Status: OFF</p><a class=\"button button-on\" href=\"/led1on\">ON</a>\n";}
      if(led2stat)
      {ptr +="<p>LED2 Status: ON</p><a class=\"button button-off\" href=\"/led2off\">OFF</a>\n";}
      else
      {ptr +="<p>LED2 Status: OFF</p><a class=\"button button-on\" href=\"/led2on\">ON</a>\n";}
      ptr +="</body>\n";
      ptr +="</html>\n";
      return ptr;
    }
     
  14. AVU1974

    AVU1974 Нерд

    День добрый.
    Скейтч залил. Все работает. Но есть одна история. Очень трудно коннектится вафля. Ноут совсем не заставил это сделать, со смартфона соединяется, но с большим трудом. После большого количества попыток подключения. В чем может быть причина?
    У меня мега + esp https://habr.com/ru/post/402429/
     
  15. b707

    b707 Гуру

    на адрессной ленте хорошее табло вы не сделаете - нужно много пикселей.
    Вот например тут - порядка 15 тыс точек
    [​IMG]
    Столько ленты - очень трудно и дорого.
    Да и Ардуино Мега - плохой выбор для этого
    Табло на картинке - на СТМ32 и фабричных светодиодных модулях
     
  16. Рокки1945

    Рокки1945 Гуру

  17. Рокки1945

    Рокки1945 Гуру

    Я вообще когда эти табло ремонтил - там всегда сдвиговые регистры были - на что эти умные светодиоды
     
  18. AVU1974

    AVU1974 Нерд

    Мы делаем просто табло. Это проект школьника. Ничего такого мощного мы не замышляем. Табло будет таким
    upload_2021-5-8_11-28-22.png
    Каждая цифра будет собрана из ленты и работать примерно так


    Я думаю вполне реально управлять этим с ардуино.

    Я попробовал (спасибо Рокки1945) и думаю, что вариант хранения и управления всем с esp не очень хороший вариант. Все-таки лучше, если все будет начинаться, храниться и управляться с компа (ноута) оператора. Начинается игра, мы соединяемся с микроконтроллером, видим морду табло, начинаем управлять и тут теряется связь, глючит роутер, отключается электричество и т.д. и т.п. И мы все потеряли.
    Наверное, лучше написать полноценное приложение на том же питоне или vb, где предусмотреть в том числе хранение данных, да и ноут безопаснее с т.з. всяких электрических катаклизмов. В конце концов все отрубится нафиг, а оператор доведет матч на ноуте, сохранит протокол встречи и прочее и прочее.
    Табло же будет только воспроизводить то, что видит у себя оператор (по сути приложение и будет копией табло, но с кнопками управления). С приложения по той же вафле будут, например, раз в полсекунды отправляться некие данные состояния табло (можно в виде текста). По этому сообщению Ардуино и будет как бы дублировать табло оператора.
    Как сделать приложение я знаю, опыт программирования имею.
    Вот мне бы помочь с тем, как отправить сообщение с ноута по wifi на мое ардуино. Достаточно даже строку. В нее же можно заложить всю инфу о текущем состоянии табло. Типа строка: 1:03:12:29:45:2:00:21:00:5 означает, 1 период, комнада А 3 очка, команда И 12 очков, таймер периода 29-45, фолы 2, таймаут 00 и т.д.

    Может у кого есть другие мысли?
     
  19. Рокки1945

    Рокки1945 Гуру

    А вот интересно можно к каждой отдельно-взятой цыферке свой вывод ws2812 с 1 контроллера сделать...
    Сколько объектов класса в библии можно сделать @b707 ?
     
  20. b707

    b707 Гуру

    да сколько угодно.
    Насколько помню, в FASTLED нет никаких ограничений.
    только ведь все одно работать это будет не параллельно, а последовательно, так что абсолютно никакой разницы, что вы цепляете 5 лент по 100 диодов к пяти пинам. что одну ветку в 500 диодов на один пин.Только пины зря занимаете...
    И о каком "удобстве вывода отдельных цифр на отдельные куски ленты" пишет автор - я абсолютно не понимаю. Скорее я бы даже поспорил - отдельный пин для каждой цифры означает свой обьект FastLED, а это условжнение кода, прописывать все цифры в одном массиве LEDs[] на мой взягляд - куда как проще. чем выбирать под каждую цифру свой обьект.