Нужна помощь OLED часы-погодная станция.
- Войдите на сайт для отправки комментариев
Вс, 04/03/2018 - 17:18
Здравствуйте, столкнулся с проблемой, собрал OLED часы на arduino nano с показанием температуры и влажности. Но возникла проблема с отображением отрицательной температуры (датчик температуры 18b20, датчик влажности DHT 11) искал на просторах интернета толком не нашел ничего. Если изменить шрифт с MegaNumbers на BigNumbers то отображает отрицательную температуру, но не сильно красиво получаеться. Библиотека для Oled I2C UKR_RUS. Если кто то знает в какую сторону копать, буду очень благодарен!
#include <dht11.h>
dht11 sensor;
#define DHT11PIN A2
#include <OLED_I2C.h>
//SDA pin -> Arduino A4 или иной назначенный SDA pin
//SCL pin -> Arduino A5 или иной назначенный SCL pin
OLED myOLED(A4, A5, 8); //пины OLED: SDA на A4, SCK на A5 Arduino
extern uint8_t MegaNumbers[];//Установка шрифтов Больших
extern uint8_t RusFont[];// Установка русских шрифтов
extern uint8_t SmallFont[];// Установка малых шрифтов
extern uint8_t term[];//картинка термометра
extern uint8_t grad[];//картинка градуса
extern uint8_t water[];//картинка флажности
extern uint8_t percentage[];//картинка процента
#include <OneWire.h>//подключение библиотеки однопроводного интерфейса
OneWire ds(A3); // пин сенсора датчика температуры (средняя ножка) DS18b20 к пину A1 Arduino. Не забываем этот пин сенсора подтянуть к 3,3V сопротивлением!
#include <DS1307.h>//подключение библиотеки часового модуля
DS1307 rtc(A0, A1);//часовой модуль подключен к пинам Arduino: Vcc к +5V, GND к 3емле, SDA к A3, SCL к A2
Time t; // присвоение переменной для времени
int x = 0;
int y = 0; //добавка
void setup() {
myOLED.begin();
rtc.halt(false);
//rtc.setDOW(SUNDAY); // Настройка для недели настроить при первом
//rtc.setTime(14, 57, 0); // Настройка часов
//rtc.setDate(04, 03, 2018); // Настройка даты
}
void loop() {
sensor.read(A2); // Пин сенсора на Ардуино подключать только на цифровые выходы
if (x >= 10) { // 10 количество секунд, для переключения на температуру
temp();
delay(4000); //добавка
water_proc(); // добавка
delay(8000); //добавка
x=0;
}
else
{
watch();
}
x++;
}
void watch() {
myOLED.setFont(RusFont);
t = rtc.getTime();
switch (t.dow)
{
case 1: myOLED.print("GJYTLTKMYBR", CENTER, 0); break;
case 2: myOLED.print("DNJHYBR", CENTER, 0); break;
case 3: myOLED.print("CHTLF", CENTER, 0); break;
case 4: myOLED.print("XTNDTHU", CENTER, 0); break;
case 5: myOLED.print("GZNYBWF", CENTER, 0); break;
case 6: myOLED.print("CE<<JNF", CENTER, 0); break;
case 7: myOLED.print("DJCRHTCTYMT", CENTER, 0); break;
}
String stringOne = rtc.getTimeStr();
myOLED.setFont(MegaNumbers);
myOLED.print(stringOne.substring(0, 2), 4, 15);
myOLED.print("/", 51, 12);
myOLED.print(stringOne.substring(3, 5), 75, 15);
myOLED.setFont(RusFont);
switch (t.mon)
{
case 1:
myOLED.print(String(t.date), 30, 57);
myOLED.print("ZYDFHZ", CENTER, 57);
myOLED.print(String(t.year), 88, 57);
break;
case 2:
myOLED.print(String(t.date), 26, 57);
myOLED.print("ATDHFKZ", CENTER, 57);
myOLED.print(String(t.year), 92, 57);
break;
case 3:
myOLED.print(String(t.date), 30, 57);
myOLED.print("VFHNF", CENTER, 57);
myOLED.print(String(t.year), 88, 57);
break;
case 4:
myOLED.print(String(t.date), 30, 57);
myOLED.print("FGHTKZ", CENTER, 57);
myOLED.print(String(t.year), 88, 57);
break;
case 5:
myOLED.print(String(t.date), 36, 57);
myOLED.print("VFZ", CENTER, 57);
myOLED.print(String(t.year), 82, 57);
break;
case 6:
myOLED.print(String(t.date), 35, 57);
myOLED.print("B>YZ", CENTER, 57);
myOLED.print(String(t.year), 81, 57);
break;
case 7:
myOLED.print(String(t.date), 35, 57);
myOLED.print("B>KZ", CENTER, 57);
myOLED.print(String(t.year), 81, 57);
break;
case 8:
myOLED.print(String(t.date), 28, 57);
myOLED.print("FDUECNF", CENTER, 57);
myOLED.print(String(t.year), 90, 57);
break;
case 9:
myOLED.print(String(t.date), 24, 57);
myOLED.print("CTYNZ<HZ", CENTER, 57);
myOLED.print(String(t.year), 94, 57);
break;
case 10:
myOLED.print(String(t.date), 26, 57);
myOLED.print("JRNZ<HZ", CENTER, 57);
myOLED.print(String(t.year), 92, 57);
break;
case 11:
myOLED.print(String(t.date), 28, 57);
myOLED.print("YJZ<HZ", CENTER, 57);
myOLED.print(String(t.year), 90, 57);
break;
case 12:
myOLED.print(String(t.date), 26, 57);
myOLED.print("LTRF<HZ", CENTER, 57);
myOLED.print(String(t.year), 92, 57);
break;
}
myOLED.update();
delay(450);
myOLED.setFont(MegaNumbers);
myOLED.print("-", 51, 15);
myOLED.update();
delay(450);
}
void temp() {
for(int x = 0; x < 10; x++){
byte data[2];
ds.reset();
ds.write(0xCC);
ds.write(0x44);
delay(500);
ds.reset();
ds.write(0xCC);
ds.write(0xBE);
data[0] = ds.read();
data[1] = ds.read();
int Temp = (data[1] << 8) + data[0];
Temp = Temp >> 4;
String stringOne = rtc.getTimeStr();
myOLED.clrScr();
myOLED.setFont(SmallFont);
myOLED.print(stringOne.substring(0, 5), 98, 0);
myOLED.print(rtc.getDateStr(), 0, 0);
myOLED.setFont(RusFont);
myOLED.print("NTVGTHFNEHF", CENTER, 57); //Температура
myOLED.drawBitmap(4, 18, term, 19, 40);
myOLED.setFont(MegaNumbers);
myOLED.print(String(Temp), CENTER, 15);
myOLED.drawBitmap(92, 18, grad, 13, 12);
myOLED.update();
myOLED.clrScr();
// Serial.println(sensor.temperature,1);
}
}
void water_proc() {
for(int y = 0; y < 20; y++)
{
String stringOne = rtc.getTimeStr();
myOLED.clrScr();
myOLED.setFont(SmallFont);
myOLED.print(stringOne.substring(0, 5), 98, 0);
myOLED.print(rtc.getDateStr(), 0, 0);
myOLED.setFont(RusFont);
myOLED.print("DKF:YJCNM", CENTER, 57); // Влажность
myOLED.drawBitmap(4, 18, water, 20, 40);
myOLED.setFont(MegaNumbers);
myOLED.print(String(sensor.humidity), CENTER, 15);
myOLED.drawBitmap(90, 18, percentage, 35, 35);
myOLED.update();
myOLED.clrScr();
// Serial.println(sensor.humidity,1);
}
}
Радикальное решение проблемы - поставить рядом нагреватель, чтобы температура не опускалась ниже нуля.
Код, естественно, не смотрел.
И никто не будет смотреть неправильно вставленный код.
Судя по словесному описанию, в фонте отсутствует символ "-". Либо дополняйте, либо пользуйтесь библиотекой, где он есть.
В комментариях к коду бардак.
Вставьте код правильно (иначе его только мазохисты читать будут) и дайте фото - что показывается вместо - с большим шрифтом.
С большим шрифтом ничего не показывает при минусовой температуре, только цифры сьезжают вправо, как буд то пробел стоит там
Фото выложить в лом?
Значит нет там в шрифте минуса, а на его месте пробел. Полезьте и добавьте минус.
Изменить нужно в файле DefaultFonts.c я вас правильно понял, не сильно еще разбираюсь. Открываю этот файл через блокнот и там где fontdatatype fontdatatyp MegaNumbers[] PROGMEM =
0x18,0x28,0x2D,0x0D,
есть строка где ничего не стоит, я ставлю -, по новой заливаю скетч не меняеться ничего, наверно не там меняю?
Похоже, у Вас левая библиотека (и почему новички никогда не дают ссылок - всё вытягивать клещами надо!)
Возьмите вот эту (там есть ссылка "Download ZIP") , в ней вроде уже есть.
Увы не помогло, в ней нет шрифта MegaNumbers цифры получаются мелкие. А можно самому добавить знак минус?
есть строка где ничего не стоит, я ставлю -, по новой заливаю скетч не меняеться ничего, наверно не там меняю?
меняете в правильном месте, только надо не "минус" добавлять в конце строки - а всю строку из шестнадцитиричных символов пересчитывать так, чтобы на экране рисовался символ минуса Сделать это можно вручную, если разобраться с системой кодирования символов
Увы не помогло, в ней нет шрифта MegaNumbers цифры получаются мелкие. А можно самому добавить знак минус?
Можно, конечно, только ... Вы моего намёка не поняли?
(и почему новички никогда не дают ссылок - всё вытягивать клещами надо!)
Вот как мне прикажете угадывать что, как и куда добавить?
Я вас понял))
http://data-ru.ru/forum/download/file.php?id=9
Скачивал библиотеку от сюда, в ней русские, украинские шрифты, думал она битая искал в интернете такие же, то же самое стоит пробел.
От библиотеки это не зависит, просто в этом шоифте нет символа минуса. Либо рисуйте сами, либо просите кого-то, чтоб нарисовал.
Вы не знаете где можно посмотреть как это сделать?
От библиотеки это не зависит
Ну, как, он же спросил в какое место его всунуть и как рислвать - а это как раз зависит от библиотеки. Вот, приду домой, посмотрю что там за библиотека, и, если разберусь чего там куда пихать, отпишусь.
Ну, как, он же спросил в какое место его всунуть и как рислвать - а это как раз зависит от библиотеки. Вот, приду домой, посмотрю что там за библиотека, и, если разберусь чего там куда пихать, отпишусь.
Мы может говорим об одном и том же, но, ИМХО, это зависит не от библиотеки, а а формата фонта. Этот фонт входит в состав нескольких библиотек.
http://arduino.ru/forum/proekty/binfontstool-redaktor-shriftov-adafruitg...
Пробовал менять, в строчке где пробел стоит в место нулей ставил буквы из примера который скинули, ничего на экране сразу абра кадабра получаеться)
Погодите, завтра я доберусь до ней. Сегодня не получилось.
Anton95
я вам ссылку дал на редактор в котором ваш вопрос решается за две минуты. откройте в нем ваш файл со шрифтами установив чтение "fontdatatype" как OLED_I2C. дорисуйте необходимые символы или загрузите их из другого шрифта и сохраните полученный шрифт как OLED_I2C. можно сохранить в исходный файл с заменой шрифта. поэкспериментируйте. нужен только эксель.
PS будет здорово если вы попробуете посоздавать шрифты для OLED_I2C разной высоты - больше 8 и не кратно 8. сам эту библиотеку не использовал, есть сомнения относительно шрифтов с такими размерами.
Антон, я разобрался в этом шрифте.
Он там сделан нестандартно (не как все), т.к. он огромный и его нестандартность позволяет сэкономить место в памяти.
Чтобы мне не расписывать все варианты, а их великое множество, ответьте на вопросы:
1. В Вашем шрифте сейчас есть 10 цифр, пробел, точка и двоеточие (двоеточие печатается если попытаться печатать символ '/'). Вам все эти символы нужны? Или можно минус вместо какого-то из них вставить?
2. Заинтересованы ли Вы в корректной работе функций printNumI и printNumF (сейчас они не печатают отрицательные числа, но это можно починить) или они Вам не нужны?
3. Согласны ли Вы, что шрифт увеличится в размере на 120 байтов (именно столько надо, чтобы добавить новый символ, сохранив имеющиеся).
вот, нарисовал тире) замените этим строку массива первого символа и все заработает. сомневаюсь в целесообразности символа пробела в таком шрифте, он не для печати фраз.
Не, пробел нужен хотя бы, чтобы старую цифру стереть.
ну как самый простой вариант. цена ток дорогая в данном случае) тут есть функция clrRect, можно ей закрашивать прямоугольник.
Ну, пусть ТС думает что ему нужно, а что - нет. Я бы лучше от двоеточия избавился, чем от пробела (а если пмять пожиала бы, то и от того, и от другого :)
1. Да, цифры используются все, двоеточие тоже в показаниях времени, пробел тоже нужен без него совсем все плохо получаеться сливается все. А вот точка не используется нигде.
2. Не совсем понял, хочеться, что бы при минусовой температуре с датчика на экран выводилась минусовая температура с знаком (-) щас выходит просто сдвинуто, может именно из за них (printNumI и printNumF) невозможный показ отрицательных чисел?
3. Сейчас скетч использует 41% памяти ардуинки, думаю влезит с изменениями, если я конечно правильно понял вас)
2. Не совсем понял, хочеться, что бы при минусовой температуре с датчика на экран выводилась минусовая температура с знаком (-) щас выходит просто сдвинуто, может именно из за них (printNumI и printNumF) невозможный показ отрицательных чисел?
Ну, отрицательные числа не выводятся потому, что нет минуса.
А вопрос был простой - Вы пользуете printNumI и printNumF или нет?
Вроде нигде не используется.
http://arduino-project.net/oled-chasy-na-arduino/ сам проект был взят от сюда, только добавлено еще показания влажности. А да точки используються в маленьком шрифте (при показании числа, мясяца и года), это играет роль?
сдвинуты потому-что вместо знака минус выводится пробел - в массиве шрифта MegaNumbers на месте знака минус стоят одни нули, это и есть пробел. замените строчку со всеми нулями на строчку которую я вам дал, в шрифте появится знак минус. даже с маленькими рюшечками, в стиле шрифта. замените строчку массива знака точка на строчку со всеми нулями и у вас будет пробел на месте символа точки которую вы не используете. т.е. когда надо напечатать пробел, будете печатать точку.
вот вам версия этого же шрифта с высотой символов 35 точек, отрезал незначащие. он съэкономит память, но у меня нет уверенности, что он правильно отобразится библиотекой. проверьте пожалуйста
Ну, собственно, Вам всё уже подсказали.
Заменил в фрнте, вместо знака точки поставил минус тот что дали, потому что если менять вместо пробела на минус на экране появляються черточки, прийду домой проверю на показания минусовой температуры в морозилке)) а так с такими изменениями никаких черточек пока нет
А можно вычитанием воспользоваться.
А можно вычитанием воспользоваться.
Заменил все как вы написали, теперь такая беда вышла вместе с мигащим двоиточьем появился знак минус, за то отрицательная температура теперь со знаком минус))) Горе с этими часами)
Можно по подробнее? вот если вставить этот код в скетч, то показывает знак и плюс и минус, но опять же пробел мешает и при двузначном значении отрицательной температуры цифры сливаються со знаком градуса
Заменил все как вы написали, теперь такая беда вышла вместе с мигащим двоиточьем появился знак минус, за то отрицательная температура теперь со знаком минус))) Горе с этими часами)
Так не выводите туда пробел, а просто отступите сменой координат
Здесь нужно поиграться с числами? Извините просто не силен в этом)
Здесь я не вижу в каком месте Вы туда пробел пихаете, видимо в другом.
Как Вы делаете мигание двоеточия? Наверняка там Вы выводите пробел (печатаете символ "минус". Найдите это место и замените печать минуса на стирание области (clr)
Поставл там где стоял знак "-" clr появилась вот такая штука мигающая) оставлял постыми лапки, такая ж фигня) Взял поставил в обеих :, только изменил координаты, теперь двоиточья мигают в верх, вниз)
Ничего не понял из Вашего объяснения, что мигает, в какой верх и какой низ - ничего непонятно. Если clr дала такой эффект, значит Вы её неправильно вставили. Код-то у Вас секретный, Бог Вас значет, что Вы там творите.
Короче, простой вопрос, программировать совсем не умеете? Так?
Тогда, забудьте про все наши советы по экономии места и добавляйте дполонительный символ в оригиналтьный шрифт.
Если исходить из приведенного вами полного кода с учетом того, что мы изменили в шрифте использовавшийся ранее как пробел символ минус на знак минус и символ точка заменили на пробел, то в строке 134 надо заменить печать символа "-" на символ "."
Все, спасибо большое теперь понял.