переход паяльной станции от lcd 1602 на oled 1.3 и библиотека u8g2

tianddu
Offline
Зарегистрирован: 13.04.2017

Взял в соседней теме проект фена на 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 выдает сообщение (ниже), можно не париться?

Скетч использует 28394 байт (92%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 1545 байт (75%) динамической памяти, оставляя 503 байт для локальных переменных. Максимум: 2048 байт.
Недостаточно памяти, программа может работать нестабильно.
 
#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);
}

 

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

Скорее всего не хватило памяти на String. Проверьте это. Если не подтвердится (памяти хватает), тогда будем смотреть дальше.

tianddu пишет:

Не понимаю почему автор библиотеки не принимает напрямую переменную типа string

Так ото ж!

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Мошт, он про нее не знает ничо? 

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

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

DetSimen, прям заинтриговал. Шо хоть за библиотека, дайте глянуть.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

она на гитхабе лежит 

https://github.com/olikraus/u8glib

чтоб ей пользоваться, мне надо сначала стать доктором философии.  

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Хотя, вероятнее всего, просто я тупой с вечного перепою. 

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

DetSimen пишет:

сначала стать доктором философии.  

Ну, у меня эта проблема решена давно :)

tianddu
Offline
Зарегистрирован: 13.04.2017

тогда придется самому писать шрифт чтобы убедиться в этом..

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

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

Ну, у меня эта проблема решена давно :)

тогда, Вам понравица. 

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

Не, это не та. У ТС используется файл "U8g2lib.h", а в этой такого нету.

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

Ага, нашел в соседней библиотеке от того же автора - https://github.com/olikraus/u8g2

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

tianddu пишет:

Но проблему у меня вызвало другое.. использую я библиотеку 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 , но это его право..

 

Помоему, "это знак". Знак того, что и вам пора отказаться от String и перейти на CharArray. Например так:

char ch_ar[5];
sprintf(ch_ar, "%d°", setHotAirTemp);
u8g2.drawStr(82,29,ch_ar); //установленная температура фена
sprintf(ch_ar, "%d°", hotAirTCouple);
u8g2.drawStr(82,29,ch_ar); // текущая температура фена

 

tianddu
Offline
Зарегистрирован: 13.04.2017

b707 пишет:

Помоему, "это знак". Знак того, что и вам пора отказаться от String и перейти на CharArray. Например так:

char ch_ar[5];
sprintf(ch_ar, "%d°", setHotAirTemp);
u8g2.drawStr(82,29,ch_ar); //установленная температура фена
sprintf(ch_ar, "%d°", hotAirTCouple);
u8g2.drawStr(82,29,ch_ar); // текущая температура фена

В таком случае выводится на дисплей после цифр буква А с галкой и градус.. возможно шрифт не тянет..

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

tianddu пишет:

В таком случае выводится на дисплей после цифр буква А с галкой и градус.. возможно шрифт не тянет..

Вы сделали проверку, которую я Вам советовал в посте №1? Вам же сказали, что по результатам проверки будет работа дальше. Там будет понятно, нужно избавляться от String или что-то другое искать. Или Вам не нужно решать проблему, а просто поболтать хочется?

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

tianddu пишет:

В таком случае выводится на дисплей после цифр буква А с галкой и градус.. возможно шрифт не тянет..

скорее всего знак градуса неправильно передается. Если без него все нормально, то ищите способ правильно закодировать этот знак - или просто откажитесь от него...

tianddu
Offline
Зарегистрирован: 13.04.2017

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

Вы сделали проверку, которую я Вам советовал в посте №1? Вам же сказали, что по результатам проверки будет работа дальше. Там будет понятно, нужно избавляться от String или что-то другое искать. Или Вам не нужно решать проблему, а просто поболтать хочется?

Я сразу отказался от string как посоветовали. Проблему с лишними символами это решило.

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

Понятно, т.е. Вам пофиг хватает Вам памяти или нет и что там вообще проихсодит. Цедь - не решить проблему, а отказаться от String.