Помогите новичку с адаптацией скетча под OLED 1.3" SH1106 с подключением SPI
- Войдите на сайт для отправки комментариев
Здравствуйте уважаемые форумчане. Вот хочу в свою приборку установить 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 "); } }
Проблема у Вас не с дисплеем а с програмированием. Здесь не получится некурить букварь. Представте что Вы на форуме летчиков попросите обяснить как долететь в какой город, совершенно не умея управлять самолетом. Вот и здесь аналогично. Сразу почитайте по Си книгу, поморгайте светодиодами, разберите чужие проекты и т.д.
Светодиодом моргал. Другие работы просматривал. И даже переделал скетч с часами для своего олед дисплея. Но вот с переделкой с 16х2 на олед ничего не пойму. Вот и обратился за помощью. Я не прошу мне переделать, а лишь указать на ошибки и может сказать конкретно про что именно (касающегося моего проэкта) нужно изучить.
eoneforever, Вам же конкретно сказали: прежде всего нужно изучить язык программирования. Пока это не сделано, дальше говорить не о чем.
Когда изучите, можно будет переходить к следующему шагу: сформулировать задачу. Ваше "переделать под свой дисплей" - это ни о чем. Нужно четко сформулировать:
1. Чего Вы хотите добиться.
2. Как Вы это делаете.
3. Что из этого получается.
4. Чем 3 отличается от 1.
Реально объясняю.
Вы делаете не так две вещи:
1. Не курите букварь
2. Просите других не отправлять Вас его курить.
Вообще у любого человека есть два пути: сделать самому или купить сделанное другими. Если выбрано первое - надо научиться делать самому. А как у Вас "ни хрена не умею, но хочу сделать сам" - так не бывает.
Начинайте "курить букварь". Примерно через месяц начнёте что-то понимать, а ещё через месяц сделаете эту задачу.
Доброго времени суток. Букварь курю уже дня три... Голова закипает))) Подскажите пожалуйста, по какой причине цифры показывающие темперетуру на дисплее с огромными тормозами меняются (притормаживает переход из одной цифры в другую)? А когда подключаю часы реального времени(отдельно заливаю скетч) дисплей показывает четко...
Вот скетч отображения температуры. Понимаю, в нём наверное слишком много лишнего, но я только учусь общению с ардуино
Маленькая подсказка:
Первое измерение - оно отнюдь не ошибочное. (36 строка).
Датчик возвращает 85 градусов чтобы было сразу видно что он исправен.
А ты думал, что когда тебе писали
Примерно через месяц начнёте что-то понимать, а ещё через месяц сделаете эту задачу.
это шутка была?
Нет, дорогой, не шутка. Работай дальше!
Подскажите пожалуйста, по какой причине цифры показывающие темперетуру на дисплее с огромными тормозами меняются (притормаживает переход из одной цифры в другую)?
Это неудивительно. У вас прямо в момент вывода цифр на дисплей выполняется функция temperature(). а в ней в строках 35. 37 и 41 - три задержки общей длительностью аж 4 секунды.
Тут прямо каскад ошибок.
Во-первых, температуру лучше мерить заранее, а не в момент вывода на экран.
Во-вторых - в процедуре измерения температуры не нужны такие огромные задержки.
В-третьих, температуру совершенно незачем мерить непрерывно, достаточно это делать раз в 1-10 минут. температура не так часто меняется.
В общем, у вас в скетче целый букет, характерный для новичка. Главная проблема - вы не умеете пользоваться функциями времени. Почитайте заметку "блинк без делей" в букваре...
т.е мне нужно убрать повторный запрос?
т.е мне нужно убрать повторный запрос?
лучше убрать запрос температуры из draw() вообще. Делайте это в loop()
Спасибо большое за наводку, буду изучать!