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

Нужна помощь Проблемы отображения на OLED дисплее с помощью ESP-12E

Yasha

New member
Здравствуйте! Кто может подсказать, почему не отображается текст, который должен выводиться на экран в функции setup() на дисплей OLED SSD1306? При чём текст, который должен выводится в функции loop(), отображается на экране. Скетч сам по себе не доделан полностью, но текст должен отображаться.

Код:
#include <ESP8266WiFi.h>
#include "SSD1306Wire.h"

SSD1306Wire   display(0x3c, 2, 14);

#ifndef STASSID
#define STASSID "STOP"
#define STAPSK  "06640664"
#endif
#define MAX_SRV_CLIENTS 2
const char* ssid = STASSID;
const char* pass = STAPSK;

WiFiServer server(23);
WiFiClient serverClients[MAX_SRV_CLIENTS];
IPAddress ip(192, 168, 1, 20);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);

uint8_t i, str = 0;
char c;
String content[10] = {""};

/*char *IPAddress2String(IPAddress & ip)
  {
    static char str_IP[16];
    char * last = str_IP;
    for (int8_t i = 0; i < 4; i++) {
        itoa(ip[i], last, 10);
        last = last + strlen(last);
        if (i == 3) *last = '\0'; else *last++ = '.';
    }
    return str_IP;
  }*/

void chat()
{
  //check if there are any new upcoming clients
  if (server.hasClient())
  {
    for (i = 0; i < MAX_SRV_CLIENTS; i++)
    { //find those free/disconnected spot
      if (!serverClients[i] || !serverClients[i].connected())
      {
        if (serverClients[i])
          serverClients[i].stop();
        serverClients[i] = server.available();
        display.clear();
        display.setFont(ArialMT_Plain_24);
        display.setTextAlignment(TEXT_ALIGN_CENTER);
        display.drawString(32, 64, "NEW CLIENT!");
        display.display();
        delay(5000);
        display.clear();
        continue;
      }
    }
    //no free/disconnected spot so reject
    WiFiClient serverClient = server.available();
    serverClient.stop();
  }
  //check clients for data
  for (i = 0; i < MAX_SRV_CLIENTS; i++)
  {
    if (serverClients[i] && serverClients[i].connected())
    {
      if (serverClients[i].available())
      { //get data from the telnet client and push it to the UART
        while (serverClients[i].available())
        {
          c = serverClients[i].read();
          content[str].concat(c);
        }
        if (content[str] != "")
        {
          str++;
        }
      }
    }
  }
  //check UART for data
  if (Serial.available())
  {
    size_t len = Serial.available();
    uint8_t sbuf[len];
    Serial.readBytes(sbuf, len);
    //push UART data to all connected telnet clients
    for (i = 0; i < MAX_SRV_CLIENTS; i++)
    {
      if (serverClients[i] && serverClients[i].connected())
      {
        serverClients[i].write(sbuf, len);
        delay(1);
      }
    }
  }
}

void setup()
{
  display.init();
  display.flipScreenVertically();
  display.setFont(ArialMT_Plain_24);
  display.setTextAlignment(TEXT_ALIGN_CENTER);
  display.drawString(32, 64, "SERVER");
  display.display();
  delay(2000);

  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED)
    delay(500);
  WiFi.config(ip, gateway, subnet);
  display.clear();
  display.setTextAlignment(TEXT_ALIGN_CENTER);
  display.drawString(32, 64, "Connect to \'" + String(ssid) + "\'");
  display.display();
  delay(2000);
  display.clear();

  server.begin(); // Начинаем «слушать» клиентов:
}

void loop()
{
  chat();

  display.clear();
  display.setFont(ArialMT_Plain_10);
  display.drawString(100, 0, String(WiFi.RSSI()));
  for (uint8_t j = 0; j < str; j++)
  {
    display.drawString(0, 10 + str * 10, content[str]);
  }
  display.display();
}
 

CodeNameHawk

Moderator
Команда форума
Тупо скопируйте вес вывод текста с loop() в setup(), потом вносите изменения в одну функцию и найдете, что не работает.
 

Yasha

New member
Возможно, что он отображается, но Вы его быстро стираете в loop.
При удачном подключении к Wi-Fi задержка должна быть на 4 секунды, как минимум. Но даже если он и не подключится к Wi-Fi, то слово SERVER должно отображаться 2 секунды, как минимум.
 

Yasha

New member
Тупо скопируйте вес вывод текста с loop() в setup(), потом вносите изменения в одну функцию и найдете, что не работает.
В setup() ничего не выводится на экран, что бы я туда не вносил. Но зато в последовательный порт информация выводится
 

Сергей_Ф

Moderator
Команда форума
@Yasha самый простой способ, перенести все в loop, обернув кодом, что бы выполнялось один раз. Хотя непонятно почему не работает. Может что то не инициализировалось. Чисто гипотетически попробуйте Serial.begin() перед инициализацией дисплея и потом display.clear()
 

Yasha

New member
@Yasha самый простой способ, перенести все в loop, обернув кодом, что бы выполнялось один раз. Хотя непонятно почему не работает. Может что то не инициализировалось. Чисто гипотетически попробуйте Serial.begin() перед инициализацией дисплея и потом display.clear()
Так дело в том что инициализация дисплея выполняется display.init().
Уже вроде бы пробовал переставлять Serial.begin(), но сейчас ещё раз попробую
 

Yasha

New member
@Yasha надо смотреть библиотеку. Ссылку на SSD1306Wire дайте, плз.
ThingPulse/esp8266-oled-ssd1306
И вот немного измененный код
Код:
#include <ESP8266WiFi.h>
#include "SSD1306.h"

SSD1306   display(0x3c, 2, 14);

#ifndef STASSID
#define STASSID "STOP"
#define STAPSK  "06640664"
#endif
#define MAX_SRV_CLIENTS 2
const char* ssid = STASSID;
const char* pass = STAPSK;

WiFiServer server(23);
WiFiClient serverClients[MAX_SRV_CLIENTS];
/*IPAddress ip(192, 168, 1, 15);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
IPAddress dns (192, 168, 1, 1);
*/
uint8_t i, str = 0;
char c;
String content[10] = {""};

/*char *IPAddress2String(IPAddress & ip)
  {
    static char str_IP[16];
    char * last = str_IP;
    for (int8_t i = 0; i < 4; i++) {
        itoa(ip[i], last, 10);
        last = last + strlen(last);
        if (i == 3) *last = '\0'; else *last++ = '.';
    }
    return str_IP;
  }*/

void chat()
{
  //check if there are any new upcoming clients
  if (server.hasClient())
  {
    for (i = 0; i < MAX_SRV_CLIENTS; i++)
    { //find those free/disconnected spot
      if (!serverClients[i] || !serverClients[i].connected())
      {
        if (serverClients[i])
          serverClients[i].stop();
        serverClients[i] = server.available();
        display.clear();
        display.setFont(ArialMT_Plain_24);
        display.setTextAlignment(TEXT_ALIGN_CENTER);
        display.drawString(32, 64, "NEW CLIENT!");
        display.display();
        delay(5000);
        display.clear();
        continue;
      }
    }
    //no free/disconnected spot so reject
    WiFiClient serverClient = server.available();
    serverClient.stop();
  }
  //check clients for data
  for (i = 0; i < MAX_SRV_CLIENTS; i++)
  {
    if (serverClients[i] && serverClients[i].connected())
    {
      if (serverClients[i].available())
      { //get data from the telnet client and push it to the UART
        while (serverClients[i].available())
        {
          c = serverClients[i].read();
          content[str].concat(c);
        }
        if (content[str] != "")
        {
          str++;
        }
      }
    }
  }
  //check UART for data
  if (Serial.available())
  {
    size_t len = Serial.available();
    uint8_t sbuf[len];
    Serial.readBytes(sbuf, len);
    //push UART data to all connected telnet clients
    for (i = 0; i < MAX_SRV_CLIENTS; i++)
    {
      if (serverClients[i] && serverClients[i].connected())
      {
        serverClients[i].write(sbuf, len);
        delay(1);
      }
    }
  }
}

void setup()
{
  Serial.begin(115200);
  display.init();
  display.flipScreenVertically();
  display.clear();
  display.setFont(ArialMT_Plain_24);
  display.setTextAlignment(TEXT_ALIGN_CENTER);
  display.drawString(32, 64, "SERVER");
  display.display();
  Serial.println("");
  Serial.println("SERVER");
  delay(2000);
 
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.println(".");
  }
  display.clear();
  display.setTextAlignment(TEXT_ALIGN_CENTER);
  display.drawString(32, 64, "Connect to \"" + String(ssid) + "\"");
  display.display();
  Serial.println(ssid);
  Serial.println(WiFi.localIP());
  delay(2000);
  display.clear();

  server.begin(); // Начинаем «слушать» клиентов:
}

void loop()
{
  chat();

  display.clear();
  display.setFont(ArialMT_Plain_10);
  display.drawString(100, 0, String(WiFi.RSSI()));
  for (uint8_t j = 0; j < str; j++)
  {
    display.drawString(0, 10 + str * 10, content[str]);
  }
  display.display();
}
 

Сергей_Ф

Moderator
Команда форума
@Yasha в библиотеке видно что функция init() возвращает значение bool. Рекомендую посмотреть что же она возвращает в вашем случае. Если false, то включите отладку в файле OLEDDisplay.h и смотрите в терминале где ошибка.
 

Сергей_Ф

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

Вы задействовали gpio2 и 14, в примерах используют D3,D5 что соответствует gpio0 и 14. Может в этом дело?
 
Последнее редактирование:

Yasha

New member
что в ней неправильно по вашему, давайте подробнее. Какая плата выбрана в диспетчере? Что пишет компилятор? Схему вашего подключения давайте.

Вы задействовали gpio2 и 14, в примерах используют D3,D5 что соответствует gpio0 и 14. Может в этом дело?
Уже решил проблему. Дело оказалось в том, что неправильно указал координаты начала вывода текста. Спасибо за помощь
 
Сверху Снизу