Помогите новичку с адаптацией скетча под OLED 1.3" SH1106 с подключением SPI

eoneforever
Offline
Зарегистрирован: 07.02.2017

Здравствуйте уважаемые форумчане. Вот хочу в свою приборку установить oled дисплей, что б на него вывести часы, календарь, два датчика температуры и вольтметр... Скетч скачал с сайта. Человек себе сделал, но под индикатор 16х2. Я пытаюсь его скетч переделать под свой дисплей, но ничего не получается((( Знаний не хватает. Читаю литературу, но большая часть теории мне не понятна... не кому объяснить на пальцах... Дисплей удалось запустить только по SPI. Библиотеки скачал. Сделал только вывод часов и даты...Но с другого скетча. Далее у меня ступор... Ниже скину скетч под 16х2 и ту попытку, что я пробовал... Может кто переделает или хотябы укажет на мои ошибки.

P.S. С программированием дел не имел, но очень интересно сделать самому.

Надеюсь на знающих людей. Только прозьба не отправлять курить букварь, а реально объяснить что я делаю не так!

Ссылка на страницк автора https://www.drive2.ru/l/8890252/

#include <DallasTemperature.h>
#include <OneWire.h>
#include <Wire.h>
#include <LiquidCrystalRus.h>
#include <DS1307RTC.h>

#define ONE_WIRE_BUS 10

LiquidCrystalRus lcd(12, 11, 5, 4, 3, 2); // подключаем монитор
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

const char *days[7] = { "Вск", "Пон", "Втр", "Срд", "Чтв", "Птн", "Сбт" };
byte akk[8] = //icon for akkum 
{
    B00000,
    B00000,
    B00000,
    B00000,
    B01010,
    B11111,
    B10001,
    B11111,
};
byte grad[8] = //icon for gradus
{
    B00100,
    B01010,
    B00100,
    B00000,
    B00000,
    B00000,
    B00000,
    B00000,
};
int analogInput = 0;
float vout = 0.0;
float vin = 0.0;
float R1 = 100000.0; // resistance of R1 (100K) 
float R2 = 10000.0; // resistance of R2 (10K)
int value = 0;
// добавление нолика к часам/минутам/дате..., если там одна цифра
void print2digits(int number) {
  if (number >= 0 && number < 10) {
    lcd.print('0');
  }
  lcd.print(number);
}

void setup() {
      Wire.begin();
      sensors.begin();
      lcd.begin(16, 2);      
  lcd.setCursor(5,0);
  lcd.print("FIAT");
  delay(1000);
  lcd.setCursor(0 ,1);
  lcd.print(" Palio Weekend ");
  delay(3000);
  lcd.clear();
  lcd.createChar(1,akk);
  lcd.createChar(2,grad);
  pinMode(analogInput, INPUT);

}

void loop() {
  tmElements_t tm;
  RTC.read(tm);

  sensors.requestTemperatures();
   
    lcd.setCursor(4,0);
    print2digits(tm.Hour);
    lcd.print(":");
    print2digits(tm.Minute);
    lcd.print(":");
    print2digits(tm.Second);
    delay (100);

    if (int (tm.Second) < 15){
     lcd.setCursor(0, 1);
     lcd.print(days[tm.Wday]);
     lcd.print(" ");
     print2digits(tm.Day);
     lcd.print(".");
     print2digits(tm.Month);
     lcd.print(".");
     lcd.print(tmYearToCalendar(tm.Year));
     lcd.print("  ");
          }
     
      if (int (tm.Second)>=16 && int (tm.Second)<=30){
     lcd.setCursor(0, 1);
     lcd.print(" САЛОН  ");
     lcd.print(sensors.getTempCByIndex(1));
     lcd.write(2);
     lcd.print("C    ");
     }

   if (int (tm.Second)>=31 && int (tm.Second)<=45){
     lcd.setCursor(0, 1);
     lcd.print(" УЛИЦА  ");
     lcd.print(sensors.getTempCByIndex(0));
     lcd.write(2);
     lcd.print("C    ");
     }
   if (int (tm.Second)>=46 && int (tm.Second)<=59){

    {value = analogRead(analogInput);
  vout = (value * 4.9) / 1024.0; // see text
  vin = vout / (R2/(R1+R2)); 
   if (vin<0.09) {
  vin=0.0;//statement to quash undesired reading 
  } 
     lcd.setCursor(0, 1);
     lcd.print(" заряд ");
     lcd.write(1);
    lcd.print(vin);
     lcd.print(" В      ");}
  }
}

а это то что я пытался сделать

 

 

#include <DallasTemperature.h>
#include <OneWire.h>
#include <Wire.h>
#include <LiquidCrystalRus.h>
#include <Adafruit_SH1106.h>

// If using software SPI (the default case):
#define OLED_MOSI   9
#define OLED_CLK   10
#define OLED_DC    11
#define OLED_CS    12
#define OLED_RESET 13
Adafruit_SH1106 display(10, 9, 12, 11, 13); // SW SPI Com: SCK = 10, MOSI = 9, CS = 12, A0 = 11, RESET = 13 ;




const char *days[7] = { "Вск", "Пон", "Втр", "Срд", "Чтв", "Птн", "Сбт" };
byte akk[8] = //icon for akkum 
{
    B00000,
    B00000,
    B00000,
    B00000,
    B01010,
    B11111,
    B10001,
    B11111,
};
byte grad[8] = //icon for gradus
{
    B00100,
    B01010,
    B00100,
    B00000,
    B00000,
    B00000,
    B00000,
    B00000,
};
int analogInput = 0;
float vout = 0.0;
float vin = 0.0;
float R1 = 100000.0; // resistance of R1 (100K) 
float R2 = 10000.0; // resistance of R2 (10K)
int value = 0;
// добавление нолика к часам/минутам/дате..., если там одна цифра
void print2digits(int number) {
  if (number >= 0 && number < 10) {
   Adafruit_SH1106.print('0');
  }
  Adafruit_SH1106.print(number);
}

void setup() {
      Wire.begin();
      sensors.begin();
      Adafruit_SH1106.begin(16, 2);      
  Adafruit_SH1106.setCursor(5,0);
  Adafruit_SH1106.print("FIAT");
  delay(1000);
  Adafruit_SH1106.setCursor(0 ,1);
  Adafruit_SH1106.print(" Palio Weekend ");
  delay(3000);
  Adafruit_SH1106.clear();
  Adafruit_SH1106.createChar(1,akk);
  Adafruit_SH1106.createChar(2,grad);
  pinMode(analogInput, INPUT);

}

void loop() {
  
  

  sensors.requestTemperatures();
   
    Adafruit_SH1106.setCursor(4,0);
    print2digits(tm.Hour);
    Adafruit_SH1106.print(":");
    print2digits(tm.Minute);
    Adafruit_SH1106.print(":");
    print2digits(tm.Second);
    delay (100);

    if (int (tm.Second) < 15){
     Adafruit_SH1106.setCursor(0, 1);
     Adafruit_SH1106.print(days[tm.Wday]);
     Adafruit_SH1106.print(" ");
     print2digits(tm.Day);
     Adafruit_SH1106.print(".");
     print2digits(tm.Month);
     Adafruit_SH1106.print(".");
     Adafruit_SH1106.print("  ");
          }
     
      if (int (tm.Second)>=16 && int (tm.Second)<=30){
     Adafruit_SH1106.setCursor(0, 1);
    Adafruit_SH1106.print(" salon  ");
     Adafruit_SH1106.print(sensors.getTempCByIndex(1));
     Adafruit_SH1106.write(2);
     Adafruit_SH1106.print("C    ");
     }

   if (int (tm.Second)>=31 && int (tm.Second)<=45){
     Adafruit_SH1106.setCursor(0, 1);
     Adafruit_SH1106.print(" ulica  ");
     Adafruit_SH1106.print(sensors.getTempCByIndex(0));
     Adafruit_SH1106.write(2);
     Adafruit_SH1106.print("C    ");
     }
   if (int (tm.Second)>=46 && int (tm.Second)<=59){

    {value = analogRead(analogInput);
  vout = (value * 4.9) / 1024.0; // see text
  vin = vout / (R2/(R1+R2)); 
   if (vin<0.09) {
  vin=0.0;//statement to quash undesired reading 
  } 
     Adafruit_SH1106.setCursor(0, 1);
     Adafruit_SH1106.print(" volt ");
     Adafruit_SH1106.write(1);
   Adafruit_SH1106.print(vin);
     Adafruit_SH1106.print(" V ");
  }
}

 

Logik
Offline
Зарегистрирован: 05.08.2014

Проблема у Вас не с дисплеем а с програмированием. Здесь не получится некурить букварь. Представте что Вы на форуме летчиков попросите обяснить как долететь в какой город, совершенно не умея управлять самолетом. Вот и здесь аналогично. Сразу почитайте по Си книгу, поморгайте светодиодами, разберите чужие проекты и т.д.

eoneforever
Offline
Зарегистрирован: 07.02.2017

Светодиодом моргал. Другие работы просматривал. И даже переделал скетч с часами для своего олед дисплея. Но вот с переделкой с 16х2 на олед ничего не пойму. Вот и обратился за помощью. Я не прошу мне переделать, а лишь указать на ошибки и может сказать конкретно про что именно (касающегося моего проэкта) нужно изучить.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

eoneforever, Вам же конкретно сказали: прежде всего нужно изучить язык программирования. Пока это не сделано, дальше говорить не о чем.

Когда изучите, можно будет переходить к следующему шагу: сформулировать задачу. Ваше "переделать под свой дисплей" - это ни о чем. Нужно четко сформулировать:

1. Чего Вы хотите добиться.

2. Как Вы это делаете.

3. Что из этого получается.

4. Чем 3 отличается от 1.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

eoneforever пишет:
Только прозьба не отправлять курить букварь, а реально объяснить что я делаю не так

Реально объясняю.

Вы делаете не так две вещи:

1. Не курите букварь
2. Просите других не отправлять Вас его курить.

Вообще у любого человека есть два пути: сделать самому или купить сделанное другими. Если выбрано первое - надо научиться делать самому. А как у Вас "ни хрена не умею, но хочу сделать сам" - так не бывает.

Начинайте "курить букварь". Примерно через месяц начнёте что-то понимать, а ещё через месяц сделаете эту задачу.

eoneforever
Offline
Зарегистрирован: 07.02.2017

Доброго времени суток. Букварь курю уже дня три... Голова закипает))) Подскажите пожалуйста, по какой причине цифры показывающие темперетуру на дисплее с огромными тормозами меняются (притормаживает переход из одной цифры в другую)? А когда подключаю часы реального времени(отдельно заливаю скетч) дисплей показывает четко...

Вот скетч отображения температуры. Понимаю, в нём наверное слишком много лишнего, но я только учусь общению с ардуино

#include <OneWire.h>                           // Подключаем библиотеку для взаимодействия с устройствами, работающими на шине и по протоколу 1-Wire
#include <DallasTemperature.h>                // Подключаем библиотеку с функциями для работы с DS18B20 (запросы, считывание и преобразование возвращаемых данных)
#include <U8glib.h>                           // Подключаем библиотеку OLED_I2C для работы со шрифтами и графикой
U8GLIB_SH1106_128X64 u8g(10, 9, 12, 11, 13);  // SW SPI Com: SCK = 10, MOSI = 9, CS = 12, A0 = 11, RESET = 13 

#define OLED_MOSI   9
#define OLED_CLK   10
#define OLED_DC    11
#define OLED_CS    12
#define OLED_RESET 13
#define ONE_WIRE_BUS 8                // Указываем пин подключения data-вывода датчика температуры
#define term_power 4                  // Указываем пин подключения питания датчика температуры

OneWire oneWire(ONE_WIRE_BUS);        // Сообщаем библиотеке об устройстве, работающем по протоколу 1-Wire
DallasTemperature sensors(&oneWire);  // Связываем функции библиотеки DallasTemperature с нашим 1-Wire устройством (DS18B20)

extern uint8_t osb21[];               // Подключаем шрифт

void draw(void) {

  u8g.setFont(u8g_font_osb21);
  u8g.setPrintPos(45, 40);
  u8g.println(temperature(),1);  
}

void setup(void)
{
  u8g.begin();                        // Инициализируем библиотеку u8glib spi
  pinMode(term_power, OUTPUT);        // Определяем пин подключения питания датчика температуры
}


  float temperature() {                          // Измеряем температуру 10 секунд
  digitalWrite(term_power, HIGH);                // Включаем питание датчика температуры
  delay(100);                                    // Задержка перед первым измерением 
  sensors.requestTemperatures();                 // Запрос на измерение температуры (1-й ошибочный)
  delay(500);                                    // Задержка перед поторным измерением
  sensors.requestTemperatures();                 // Запрос на измерение температуры (повторный)
  float t = float(sensors.getTempCByIndex(0));   // Получаем значение температуры
  digitalWrite(term_power, LOW);                 // Отключаем питание датчика температуры
  delay(3400);                                   // Задержка, чтобы датчик не нагревался от частых измерений
  return(t);                                     // Возвращаем значение температуры в место вызова функции
}

void loop(void) {
 u8g.println(temperature(),1);                          
  u8g.firstPage(); 
  do {
    draw();
  } while( u8g.nextPage() );
}

 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Маленькая подсказка:
Первое измерение  - оно отнюдь не ошибочное. (36 строка).
Датчик возвращает 85 градусов чтобы было сразу видно что он исправен.
 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

eoneforever пишет:
Букварь курю уже дня три...

А ты думал, что когда тебе писали

ЕвгенийП пишет:

Примерно через месяц начнёте что-то понимать, а ещё через месяц сделаете эту задачу.

это шутка была?

Нет, дорогой, не шутка. Работай дальше!

b707
Offline
Зарегистрирован: 26.05.2017

eoneforever пишет:

 Подскажите пожалуйста, по какой причине цифры показывающие темперетуру на дисплее с огромными тормозами меняются (притормаживает переход из одной цифры в другую)?

Это неудивительно. У вас прямо в момент вывода цифр на дисплей выполняется функция temperature(). а в ней в строках 35. 37 и 41 - три задержки общей длительностью аж 4 секунды.

Тут прямо каскад ошибок.

Во-первых, температуру лучше мерить заранее, а не в момент вывода на экран.

Во-вторых - в процедуре измерения температуры не нужны такие огромные задержки.

В-третьих, температуру совершенно незачем мерить непрерывно, достаточно это делать раз в 1-10 минут. температура не так часто меняется.

 

В общем, у вас в скетче целый букет, характерный для новичка. Главная проблема - вы не умеете пользоваться функциями времени. Почитайте заметку "блинк без делей" в букваре...

eoneforever
Offline
Зарегистрирован: 07.02.2017

т.е мне нужно убрать повторный запрос?

b707
Offline
Зарегистрирован: 26.05.2017

eoneforever пишет:

т.е мне нужно убрать повторный запрос?

лучше убрать запрос температуры из draw() вообще. Делайте это в loop()

eoneforever
Offline
Зарегистрирован: 07.02.2017

Спасибо большое за наводку, буду изучать!