• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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. Может в этом дело?
Уже решил проблему. Дело оказалось в том, что неправильно указал координаты начала вывода текста. Спасибо за помощь
 
Сверху Снизу