• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь подключение OLED дисплея к WeMos D1R1

Доброго времени суток уважаемое сообщество, нужна ваша помощь ибо сам только учусь и знаний не хватает, имеем железо WeMos D1R1 на ESP8266, датчик температуры DS18b20 релейный модуль на 8 реле все подключено и настроено через Blynk, температуру отображает реле работают но возникла необходимость подключения визуального отображения температуры на OLED 0.91 I2C привожу пример прошивки помогите интегрировать дисплей.

Код:
#include <ArduinoOTA.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define Relay2 14 //пин реле
boolean tr = true; //назначаем логическую переменную для однократной отправки сообщения о температуре
// персональные данные
char auth[] = "********"; //токен
char ssid[] = "*****";  //Имя точки доступа WIFI
char pass[] = "*******"; //пароль точки доступа WIFI
#define ONE_WIRE_BUS D3 // пин датчика d18b20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
BlynkTimer timer1;
float temp2; //переменная температуры
int tempConst2 = 10; //температура по умолчанию
int gistT = 1; //задаем дельту
float i; //показания датчика тока
float I; //сила тока
void sendTemps(){   //проверка температуры
  sensors.requestTemperatures();
  temp2 = sensors.getTempCByIndex(0);
  Serial.println(temp2);
  Blynk.virtualWrite(V1, temp2);
}
BLYNK_WRITE(V4){    //считываем данные со слайдера
  tempConst2 = param.asInt();
}
void checktemp(){   //сравниваем заданную и текущую температуру
  if (temp2 >= tempConst2 + gistT) //если температура в норме
  {
    digitalWrite(Relay2, HIGH); //выключаем реле
    Serial.println(tempConst2);
    if (tr == true)
    {
      Blynk.email("*****@etlgr.com", "Температура в норме", " ");
      Serial.println("_HIGH_");
      tr = false; //присваиваем переменной обратное значение чтобы сообщение больше не отправлялось
    }
  }
  else if (temp2 <= tempConst2 - gistT) // если температура нниже
  {
    digitalWrite(Relay2, LOW); //включаем реле
    Serial.println(tempConst2);
    if (tr == false) // проверяем логическую переменную
    {
      Blynk.email("*****@etlgr.com", "Низкая температура", " ");
      Serial.println("_LOW_");
      tr = true; //меняем значение переменной чтобы больше не отправлялось сообщение
    }
  }
}
void amper(){       //датчик силы тока
  i = analogRead(A0);
  I = (i - 491) / 12,178;
  if (I < 0){
    I = I * - 1;
  }
  Serial.println(I);
  Blynk.virtualWrite(V2, I);
}
void setup(){       //настройки
  pinMode(Relay2, OUTPUT);        // пин реле выход
  Serial.begin(9600);             // скорость сериал порта
  Blynk.begin(auth, ssid, pass);  //старт блинка
  Blynk.syncAll();                // синхронизация блинка
  sensors.begin();                // старт датчика температуры
  ArduinoOTA.begin();             // старт обновления по воздуху
  // Таймеры на запуск функций
  timer1.setInterval(3000L, sendTemps); //опрос d18b20
  timer1.setInterval(3000L, checktemp); //сравнение текущей температуры с заданой
  timer1.setInterval(1000L, amper);     //амперметр
}
void loop(){
  ArduinoOTA.handle();
  Blynk.run();
  timer1.run();
}
 

Сергей_Ф

Moderator
Команда форума
@Антон Витальевич а что такое у вас релейный модуль на 8 реле? В скетче вижу только одно. И в чем проблема посмотреть примеры Ардуино по подключению этого экрана?
 
@Антон Витальевич а что такое у вас релейный модуль на 8 реле? В скетче вижу только одно. И в чем проблема посмотреть примеры Ардуино по подключению этого экрана?
в скетче одно реле управляется непосредственно с датчика температуры, остальные с приложения Blynk. Этот скетч я путем проб и ощибок склеил из примеров и он слава богу работает, вот с дисплеем не получается.
 

alexlaw

Member
OLED 0.91 I2C ... помогите интегрировать дисплей
Код:
//Wemos D1 Мини
#define SSD1306_ADDRESS            0x3C
//SSD1306 128x64
#define SSD1306_COLUMN             20
#define SSD1306_LINE               8
#include <Wire.h>
// Character set - stored in program memory
const uint8_t CharMap[96][6] PROGMEM = {
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00 },
{ 0x00, 0x07, 0x00, 0x07, 0x00, 0x00 },
{ 0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00 },
{ 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00 },
{ 0x23, 0x13, 0x08, 0x64, 0x62, 0x00 },
{ 0x36, 0x49, 0x56, 0x20, 0x50, 0x00 },
{ 0x00, 0x08, 0x07, 0x03, 0x00, 0x00 },
{ 0x00, 0x1C, 0x22, 0x41, 0x00, 0x00 },
{ 0x00, 0x41, 0x22, 0x1C, 0x00, 0x00 },
{ 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00 },
{ 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00 },
{ 0x00, 0x80, 0x70, 0x30, 0x00, 0x00 },
{ 0x08, 0x08, 0x08, 0x08, 0x08, 0x00 },
{ 0x00, 0x00, 0x60, 0x60, 0x00, 0x00 },
{ 0x20, 0x10, 0x08, 0x04, 0x02, 0x00 },
{ 0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00 },
{ 0x00, 0x42, 0x7F, 0x40, 0x00, 0x00 },
{ 0x72, 0x49, 0x49, 0x49, 0x46, 0x00 },
{ 0x21, 0x41, 0x49, 0x4D, 0x33, 0x00 },
{ 0x18, 0x14, 0x12, 0x7F, 0x10, 0x00 },
{ 0x27, 0x45, 0x45, 0x45, 0x39, 0x00 },
{ 0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00 },
{ 0x41, 0x21, 0x11, 0x09, 0x07, 0x00 },
{ 0x36, 0x49, 0x49, 0x49, 0x36, 0x00 },
{ 0x46, 0x49, 0x49, 0x29, 0x1E, 0x00 },
{ 0x00, 0x00, 0x14, 0x00, 0x00, 0x00 },
{ 0x00, 0x40, 0x34, 0x00, 0x00, 0x00 },
{ 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 },
{ 0x14, 0x14, 0x14, 0x14, 0x14, 0x00 },
{ 0x00, 0x41, 0x22, 0x14, 0x08, 0x00 },
{ 0x02, 0x01, 0x59, 0x09, 0x06, 0x00 },
{ 0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00 },
{ 0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00 },
{ 0x7F, 0x49, 0x49, 0x49, 0x36, 0x00 },
{ 0x3E, 0x41, 0x41, 0x41, 0x22, 0x00 },
{ 0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00 },
{ 0x7F, 0x49, 0x49, 0x49, 0x41, 0x00 },
{ 0x7F, 0x09, 0x09, 0x09, 0x01, 0x00 },
{ 0x3E, 0x41, 0x41, 0x51, 0x73, 0x00 },
{ 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00 },
{ 0x00, 0x41, 0x7F, 0x41, 0x00, 0x00 },
{ 0x20, 0x40, 0x41, 0x3F, 0x01, 0x00 },
{ 0x7F, 0x08, 0x14, 0x22, 0x41, 0x00 },
{ 0x7F, 0x40, 0x40, 0x40, 0x40, 0x00 },
{ 0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x00 },
{ 0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00 },
{ 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00 },
{ 0x7F, 0x09, 0x09, 0x09, 0x06, 0x00 },
{ 0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00 },
{ 0x7F, 0x09, 0x19, 0x29, 0x46, 0x00 },
{ 0x26, 0x49, 0x49, 0x49, 0x32, 0x00 },
{ 0x03, 0x01, 0x7F, 0x01, 0x03, 0x00 },
{ 0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00 },
{ 0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00 },
{ 0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00 },
{ 0x63, 0x14, 0x08, 0x14, 0x63, 0x00 },
{ 0x03, 0x04, 0x78, 0x04, 0x03, 0x00 },
{ 0x61, 0x59, 0x49, 0x4D, 0x43, 0x00 },
{ 0x00, 0x7F, 0x41, 0x41, 0x41, 0x00 },
{ 0x02, 0x04, 0x08, 0x10, 0x20, 0x00 },
{ 0x00, 0x41, 0x41, 0x41, 0x7F, 0x00 },
{ 0x04, 0x02, 0x01, 0x02, 0x04, 0x00 },
{ 0x40, 0x40, 0x40, 0x40, 0x40, 0x00 },
{ 0x00, 0x03, 0x07, 0x08, 0x00, 0x00 },
{ 0x20, 0x54, 0x54, 0x78, 0x40, 0x00 },
{ 0x7F, 0x28, 0x44, 0x44, 0x38, 0x00 },
{ 0x38, 0x44, 0x44, 0x44, 0x28, 0x00 },
{ 0x38, 0x44, 0x44, 0x28, 0x7F, 0x00 },
{ 0x38, 0x54, 0x54, 0x54, 0x18, 0x00 },
{ 0x00, 0x08, 0x7E, 0x09, 0x02, 0x00 },
{ 0x18, 0xA4, 0xA4, 0x9C, 0x78, 0x00 },
{ 0x7F, 0x08, 0x04, 0x04, 0x78, 0x00 },
{ 0x00, 0x44, 0x7D, 0x40, 0x00, 0x00 },
{ 0x20, 0x40, 0x40, 0x3D, 0x00, 0x00 },
{ 0x7F, 0x10, 0x28, 0x44, 0x00, 0x00 },
{ 0x00, 0x41, 0x7F, 0x40, 0x00, 0x00 },
{ 0x7C, 0x04, 0x78, 0x04, 0x78, 0x00 },
{ 0x7C, 0x08, 0x04, 0x04, 0x78, 0x00 },
{ 0x38, 0x44, 0x44, 0x44, 0x38, 0x00 },
{ 0xFC, 0x18, 0x24, 0x24, 0x18, 0x00 },
{ 0x18, 0x24, 0x24, 0x18, 0xFC, 0x00 },
{ 0x7C, 0x08, 0x04, 0x04, 0x08, 0x00 },
{ 0x48, 0x54, 0x54, 0x54, 0x24, 0x00 },
{ 0x04, 0x04, 0x3F, 0x44, 0x24, 0x00 },
{ 0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00 },
{ 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00 },
{ 0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00 },
{ 0x44, 0x28, 0x10, 0x28, 0x44, 0x00 },
{ 0x4C, 0x90, 0x90, 0x90, 0x7C, 0x00 },
{ 0x44, 0x64, 0x54, 0x4C, 0x44, 0x00 },
{ 0x00, 0x08, 0x36, 0x41, 0x00, 0x00 },
{ 0x00, 0x00, 0x77, 0x00, 0x00, 0x00 },
{ 0x00, 0x41, 0x36, 0x08, 0x00, 0x00 },
{ 0x02, 0x01, 0x02, 0x04, 0x02, 0x00 },
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00 }
};
int const InitLen = 23;
unsigned char Init[InitLen] = {
  0xAE, // Display off
  0xD5, // Set display clock
  0x80, // Recommended value
  0xA8, // Set multiplex
  0x3F,
  0xD3, // Set display offset
  0x00,
  0x40, // Zero start line
  0x8D, // Charge pump
  0x14,
  0x20, // Memory mode
  0x02, // Page addressing
  0xA1, // 0xA0/0xA1 flip horizontally
  0xC8, // 0xC0/0xC8 flip vertically
  0xDA, // Set comp ins
  0x12,
  0x81, // Set contrast
  0x7F,
  0xD9, // Set pre charge
  0xF1,
  0xDB, // Set vcom detect
  0x40,
  0xA6  // Normal (0xA7=Inverse)
};
void setup() {
//  Serial.begin(9600);
  Wire.begin(D1, D2);
  InitDisplay();
DisplayStr ("Character set for text - stored in program memory\n\r");
DisplayStr ("Character set for text - stored in program memory\n\r");
DisplayStr ("Character set for text - stored in program memory\n\r");
}

void loop() {
  // put your main code here, to run repeatedly:

}
void Command(uint8_t c)
{
    Wire.beginTransmission(SSD1306_ADDRESS);
    Wire.write(0x80);//command mode
    Wire.write(c);
    Wire.endTransmission();
}

void Data(uint8_t d)
{
    Wire.beginTransmission(SSD1306_ADDRESS);
    Wire.write(0x40);//data mode
    Wire.write(d);
    Wire.endTransmission();
}
void InitDisplay () {
  for (uint8_t c=0; c<InitLen; c++) Command(Init[c]);
  Display(12);    // Clear display
  Command(0xAF);  // Display on
}
// Character terminal **********************************************

void ClearLine (uint8_t line) {
  Command(0xB0 + line);
  Command(0x00); // Column start low
  Command(0x00); // Column start high
  for (uint8_t b = 0 ; b < 128; b++) Data(0);
}

// Clears the top line, then scrolls the display up by one line
void ScrollDisplay (uint8_t *scroll) {
  ClearLine(*scroll);
  *scroll = (*scroll + 1) & 0x07;
  Command(0xD3);
  Command(*scroll << 3);
}

// Plots a character; line = 0 to 7; column = 0 to 20
void PlotChar (char c, uint8_t line, uint8_t column) {
  column = column*6;
  Command(0xB0 + (line & 0x07));
  Command(0x00 + (column & 0x0F)); // Column start low
  Command(0x10 + (column >> 4));   // Column start high
  for (uint8_t col = 0; col < 6; col++) {
    Data(pgm_read_byte(&CharMap[(c & 0x7F)-32][col]));
  }
}

// Prints a character to display, handling control characters
void Display (char c) {
  static uint8_t Line = 0, Column = 0, Scroll = 0;
  if (c >= 32) {                   // Normal character
    PlotChar(c, Line+Scroll, Column++);
    if (Column > SSD1306_COLUMN) {
      Column = 0;
      if (Line == SSD1306_LINE) ScrollDisplay(&Scroll); else Line++;
    }
  } else if (c == 12) {            // Clear display
    for (uint8_t p=0; p < 8; p++) ClearLine(p);
    Line = Scroll;
    Column = 0;
  } else if (c == 13) {            // Return
    Column = 0;
    if (Line == SSD1306_LINE) ScrollDisplay(&Scroll); else Line++;
  }
}
void DisplayStr (char *s) {
  while (*s) Display(*s++);
}
 
Код:
//Wemos D1 Мини
#define SSD1306_ADDRESS            0x3C
//SSD1306 128x64
#define SSD1306_COLUMN             20
#define SSD1306_LINE               8
#include <Wire.h>
// Character set - stored in program memory
const uint8_t CharMap[96][6] PROGMEM = {
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00 },
{ 0x00, 0x07, 0x00, 0x07, 0x00, 0x00 },
{ 0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00 },
{ 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00 },
{ 0x23, 0x13, 0x08, 0x64, 0x62, 0x00 },
{ 0x36, 0x49, 0x56, 0x20, 0x50, 0x00 },
{ 0x00, 0x08, 0x07, 0x03, 0x00, 0x00 },
{ 0x00, 0x1C, 0x22, 0x41, 0x00, 0x00 },
{ 0x00, 0x41, 0x22, 0x1C, 0x00, 0x00 },
{ 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00 },
{ 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00 },
{ 0x00, 0x80, 0x70, 0x30, 0x00, 0x00 },
{ 0x08, 0x08, 0x08, 0x08, 0x08, 0x00 },
{ 0x00, 0x00, 0x60, 0x60, 0x00, 0x00 },
{ 0x20, 0x10, 0x08, 0x04, 0x02, 0x00 },
{ 0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00 },
{ 0x00, 0x42, 0x7F, 0x40, 0x00, 0x00 },
{ 0x72, 0x49, 0x49, 0x49, 0x46, 0x00 },
{ 0x21, 0x41, 0x49, 0x4D, 0x33, 0x00 },
{ 0x18, 0x14, 0x12, 0x7F, 0x10, 0x00 },
{ 0x27, 0x45, 0x45, 0x45, 0x39, 0x00 },
{ 0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00 },
{ 0x41, 0x21, 0x11, 0x09, 0x07, 0x00 },
{ 0x36, 0x49, 0x49, 0x49, 0x36, 0x00 },
{ 0x46, 0x49, 0x49, 0x29, 0x1E, 0x00 },
{ 0x00, 0x00, 0x14, 0x00, 0x00, 0x00 },
{ 0x00, 0x40, 0x34, 0x00, 0x00, 0x00 },
{ 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 },
{ 0x14, 0x14, 0x14, 0x14, 0x14, 0x00 },
{ 0x00, 0x41, 0x22, 0x14, 0x08, 0x00 },
{ 0x02, 0x01, 0x59, 0x09, 0x06, 0x00 },
{ 0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00 },
{ 0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00 },
{ 0x7F, 0x49, 0x49, 0x49, 0x36, 0x00 },
{ 0x3E, 0x41, 0x41, 0x41, 0x22, 0x00 },
{ 0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00 },
{ 0x7F, 0x49, 0x49, 0x49, 0x41, 0x00 },
{ 0x7F, 0x09, 0x09, 0x09, 0x01, 0x00 },
{ 0x3E, 0x41, 0x41, 0x51, 0x73, 0x00 },
{ 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00 },
{ 0x00, 0x41, 0x7F, 0x41, 0x00, 0x00 },
{ 0x20, 0x40, 0x41, 0x3F, 0x01, 0x00 },
{ 0x7F, 0x08, 0x14, 0x22, 0x41, 0x00 },
{ 0x7F, 0x40, 0x40, 0x40, 0x40, 0x00 },
{ 0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x00 },
{ 0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00 },
{ 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00 },
{ 0x7F, 0x09, 0x09, 0x09, 0x06, 0x00 },
{ 0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00 },
{ 0x7F, 0x09, 0x19, 0x29, 0x46, 0x00 },
{ 0x26, 0x49, 0x49, 0x49, 0x32, 0x00 },
{ 0x03, 0x01, 0x7F, 0x01, 0x03, 0x00 },
{ 0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00 },
{ 0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00 },
{ 0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00 },
{ 0x63, 0x14, 0x08, 0x14, 0x63, 0x00 },
{ 0x03, 0x04, 0x78, 0x04, 0x03, 0x00 },
{ 0x61, 0x59, 0x49, 0x4D, 0x43, 0x00 },
{ 0x00, 0x7F, 0x41, 0x41, 0x41, 0x00 },
{ 0x02, 0x04, 0x08, 0x10, 0x20, 0x00 },
{ 0x00, 0x41, 0x41, 0x41, 0x7F, 0x00 },
{ 0x04, 0x02, 0x01, 0x02, 0x04, 0x00 },
{ 0x40, 0x40, 0x40, 0x40, 0x40, 0x00 },
{ 0x00, 0x03, 0x07, 0x08, 0x00, 0x00 },
{ 0x20, 0x54, 0x54, 0x78, 0x40, 0x00 },
{ 0x7F, 0x28, 0x44, 0x44, 0x38, 0x00 },
{ 0x38, 0x44, 0x44, 0x44, 0x28, 0x00 },
{ 0x38, 0x44, 0x44, 0x28, 0x7F, 0x00 },
{ 0x38, 0x54, 0x54, 0x54, 0x18, 0x00 },
{ 0x00, 0x08, 0x7E, 0x09, 0x02, 0x00 },
{ 0x18, 0xA4, 0xA4, 0x9C, 0x78, 0x00 },
{ 0x7F, 0x08, 0x04, 0x04, 0x78, 0x00 },
{ 0x00, 0x44, 0x7D, 0x40, 0x00, 0x00 },
{ 0x20, 0x40, 0x40, 0x3D, 0x00, 0x00 },
{ 0x7F, 0x10, 0x28, 0x44, 0x00, 0x00 },
{ 0x00, 0x41, 0x7F, 0x40, 0x00, 0x00 },
{ 0x7C, 0x04, 0x78, 0x04, 0x78, 0x00 },
{ 0x7C, 0x08, 0x04, 0x04, 0x78, 0x00 },
{ 0x38, 0x44, 0x44, 0x44, 0x38, 0x00 },
{ 0xFC, 0x18, 0x24, 0x24, 0x18, 0x00 },
{ 0x18, 0x24, 0x24, 0x18, 0xFC, 0x00 },
{ 0x7C, 0x08, 0x04, 0x04, 0x08, 0x00 },
{ 0x48, 0x54, 0x54, 0x54, 0x24, 0x00 },
{ 0x04, 0x04, 0x3F, 0x44, 0x24, 0x00 },
{ 0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00 },
{ 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00 },
{ 0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00 },
{ 0x44, 0x28, 0x10, 0x28, 0x44, 0x00 },
{ 0x4C, 0x90, 0x90, 0x90, 0x7C, 0x00 },
{ 0x44, 0x64, 0x54, 0x4C, 0x44, 0x00 },
{ 0x00, 0x08, 0x36, 0x41, 0x00, 0x00 },
{ 0x00, 0x00, 0x77, 0x00, 0x00, 0x00 },
{ 0x00, 0x41, 0x36, 0x08, 0x00, 0x00 },
{ 0x02, 0x01, 0x02, 0x04, 0x02, 0x00 },
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00 }
};
int const InitLen = 23;
unsigned char Init[InitLen] = {
  0xAE, // Display off
  0xD5, // Set display clock
  0x80, // Recommended value
  0xA8, // Set multiplex
  0x3F,
  0xD3, // Set display offset
  0x00,
  0x40, // Zero start line
  0x8D, // Charge pump
  0x14,
  0x20, // Memory mode
  0x02, // Page addressing
  0xA1, // 0xA0/0xA1 flip horizontally
  0xC8, // 0xC0/0xC8 flip vertically
  0xDA, // Set comp ins
  0x12,
  0x81, // Set contrast
  0x7F,
  0xD9, // Set pre charge
  0xF1,
  0xDB, // Set vcom detect
  0x40,
  0xA6  // Normal (0xA7=Inverse)
};
void setup() {
//  Serial.begin(9600);
  Wire.begin(D1, D2);
  InitDisplay();
DisplayStr ("Character set for text - stored in program memory\n\r");
DisplayStr ("Character set for text - stored in program memory\n\r");
DisplayStr ("Character set for text - stored in program memory\n\r");
}

void loop() {
  // put your main code here, to run repeatedly:

}
void Command(uint8_t c)
{
    Wire.beginTransmission(SSD1306_ADDRESS);
    Wire.write(0x80);//command mode
    Wire.write(c);
    Wire.endTransmission();
}

void Data(uint8_t d)
{
    Wire.beginTransmission(SSD1306_ADDRESS);
    Wire.write(0x40);//data mode
    Wire.write(d);
    Wire.endTransmission();
}
void InitDisplay () {
  for (uint8_t c=0; c<InitLen; c++) Command(Init[c]);
  Display(12);    // Clear display
  Command(0xAF);  // Display on
}
// Character terminal **********************************************

void ClearLine (uint8_t line) {
  Command(0xB0 + line);
  Command(0x00); // Column start low
  Command(0x00); // Column start high
  for (uint8_t b = 0 ; b < 128; b++) Data(0);
}

// Clears the top line, then scrolls the display up by one line
void ScrollDisplay (uint8_t *scroll) {
  ClearLine(*scroll);
  *scroll = (*scroll + 1) & 0x07;
  Command(0xD3);
  Command(*scroll << 3);
}

// Plots a character; line = 0 to 7; column = 0 to 20
void PlotChar (char c, uint8_t line, uint8_t column) {
  column = column*6;
  Command(0xB0 + (line & 0x07));
  Command(0x00 + (column & 0x0F)); // Column start low
  Command(0x10 + (column >> 4));   // Column start high
  for (uint8_t col = 0; col < 6; col++) {
    Data(pgm_read_byte(&CharMap[(c & 0x7F)-32][col]));
  }
}

// Prints a character to display, handling control characters
void Display (char c) {
  static uint8_t Line = 0, Column = 0, Scroll = 0;
  if (c >= 32) {                   // Normal character
    PlotChar(c, Line+Scroll, Column++);
    if (Column > SSD1306_COLUMN) {
      Column = 0;
      if (Line == SSD1306_LINE) ScrollDisplay(&Scroll); else Line++;
    }
  } else if (c == 12) {            // Clear display
    for (uint8_t p=0; p < 8; p++) ClearLine(p);
    Line = Scroll;
    Column = 0;
  } else if (c == 13) {            // Return
    Column = 0;
    if (Line == SSD1306_LINE) ScrollDisplay(&Scroll); else Line++;
  }
}
void DisplayStr (char *s) {
  while (*s) Display(*s++);
}

Это немного не то у меня дисплей 128х32 и библиотека есть, но в любои случае спасибо
 
Контроллер на нем SSD1306?
А в чем тогда был вопрос?
Помочь добавить в скетч вывод показаний термометра на дисплей
И кстати моя платка при компиляции ругается на библиотеку ssd1306

То что есть сейчас по мимо отображения температуры в приложении Blynk и управления реле от туда и автоматом по температуре датчиков, подключил дисплей с надписью Hello World. Еще раз простите я совсем новичёк.

Код:
#include <OLED.h> //библиотека дисплея
#include <Wire.h> //библиотека i2c
#include <ArduinoOTA.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define Relay2 2 //пин реле
boolean tr = true; //назначаем логическую переменную для однократной отправки сообщения о температуре
OLED display(4, 3);// пины дисплея

 
// персональные данные
char auth[] = "WXz5dvyH8SddpXJSdkU8sHt1Pg9xBudw"; //токен
char ssid[] = "SmartHome";  //Имя точки доступа WIFI
char pass[] = "LocalHost"; //пароль точки доступа WIFI
#define ONE_WIRE_BUS D8 // пин датчика d18b20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
BlynkTimer timer1;
float temp2; //переменная температуры
int tempConst2 = 24; //температура по умолчанию
int gistT = 1; //задаем дельту
float i; //показания датчика тока
void sendTemps(){   //проверка температуры
  sensors.requestTemperatures();
  temp2 = sensors.getTempCByIndex(0);
  Serial.println(temp2);
  Blynk.virtualWrite(V1, temp2);
   // Initialize display
  display.begin();

  // Test message
  display.print("123456");
  delay(3*1000);
    // Test display ON
  display.on();
  delay(3*1000);
}
BLYNK_WRITE(V4){    //считываем данные со слайдера
  tempConst2 = param.asInt();
}
void checktemp(){   //сравниваем заданную и текущую температуру
  if (temp2 >= tempConst2 + gistT) //если температура в норме
  {
    digitalWrite(Relay2, HIGH); //выключаем реле
    Serial.println(tempConst2);
    if (tr == true)
    {
      Blynk.email("*****@etlgr.com", "Температура в норме", " ");
      Serial.println("_HIGH_");
      tr = false; //присваиваем переменной обратное значение чтобы сообщение больше не отправлялось
    }
  }
  else if (temp2 <= tempConst2 - gistT) // если температура нниже
  {
    digitalWrite(Relay2, LOW); //включаем реле
    Serial.println(tempConst2);
    if (tr == false) // проверяем логическую переменную
    {
      Blynk.email("*****@etlgr.com", "Низкая температура", " ");
      Serial.println("_LOW_");
      tr = true; //меняем значение переменной чтобы больше не отправлялось сообщение
    }
  }
}

void setup(){       //настройки
  pinMode(Relay2, OUTPUT);        // пин реле выход
  Serial.begin(9600);             // скорость сериал порта
  Blynk.begin(auth, ssid, pass);  //старт блинка
  Blynk.syncAll();                // синхронизация блинка
  sensors.begin();                // старт датчика температуры
  ArduinoOTA.begin();             // старт обновления по воздуху
  // Таймеры на запуск функций
  timer1.setInterval(3000L, sendTemps); //опрос d18b20
  timer1.setInterval(3000L, checktemp); //сравнение текущей температуры с заданой
}

void loop(){
  ArduinoOTA.handle();
  Blynk.run();
  timer1.run();
}
 

alexlaw

Member
Код:
#define BUF_SIZE  255

float temp = 3.141;
String temp_str =(String)(temp);
char temp_char[BUF_SIZE ];
temp_str.toCharArray(temp_char, BUF_SIZE );
display.print(temp_char);
Попробуйте так.
 

alexlaw

Member
Помочь добавить в скетч вывод показаний термометра на дисплей
Установил вашу библиотеку.
#include "OLED.h"
Попробовал. У меня работает.
Код:
float temp = -23.141;
String temp_str =(String)(temp);
temp_str = "Temp=" + temp_str + "*C";
char temp_char[temp_str.length() +  1];
temp_str.toCharArray(temp_char, temp_str.length() +  1);
display.print(temp_char);
Пример.png
 

esp340

Active member
Во-первых,
Код:
display.begin();
перенесите в Setup
во-вторых, я бы взял другую библиотеку. Эту попробовал - в дополнение нужен еще и микроскоп чтобы что-то рассмотреть на дисплее 0,91
 
Во-первых,
Код:
display.begin();
перенесите в Setup
во-вторых, я бы взял другую библиотеку. Эту попробовал - в дополнение нужен еще и микроскоп чтобы что-то рассмотреть на дисплее 0,91
Какую например? Я в этом деле НУБ, пробовал несколько но при компиляции только эту схавало из того что находил.
 
Где вы взяли столько портов ввода|вывода у ESP для 8 реле, датчика, да ещё экрана?
У меня вот эта WeMos - подключение, распиновка и программирование D1 R2 и Mini плата на базе esp8266 12e, к ней и подключен блок реле, один датчик ds18b20 и дисплей по i2c
 

Сергей_Ф

Moderator
Команда форума
к ней и подключен блок реле, один датчик ds18b20 и дисплей по i2c
я и спрашиваю, как вы умудрились подключить? Схему дайте плз. Там только на реле надо 8 пинов + 1 на датчик. На i2c уже не остаётся, даже если использовать частично задействованые при загрузки пины.
 

esp340

Active member
показания на индикаторе с библиотекой OLED:
oled1.png
с использованием библиотеки OLED_I2C:
oled2.png
 
Доброго времени суток, долго не отвечал приношу извинения, все верно сейчас на все реле пинов и вправду не хватает, но это не критично так как и раньше использовалось только 5 реле, одно на обогреватель и 4 на свет, просто сейчас решил добавить дисплей для визуализации температуры. Библиотеку поменял и решил использовать Adafruit ssd1306
 
Всем большое спасибо за участие, вопрос решен скетч прикладываю, хотя возможно в чем нибуть поправите.

Код:
#include <Adafruit_GFX.h> //библиотеки дисплея
#include <Adafruit_SSD1306.h> //пбиблиотеки дисплея
#include <SPI.h>
#include <Wire.h>

#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define Relay2 2 //пин реле
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
#define OLED_RESET     3 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(OLED_RESET);


boolean tr = true; //назначаем логическую переменную для однократной отправки сообщения о температуре

// персональные данные
char auth[] = "Blynk token"; //токен
char ssid[] = "Home";  //Имя точки доступа WIFI
char pass[] = "Pass"; //пароль точки доступа WIFI
#define ONE_WIRE_BUS D8 // пин датчика d18b20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
BlynkTimer timer1;
float temp2; //переменная температуры
int tempConst2 = 24; //температура по умолчанию
int gistT = 1; //задаем дельту
void sendTemps(){   //проверка температуры
  sensors.requestTemperatures();
  temp2 = sensors.getTempCByIndex(0);
  Serial.println(temp2);
  Blynk.virtualWrite(V1, temp2);

}
BLYNK_WRITE(V4){    //считываем данные со слайдера
  tempConst2 = param.asInt();
}
void checktemp(){   //сравниваем заданную и текущую температуру
  if (temp2 >= tempConst2 + gistT) //если температура в норме
  {
    digitalWrite(Relay2, HIGH); //выключаем реле
    Serial.println(tempConst2);
    if (tr == true)
    {
      Blynk.email("*****@etlgr.com", "Температура в норме", " ");
      Serial.println("_HIGH_");
      tr = false; //присваиваем переменной обратное значение чтобы сообщение больше не отправлялось
    }
  }
  else if (temp2 <= tempConst2 - gistT) // если температура нниже
  {
    digitalWrite(Relay2, LOW); //включаем реле
    Serial.println(tempConst2);
    if (tr == false) // проверяем логическую переменную
    {
      Blynk.email("*****@etlgr.com", "Низкая температура", " ");
      Serial.println("_LOW_");
      tr = true; //меняем значение переменной чтобы больше не отправлялось сообщение
    }
  }
}
void setup(){       //настройки
  pinMode(Relay2, OUTPUT);        // пин реле выход
  Serial.begin(9600);             // скорость сериал порта
  Blynk.begin(auth, ssid, pass);  //старт блинка
  Blynk.syncAll();                // синхронизация блинка
  sensors.begin();                // старт датчика температуры

display.begin(SSD1306_SWITCHCAPVCC, 0x3C);   // инициализируем объект «display» с I2C-адресом «0x3C», для 128x32
display.clearDisplay();

  // Таймеры на запуск функций
  timer1.setInterval(3000L, sendTemps); //опрос d18b20
  timer1.setInterval(3000L, checktemp); //сравнение текущей температуры с заданой
}


void loop(){

display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(10,5);

 
String temp_str =(String)(temp2);
temp_str =temp_str + "C";
char temp_char[temp_str.length() +  1];
temp_str.toCharArray(temp_char, temp_str.length() +  1);
display.print(temp_char);
display.display();
display.clearDisplay();


  Blynk.run();
  timer1.run();
}
S91205-211255.jpg P91205-211240.jpg
 

esp340

Active member
Строки
Код:
String temp_str =(String)(temp2);
temp_str =temp_str + "C";
char temp_char[temp_str.length() +  1];
temp_str.toCharArray(temp_char, temp_str.length() +  1);
достаточно заменить на
Код:
display.print(temp2);
display.print("C");
 
Строки
Код:
String temp_str =(String)(temp2);
temp_str =temp_str + "C";
char temp_char[temp_str.length() +  1];
temp_str.toCharArray(temp_char, temp_str.length() +  1);
достаточно заменить на
Код:
display.print(temp2);
display.print("C");
А не подскажите как точность показаний понизить до десятых градуса, а не сотых
 
Сверху Снизу