переход паяльной станции от lcd 1602 на oled 1.3 и библиотека u8g2
- Войдите на сайт для отправки комментариев
Взял в соседней теме проект фена на lcd 1602, но так как паяфльник у меня уже есть на stm32 с дисплеем oled 1.3, решил и этот перевести на 1.3. Заказал дисплей - получил.. и понял что с 1.3дюйма дисплеем работать сложнее, библиотека очень тяжелая, как делать свои шрифты пока не разобрался, лес реально дремуч..
Но проблему у меня вызвало другое.. использую я библиотеку u8g2, получаю с потенциометров сигнал:
int setHotAirTemp = map(analogRead(pinHotAirIn), 0, 1023, 0, 480); int hotAirTCouple = map(analogRead(pinHotAirTCouple), 0, 750, 0, 480);
lcd.print(setHotAirTemp); lcd.print(hotAirTCouple);
Теперь же вывод информации осуществляется функцией:
str = String(setHotAirTemp)+'°'; str.toCharArray(co2a, 5); u8g2.drawStr(82,29,co2a); //установленная температура фена str = String(hotAirTCouple)+'°'; str.toCharArray(co2a, 5); u8g2.drawStr(5,32,co2a); // текущая температура фена
Не понимаю почему автор библиотеки не принимает напрямую переменную типа string , но это его право..
Тестово я заливал прошивку в arduino nano убирал проверки подключения термопар и прочего, и данные отображались нормально в виде "425°" Как только я накинул потенциометры и термопару, данные стали приходить вида "425-1..." после единицы не видно, убегает за дисплей.
1. Что не так делаю? почему при lcd дисплее данные отображаются верно а тут после градусов приписывается через тире еще партия цифр?
2. Есть ли на ардуино или других компиляторах функция как в delphi ? где можно просмотреть переменные и из начения в тот или иной момент.
3. Может у кого есть шрифт менее геморный для 1.3 дисплея?
4. При компиляции мне arduino выдает сообщение (ниже), можно не париться?
#include <Arduino.h> #include <U8g2lib.h> #ifdef U8X8_HAVE_HW_SPI #include <SPI.h> #endif #ifdef U8X8_HAVE_HW_I2C #include <Wire.h> #endif String str = String(5); char co2a [5]; U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); #define Gerkon 1 // 1 вкл. геркон 0 выкл int pinSolderOut = 10; // Выход для паяльника //int pinSolderIn = A2; // Потенциометр паяльника //int pinSolderTCouple = A1; // Термопара паяльника int pinSolderButton = 13; // Кнопка вкл. и выкл. паяльника int pinHotAirOut = 9; // Выход для фена int pinHotAirIn = A2; // Потенциометр фена //перенос с а4 на а2 int pinHotAirTCouple = A0; // Термопара фена int pinHotAirCoolerOut = 11; // Выход для вентилятора фена ( PWM ) int pinHotAirCoolerIn = A3; // Потенциометр вентилятора фена int pinHotAirButton = 12; // Кнопка вкл.и выкл. фена int pinGerkon = A1; // Геркон фена 28ая нога // перенос с а5 на а1 int pinRele = 2; //На управление реле(32я нога меги) boolean FAN = true; void setup() { TCCR2B = TCCR2B & 0b11111000 | 0x01; //кулер фена 24v. Частота ШИМ 11 и 3 pinMode(pinSolderOut, OUTPUT); pinMode(pinSolderButton, INPUT); pinMode(pinHotAirOut, OUTPUT); pinMode(pinHotAirButton, INPUT); pinMode(pinGerkon, INPUT); pinMode(pinRele, OUTPUT); u8g2.begin(); // Вывод приветствия u8g2.clearBuffer(); u8g2.firstPage(); do { u8g2.setFont(u8g2_font_unifont_t_cyrillic); u8g2.drawStr( 0, 15, "Hello!"); } while( u8g2.nextPage() ); // задержка delay (2500); } void loop() { u8g2.clearBuffer(); if (Gerkon == 1) //проверка геркона digitalRead(pinGerkon); else pinGerkon = HIGH; //откл геркон // Преобразовываем значения // int setSolderTemp = map(analogRead(pinSolderIn), 0, 1023, 0, 480); // int solderTCouple = map(analogRead(pinSolderTCouple), 0, 750, 0, 480); int setHotAirTemp = map(analogRead(pinHotAirIn), 0, 1023, 0, 480); int hotAirTCouple = map(analogRead(pinHotAirTCouple), 0, 750, 0, 480); int setHotAirCooler = map(analogRead(pinHotAirCoolerIn), 0, 1023, 130, 255); int displayHotAirCooler = map(analogRead(pinHotAirCoolerIn), 0, 1023, 0, 99); // Защита, если не работает термопара // if (solderTCouple > 475) // setSolderTemp = 0; if (hotAirTCouple > 475) setHotAirTemp = 0; // Поддержка установленной температуры паяльника /*if (setSolderTemp >= solderTCouple && digitalRead(pinSolderButton) == HIGH) { digitalWrite(pinSolderOut, LOW); digitalWrite(pinSolderOut, HIGH); } else digitalWrite(pinSolderOut, LOW);*/ //Защита от пробоя симистора/замыкания термопары (замыкаем реле) if (digitalRead(pinHotAirButton) == HIGH && setHotAirTemp+100> pinHotAirTCouple && pinHotAirTCouple<480) digitalWrite(pinRele, HIGH); else digitalWrite(pinRele, LOW); // Поддержка установленной температуры фена if (setHotAirTemp >= hotAirTCouple && digitalRead(pinHotAirButton) == HIGH && digitalRead(pinGerkon) == HIGH) { digitalWrite(pinHotAirOut, HIGH); delay(90); digitalWrite(pinHotAirOut, LOW); } else digitalWrite(pinHotAirOut, LOW); // Установка оборотов вентилятора фена if (hotAirTCouple > 70 && digitalRead(pinHotAirButton) == LOW && FAN) analogWrite(pinHotAirCoolerOut, 255); else if (hotAirTCouple <= 70 && digitalRead(pinHotAirButton) == LOW && FAN) { analogWrite(pinHotAirCoolerOut, 0); FAN = false; } else if (hotAirTCouple < 90 && digitalRead(pinHotAirButton) == LOW && FAN == false) { analogWrite(pinHotAirCoolerOut, 0); } else if (hotAirTCouple > 90 && digitalRead(pinHotAirButton) == LOW && FAN == false) { FAN = true; analogWrite(pinHotAirCoolerOut, 255); } else { analogWrite(pinHotAirCoolerOut, setHotAirCooler); FAN = true; } // Убираем прыганье цифр //if ((setSolderTemp + 5) > solderTCouple && (setSolderTemp - 3) < solderTCouple) //solderTCouple = setSolderTemp; if ((setHotAirTemp + 15) > hotAirTCouple && (setHotAirTemp - 5) < hotAirTCouple) hotAirTCouple = setHotAirTemp; // Данные фена на дисплей------------------------------------------------------------------------------------------------------------------------- // рисуем линии и пишем 2 строки--------------- u8g2.drawLine(76, 1, 76, 64);//вертикальная по середине u8g2.drawLine(1, 40, 76, 40);//горизонтальная в левой части u8g2.drawLine(76, 32, 128, 32); u8g2.setFont(u8g2_font_ncenR12_tf); u8g2.drawStr(82,13,"temp"); // установленная температура u8g2.drawStr(82,46,"fan"); // установленные обороты //---------------------------------------- if (digitalRead(pinHotAirButton) == HIGH) //если фен Включен { if (hotAirTCouple < 481) // температура меньше 481 { str = String(displayHotAirCooler)+'%'; str.toCharArray(co2a, 5); u8g2.drawStr(82,62,co2a); //скорость вентилятора str = String(setHotAirTemp)+'°'; str.toCharArray(co2a, 5); u8g2.drawStr(82,29,co2a); //установленная температура фена u8g2.setFont(u8g2_font_helvB24_tf); str = String(hotAirTCouple)+'°'; str.toCharArray(co2a, 5); u8g2.drawStr(5,32,co2a); // текущая температура фена } if (digitalRead(pinGerkon) == LOW && digitalRead(pinHotAirButton) == HIGH) //геркон замкнут, мигаем уст. температурой (ловим по земле) //Геркон Включен и фен Включен { u8g2.setFont(u8g2_font_ncenR12_tf); str = String(displayHotAirCooler)+'%'; str.toCharArray(co2a, 5); u8g2.drawStr(82,62,co2a); //скорость вентилятора str = String(setHotAirTemp)+'°'; str.toCharArray(co2a, 5); u8g2.drawStr(82,29,co2a); //установленная температура фена u8g2.setFont(u8g2_font_helvB24_tf); str = String(hotAirTCouple)+'°'; str.toCharArray(co2a, 5); u8g2.drawStr(5,32,co2a); // текущая температура фена delay(150); u8g2.setFont(u8g2_font_ncenR12_tf); u8g2.drawStr(17,62,"*****"); } else { u8g2.setFont(u8g2_font_ncenR12_tf); u8g2.drawStr(2,58,"!warning!"); } } //Температура выключенного фена на дисплей до 60 градусов else if (hotAirTCouple > 60 && digitalRead(pinHotAirButton) == LOW && hotAirTCouple < 480) { u8g2.drawStr(82,29,"OFF"); //установленная температура фена u8g2.setFont(u8g2_font_helvB24_tf); str = String(hotAirTCouple)+'°'; str.toCharArray(co2a, 5); u8g2.drawStr(5,32,co2a); // текущая температура фена } else u8g2.drawStr(82,29,"OFF"); //установленная температура фена u8g2.sendBuffer(); delay(100); }
Скорее всего не хватило памяти на String. Проверьте это. Если не подтвердится (памяти хватает), тогда будем смотреть дальше.
Не понимаю почему автор библиотеки не принимает напрямую переменную типа string
Так ото ж!
Мошт, он про нее не знает ничо?
Вообще, библиотека оставила мня в тягостном недоумении, кто ее написал и где сейчас эти люди. ну и как бы по стилю весьма на Пуха похоже. Горе-ардуинщикам от горе-программиста.
DetSimen, прям заинтриговал. Шо хоть за библиотека, дайте глянуть.
она на гитхабе лежит
https://github.com/olikraus/u8glib
чтоб ей пользоваться, мне надо сначала стать доктором философии.
Хотя, вероятнее всего, просто я тупой с вечного перепою.
сначала стать доктором философии.
Ну, у меня эта проблема решена давно :)
тогда придется самому писать шрифт чтобы убедиться в этом..
Ну, у меня эта проблема решена давно :)
тогда, Вам понравица.
Не, это не та. У ТС используется файл "U8g2lib.h", а в этой такого нету.
Ага, нашел в соседней библиотеке от того же автора - https://github.com/olikraus/u8g2
Но проблему у меня вызвало другое.. использую я библиотеку u8g2, получаю с потенциометров сигнал:
Теперь же вывод информации осуществляется функцией:
Не понимаю почему автор библиотеки не принимает напрямую переменную типа string , но это его право..
Помоему, "это знак". Знак того, что и вам пора отказаться от String и перейти на CharArray. Например так:
Помоему, "это знак". Знак того, что и вам пора отказаться от String и перейти на CharArray. Например так:
В таком случае выводится на дисплей после цифр буква А с галкой и градус.. возможно шрифт не тянет..
В таком случае выводится на дисплей после цифр буква А с галкой и градус.. возможно шрифт не тянет..
Вы сделали проверку, которую я Вам советовал в посте №1? Вам же сказали, что по результатам проверки будет работа дальше. Там будет понятно, нужно избавляться от String или что-то другое искать. Или Вам не нужно решать проблему, а просто поболтать хочется?
В таком случае выводится на дисплей после цифр буква А с галкой и градус.. возможно шрифт не тянет..
скорее всего знак градуса неправильно передается. Если без него все нормально, то ищите способ правильно закодировать этот знак - или просто откажитесь от него...
Вы сделали проверку, которую я Вам советовал в посте №1? Вам же сказали, что по результатам проверки будет работа дальше. Там будет понятно, нужно избавляться от String или что-то другое искать. Или Вам не нужно решать проблему, а просто поболтать хочется?
Я сразу отказался от string как посоветовали. Проблему с лишними символами это решило.
Понятно, т.е. Вам пофиг хватает Вам памяти или нет и что там вообще проихсодит. Цедь - не решить проблему, а отказаться от String.