• Система автоматизации с открытым исходным кодом на базе 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");
А не подскажите как точность показаний понизить до десятых градуса, а не сотых
 
Сверху Снизу