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

Нужна помощь Esp8266+Uno+Oled+RTC

Yakov

New member
День добрый,
Приобрел esp8266-01 и сейчас осваиваю с Ардоино Уно.
Так же имеются модули :RTC 3231 and Oled LCD Display 0.96''.
Пытался собрать такую схему :
Время считывается и выводиться на LCD и так же через esp8266 , который должен подключаться к домашнему раутеру, наблюдается по web.

Сложности с которыми я столкнулся (не решенные) :

На esp8266 дефолтаная прошивка... Не получается сконфигурировать esp8266 на подключение к дом. роутера и чтобы он при этом как сервер работал.

Так же пытался (без успеха) , чтобы esp8266 управлялся из прописаного кода (конфигурации, setup, init) , ну и так же , чтобы я мог с Serial Monitor давать ему команды и видеть их выполнения в этом же Serial Monitor. Реально ли такое или я загнул ?

Когда брал простой пример для esp8266 (рабочий) , и добавлял к нему LCD с RTC 3231 (тоже рабочий код (считывает время и пишет на LCD ) ) , то вместе , часть кода для esp8266 работает не корректно .

Заранее благодарю за помощь.
 

Victor

Administrator
Команда форума
На esp8266 дефолтаная прошивка... Не получается сконфигурировать esp8266
Первый путь
1. для начала - наладьте связь с ESP8266 через USB-TTL в терминал, поиграйтесь AT командами вручную
2. Прошейте свежую прошивку, повторите п.1
3. Поиграйтесь AT командами уже из скетча ардуины (тут лучше брать ардуину с двумя портами, если с одним, то SoftSerial на дебаг терминал)
4. собираете уже все вместе с OLED

Второй путь
1. Заменить ESP-01 на ESP-12 (ESP-07), убрать из схемы Arduino вообще.
2. Arduino IDE для ESP8266 и делаете свою прошивку под вашу задачу

Третий - не использовать AT, попробовать NodeMCU

Ну и четвертый - сделать свою Piccolino по их подобию

и это еще не все - вариантов просто масса!
 

Yakov

New member
Первый путь
1. для начала - наладьте связь с ESP8266 через USB-TTL в терминал, поиграйтесь AT командами вручную
2. Прошейте свежую прошивку, повторите п.1
3. Поиграйтесь AT командами уже из скетча ардуины (тут лучше брать ардуину с двумя портами, если с одним, то SoftSerial на дебаг терминал)
4. собираете уже все вместе с OLED
USB-TTLя нет , поэтому поигрался уже с АТ командами через Ардуино , и как клиент и как точка доступа. Нашел кое какой Web сервер на режиме "точка доступа" , и тот работал через 1 место и не со всех браузеров.
Что мне даст обновление прошивки (на моём начальном этапе экспериментов) ?

Я таки предполагаю использовать 8266 именно через Ардуино , так как, конечная задумка будет на Ардуино с 5-канальным шим освещением , управлением N-ым количеством релюшек , ну и датчики всякие. А 8266 будет связывать Ардоино с телефоном для обзора статуса и изменения настроек.

Так вот , для обучающего процесса , пытаюсь считать время с RTC ,отобразить время на ОЛЕД и через 8266 на компе , и так же зажечь СД на Ардуино с той же странички отображающей время.
 

Yakov

New member
Спасибо.
ESP к ardulino - это круто,
это как мотор от мерседеса на телегу прикрутить.
еще не хватает детекторного приемника чтобы wifi принимать.
я бы выкинул ardulino, но у меня его нет.
вариант надцатый
купить за 400 рублей devkit на ESP и выкинуть ardulino
Есть Ардуино и ESP8266 и с этим я собираюсь строить поставленную задачу. Я же не спрашивал что мне купить ...
 

JustACat

Moderator
Команда форума
это как мотор от мерседеса на телегу прикрутить.
Ой таки и любите же вы передергивать. Но спорить с вами не будем, просто промолчим.
Есть Ардуино и ESP8266 и с этим я собираюсь строить поставленную задачу
Верно говорите, если вам так проще, или у вас задача так стоит - то так и делайте, все норм.
Вот только вы бы расписывали все как-то по подробнее. А то я вот толком не понял, что у вас конкретно из описанного работает, а что нет?
Вот все, что вы там описали с Ардуино, часами, экраном и т.п. только без ESP - работает уже?
И отдельно Arduino с ESP без всего остального - работает?
Это я намекаю на то, что задачу все же лучше частями решать, а не пытаться надергать кусков кода из кучи примеров, сразу все подключить и пытаться найти - что не работает. Это слишком сложная задача выходит.

А так, поддержу @Victor'а: даже если вы хотите для начала поработать именно с AT прошивкой - то ее все равно сразу однозначно под обновление на последнюю. Как обновить - у нас написано в документации, примеров много.

Далее из личного опыта скажу: на стандартных прошивках (на AT) поднимать на ESP веб-сервер - дело неблагодарное.
То есть это возможно в принципе, но во-первых, весь процессинг приходящего/уходящего для web вам придется делать на Arduino (а ресурсов на ней кот наплакал, тем более, если вам еще дисплей с графикой нужен).
Тут кто-то делал такое, и вполне работало, но, использовался не Ардуино на мелкой АВР, а целый STM32 - у которого куда больше ресурсов.
А во-вторых, это будет работать через раз. В общем, это подходит только для обучения, чтобы в общем понимать лучше, как это все может работать.
Отказываться сразу от этого может и не стоит. Попробуйте, хуже точно не будет. Просто имейте ввиду, что дальше, скорее всего, придется перейти в ESP на какую-то стороннюю прошивку, либо вообще написать свою.
Гляньте в ссылке на документацию (у меня в подписи) есть множество ссылок с примерами реализации разного, в т.ч, и на AT с ардуино (там пометки есть).
А так же тут на форуме где-то была выложена реализация часов на Ардуино с RTC + ESP для забирания точного времени с инета по NTP.

Вот. А когда и если наиграетесь с AT - то дальше много путей.
Можно искать и пробовать чужие готовые прошивки (например, попробовать разобраться с прошивкой малого веб-сервера от @pvvx), можно сварганнить что-то небольшое на Lua, закачав на ESP прошивку NodeMCU, можно написать свою прошивку под ESP (для этого у нас тут на форуме тоже много всего: и UDK, и Sming, и Arduino IDE).

Пробуйте, читайте, задавайте вопросы!
Только большая просьба: задавайте вопросы правильно. Четко формулируйте, как можно короче, и чтобы ответить можно было коротко. Иначе отвечать многие просто не захотят.
 

nikolz

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

Yakov

New member
Ой таки и любите же вы передергивать. Но спорить с вами не будем, просто промолчим.

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

А так, поддержу @Victor'а: даже если вы хотите для начала поработать именно с AT прошивкой - то ее все равно сразу однозначно под обновление на последнюю. Как обновить - у нас написано в документации, примеров много.

Далее из личного опыта скажу: на стандартных прошивках (на AT) поднимать на ESP веб-сервер - дело неблагодарное.
То есть это возможно в принципе, но во-первых, весь процессинг приходящего/уходящего для web вам придется делать на Arduino (а ресурсов на ней кот наплакал, тем более, если вам еще дисплей с графикой нужен).
Тут кто-то делал такое, и вполне работало, но, использовался не Ардуино на мелкой АВР, а целый STM32 - у которого куда больше ресурсов.
А во-вторых, это будет работать через раз. В общем, это подходит только для обучения, чтобы в общем понимать лучше, как это все может работать.
Отказываться сразу от этого может и не стоит. Попробуйте, хуже точно не будет. Просто имейте ввиду, что дальше, скорее всего, придется перейти в ESP на какую-то стороннюю прошивку, либо вообще написать свою.
Гляньте в ссылке на документацию (у меня в подписи) есть множество ссылок с примерами реализации разного, в т.ч, и на AT с ардуино (там пометки есть).
А так же тут на форуме где-то была выложена реализация часов на Ардуино с RTC + ESP для забирания точного времени с инета по NTP.

Вот. А когда и если наиграетесь с AT - то дальше много путей.
Можно искать и пробовать чужие готовые прошивки (например, попробовать разобраться с прошивкой малого веб-сервера от @pvvx), можно сварганнить что-то небольшое на Lua, закачав на ESP прошивку NodeMCU, можно написать свою прошивку под ESP (для этого у нас тут на форуме тоже много всего: и UDK, и Sming, и Arduino IDE).

Пробуйте, читайте, задавайте вопросы!
Только большая просьба: задавайте вопросы правильно. Четко формулируйте, как можно короче, и чтобы ответить можно было коротко. Иначе отвечать многие просто не захотят.
Спасибо за разъяснение,
Я попробовал 8266 в "ручном" режиме; вроде все работает нормально:
Код:
  if (Serial.available() > 0) {
    char ch = Serial.read();
    Serial1.print(ch);
  }
  if (Serial1.available() > 0) {
    char ch = Serial1.read();
    Serial.print(ch);
  }
После попробовал код такого плана , который полностью бежал с Ардуино. Это только часть кода... В setup конфигурируется 8266 как сервер. Код рабочий.
Код:
      delay(1000);
      int connectionId = Serial1.read() - 48; // subtract 48 because the read() function returns
      // the ASCII decimal value and 0 (the first decimal number) starts at 48

      String webpage = "<h1>Hello</h1>&lth2>World!</h2><button>LED1</button>";

      String cipSend = "AT+CIPSEND=";
      cipSend += connectionId;
      cipSend += ",";
      cipSend += webpage.length();
      cipSend += "\r\n";

      sendData(cipSend, 1000, DEBUG);
      sendData(webpage, 1000, DEBUG);

      webpage = "<button>LED2</button>";

      cipSend = "AT+CIPSEND=";
      cipSend += connectionId;
      cipSend += ",";
      cipSend += webpage.length();
      cipSend += "\r\n";

      sendData(cipSend, 1000, DEBUG);
      sendData(webpage, 1000, DEBUG);

      String closeCommand = "AT+CIPCLOSE=";
      closeCommand += connectionId;
      closeCommand += "\r\n";
      sendData(closeCommand, 3000, DEBUG);

Код Олед и RTC рабочий и выглядит так:
Код:
  int second, minute, hour, date, month, year, temperature;
  second = Clock.getSecond();
  minute = Clock.getMinute();
  hour = Clock.getHour(h12, PM);
  date = Clock.getDate();
  month = Clock.getMonth(Century);
  year = Clock.getYear();
  temperature = Clock.getTemperature();

  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(2);
  display.setCursor(0, 0);
  display.print("20");
  display.print(year, DEC);
  display.print('-');
  display.print(month, DEC);
  display.print('-');
  display.print(date, DEC);
  display.print('\n');
  if (hour < 10)
  {
    display.print("0");
    display.print(hour, DEC);
  }
  else
  {
    display.print(hour, DEC);
  }
  display.print(':');
  if (minute < 10)
  {
    display.print("0");
    display.print(minute, DEC);
  }
  else
  {
    display.print(minute, DEC);
  }
  display.print(':');

  if (second < 10)
  {
    display.print("0");
    display.print(second, DEC);
  }
  else
  {
    display.print(second, DEC);
  }
  display.print('\n');
  display.setTextSize(1);
  display.print("Temperature=");
  display.print(temperature);
  display.print(" C");
  display.print('\n');

  display.display();
  //delay(1000);
После соединение этих двух рабочих частей , получил , что 8266 работает не корректно (Даже не выполняется Setup как положено).
Это весь код целиком:
Код:
#include <Wire.h>
#include <DS3231.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <SoftwareSerial.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
#define DEBUG true

bool Century = false;
bool h12, PM;
byte year, month, date, DoW, hour, minute, second;

DS3231 Clock;
SoftwareSerial Serial1(10, 11);

void setup() {
  Wire.begin();
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 0.96" 128X64 OLED LCD Display)I2C АДРЕС.

  Serial.begin(9600);
  Serial1.begin(9600);
  delay(3000);
  Serial.print("Init\n");
  sendData("AT+RST\r\n", 2000, DEBUG); // reset module
  sendData("AT+CWMODE=2\r\n", 1000, DEBUG); // configure as access point
  sendData("AT+CIFSR\r\n", 1000, DEBUG); // get ip address
  sendData("AT+CIPMUX=1\r\n", 1000, DEBUG); // configure for multiple connections
  sendData("AT+CIPSERVER=1,80\r\n", 1000, DEBUG); // turn on server on port 80
  delay(5000);
}

void loop() {
  if (Serial.available() > 0) {
    char ch = Serial.read();
    Serial1.print(ch);
  }
  while (Serial1.available()) {
    if (Serial1.find("+IPD,"))
      delay(1000);
    int connectionId = Serial1.read() - 48; // subtract 48 because the read() function returns
    // the ASCII decimal value and 0 (the first decimal number) starts at 48

    String webpage = "<h1>Hello</h1>&lth2>World!</h2><button>LED1</button>";

    String cipSend = "AT+CIPSEND=";
    cipSend += connectionId;
    cipSend += ",";
    cipSend += webpage.length();
    cipSend += "\r\n";

    sendData(cipSend, 1000, DEBUG);
    sendData(webpage, 1000, DEBUG);

    webpage = "<button>LED2</button>";

    cipSend = "AT+CIPSEND=";
    cipSend += connectionId;
    cipSend += ",";
    cipSend += webpage.length();
    cipSend += "\r\n";

    sendData(cipSend, 1000, DEBUG);
    sendData(webpage, 1000, DEBUG);

    String closeCommand = "AT+CIPCLOSE=";
    closeCommand += connectionId; // append connection id
    closeCommand += "\r\n";

    sendData(closeCommand, 3000, DEBUG);
  }
}

int second, minute, hour, date, month, year, temperature;
second = Clock.getSecond();
minute = Clock.getMinute();
hour = Clock.getHour(h12, PM);
date = Clock.getDate();
month = Clock.getMonth(Century);
year = Clock.getYear();
temperature = Clock.getTemperature();

display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(0, 0);
display.print("20");
display.print(year, DEC);
display.print('-');
display.print(month, DEC);
display.print('-');
display.print(date, DEC);
display.print('\n');
if (hour < 10) {
  display.print("0");
  display.print(hour, DEC);
}
else {
  display.print(hour, DEC);
}
display.print(':');
if (minute < 10) {
  display.print("0");
  display.print(minute, DEC);
}
else {
  display.print(minute, DEC);
}
display.print(':');

if (second < 10) {
  display.print("0");
  display.print(second, DEC);
}
else {
  display.print(second, DEC);
}
display.print('\n');
display.setTextSize(1);
display.print("Temperature=");
display.print(temperature);
display.print(" C");
display.print('\n');
display.display();
//delay(1000);
}

String sendData(String command, const int timeout, boolean debug) {
  String response = "";
  Serial1.print(command); // send the read character to the esp8266
  long int time = millis();
  while ( (time + timeout) > millis())  {
    while (Serial1.available() > 0)    {
      // The esp has data so display its output to the serial window
      char c = Serial1.read(); // read the next character.
      response += c;
    }
  }
  if (debug)  {
    Serial.print(response);
  }
  return response;
}
Почему такая фигня ?
 

JustACat

Moderator
Команда форума
Yakov, ну и нужно смотреть в ту либу, которая у вас для работы с ESP используется...
Лично я у себя, к примеру, выяснил, что работать с ESP на delay и Serial.find - невозможно... То есть оно работает, но никакой надежности и повторимости. Чуть где что запнулось - и весь скрипт летит к чертям.
Так что если и работать с AT прошивками на ESP с Arduino - то нужно все четко самому прописывать в части управления ESP и анализа ответов от нее. Учитывать все возможные падения и тормоза посреди данного процесса и еще кучу всяких условий.
В общем, пописав в том ключе некоторое время, я плюнул на это гиблое дело :-Р и начал писать прямо под ESP - это оказалось проще...
 

Victor

Administrator
Команда форума

Yakov

New member
Понравилось )) , да погорячился я с "Это что ?", читаю....
А на смотреть на свободную память при помощи нашего примера правильнее будет в процессе работы программы в разное время и место кода ? Правильно я понял ?

Yakov, ну и нужно смотреть в ту либу, которая у вас для работы с ESP используется...
Лично я у себя, к примеру, выяснил, что работать с ESP на delay и Serial.find - невозможно... То есть оно работает, но никакой надежности и повторимости. Чуть где что запнулось - и весь скрипт летит к чертям.
Так что если и работать с AT прошивками на ESP с Arduino - то нужно все четко самому прописывать в части управления ESP и анализа ответов от нее. Учитывать все возможные падения и тормоза посреди данного процесса и еще кучу всяких условий.
В общем, пописав в том ключе некоторое время, я плюнул на это гиблое дело :-Р и начал писать прямо под ESP - это оказалось проще...
Ок. Спасибо , я также заметил что find в варианте (RTC+OLED+8266) делало не пойми чего ..... Я думаю последовать вашему совету и часть задач по связи перенести в 8266.
 

Yakov

New member
День добрый,
Вчера потратил часа 3 на обновление прошивки : делал через Ардуино (с ресетом на gnd). Пробовал ставил 21, 22 и 23 и на всех та же проблема - АТ+RST приводит к зависанию... На АТ отвечает ОК, на АТ+GMR тоже отвечает нормально , а на АТ+RST иногда таки выдает немного кода с Ready в конце , а чаще всего наглухо виснет.
Код:
OK
AT


OK
AT+RST


OK

ets Jan  8 2013,rst cause:4, boot mode:(3,7)

wdt reset
load 0x40100000, len 23248, room 16
tail 0
chksum 0xda
load 0x3ffe8000, len 3020, room 8
tail 4
chksum 0x4e
load 0x3ffe8bd0, len 7272, room 4
tail 4
chksum 0xa6
csum 0xa6

Error wifi_config! Clear.
l

OpenLoaderSDK v1.0
nv version:VER1

ready
AT+GMR

AT version:0.23.0.0(Apr 24 2015 21:11:01)
SDK version:1.0.1
http://esp8266.ru/

OK
AT+RST


OK

ets Jan  8 2013,rst cause:4, boot mode:(3,7)

wdt reset
load 0x40100000, len 23248, room 16
tail 0
chksum 0xda
load 0x3ffe8000, len 3020, room 8
tail 4
chksum 0x4e
load 0x3ffe8bd0, len 7272, room 4

Далее висит , иногдa на первой строчке зависает ("ets Jan 8 2013,rst")
 
Последнее редактирование:

JustACat

Moderator
Команда форума
Yakov, питание?
Общение не через ардуино попробуйте.
PS: пожалуйста, прячьте код под спойлер (устаешь колесико мыши крутить до нужного места), спасибо.
 

Victor

Administrator
Команда форума
[inline]Error wifi_config! Clear.[/inline]
Не забывайте, что прошивка v0.23 экспериментальная. Для того, чтобы убедится, что дело не в прошивке - попробуйте стабильную, проверенную версию AT v0.22 SDK 1.0.0 20.03.2015 загрузчик v1.2 и описание команд к ней ESP8266 AT команды v0.22
 

Yakov

New member
Питание с ардо 5 В через ЛМ1117.
Общение не через ардуино попробуйте.
TTL-USB еще не доехал. Через что ещё возможно?

Не забывайте, что прошивка v0.23 экспериментальная. Для того, чтобы убедится, что дело не в прошивке - попробуйте стабильную, проверенную версию AT v0.22 SDK 1.0.0 20.03.2015 загрузчик v1.2 и описание команд к ней ESP8266 AT команды v0.22
Пробовал и 21 и 22 так же.
 

JustACat

Moderator
Команда форума
Питание с ардо 5 В
Скорее всего питания не хватает, т.к. на ардуинку оно же с USB идет... Возьмите отдельное питание, например, от какого-то мощного БП (от ПК или еще чего), хотя бы на 1 ампер, а лучше на два - с него подайте на 1117 - с нее уже на ESP. Не забудьте только земли соединить у всего этого добра.
Через что ещё возможно?
Тогда подождите USB-UART. И через ардуинку вы напрямую с ПК общаетесь, замыкая Reset ардуинки, или через нее через скетч пустой?
 
Сверху Снизу