Помогите U8Glib

Lin_25
Offline
Зарегистрирован: 17.02.2020

Вопрос следующий:  Написал я не большой скетч для определения среднего значения газа в баллоне(авто). Когда проверяю его в мониторе порта всё отлично работает, но как не пытаюсь его вывести на экран с помощью библиотеки U8Glib ни чего не получается. Уже как только не пробовал.

О работе скетча: есть датчик на мультиклапане (100кОм (грубо говоря переменный резистор)), так как газ колебаеться в баллоне хочу вывести среднее значение нескольких замеров. Экран (будет) SSH1106 1.3" поэтому и выбрана данная библиотека.

Скетч (под COM рабочий):

#define potent_pin 1               // пин переменного резистора
uint32_t time_1,time_2,time_3,time_4,time_5,time_6,time_7,time_8,time_9; // таймеры для 9ти замеров

int z_1,z_2,z_3,z_4,z_5,z_6,z_7,z_8,z_9;  // замеры
int gaz_1; // данные датчика в реальном времени
int gaz_s; // (газ среднее) данные которые нужно вывести на экран (в итоге)

void setup() {
  gaz_1 = analogRead(potent_pin);                  // Указываем с какого пина будет сниматься измерение кол-ва газа (А1)
  gaz_1 = map(gaz_1, 0, 1023, 0, 35);              // Меняем границы измерения с 1-1023 на 0-30.
  gaz_1 = constrain(gaz_1, 0, 35);                 // Меняем границы измерения с 1-1023 на 0-30.
  gaz_s = gaz_1;                                   // придать (газ среднее) начальное значение 
Serial.begin(9600); 
}

void loop() {

  gaz_1 = analogRead(potent_pin);                  // Указываем с какого пина будет сниматься измерение кол-ва газа (А1)
  gaz_1 = map(gaz_1, 0, 1023, 0, 35);              // Меняем границы измерения с 1-1023 на 0-30.
  gaz_1 = constrain(gaz_1, 0, 35);                 // Меняем границы измерения с 1-1023 на 0-30.


if (millis() - time_1 >= 5000 && millis() - time_1 < 5001){
  z_1 = gaz_1;
  Serial.print("Z1:");Serial.println(z_1);
}
if (millis() - time_2 >= 10000 && millis() - time_2 < 10001){
  z_2 = gaz_1;
  Serial.print("Z2:");Serial.println(z_2);
}
if (millis() - time_3 >= 15000 && millis() - time_3 < 15001){
  z_3 = gaz_1;
  Serial.print("Z3:");Serial.println(z_3);
}
if (millis() - time_4 >= 20000 && millis() - time_4 < 20001){
  z_4 = gaz_1;
  Serial.print("Z4:");Serial.println(z_4);
}
if (millis() - time_5 >= 25000 && millis() - time_5 < 25001){
  z_5 = gaz_1;
  Serial.print("Z5:");Serial.println(z_5);
}
if (millis() - time_6 >= 30000 && millis() - time_6 < 30001){
  z_6 = gaz_1;
  Serial.print("Z6:");Serial.println(z_6);
}
if (millis() - time_7>= 35000 && millis() - time_7 < 35001){
  z_7 = gaz_1;
  Serial.print("Z7:");Serial.println(z_7);
}
if (millis() - time_8 >= 40000 && millis() - time_8 < 40001){
  z_8 = gaz_1;
  Serial.print("Z8:");Serial.println(z_8);
}
if (millis() - time_9 >= 45000 && millis() - time_9 < 45001){
  z_9 = gaz_1;
  Serial.print("Z9:");Serial.println(z_9);
  gaz_s=((z_1+z_2+z_3+z_4+z_5+z_6+z_7+z_8+z_9)/9);
  time_1 = millis();
  time_2 = millis();
  time_3 = millis();
  time_4 = millis();
  time_5 = millis();
  time_6 = millis();
  time_7 = millis();
  time_8 = millis();
  time_9 = millis();
Serial.print("gaz_s:");Serial.println(gaz_s);
}
}

Скетч (под U8G не рабочий):

#include "U8glib.h"                // библиотека экрана
#define potent_pin 1
uint32_t time_1,time_2,time_3,time_4,time_5,time_6,time_7,time_8,time_9;

int z_1,z_2,z_3,z_4,z_5,z_6,z_7,z_8,z_9;
int gaz_1;
int gaz_s;

//U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE);        // обьявляем дисплей OLED 1.3"
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);    //раскоментировать если экран OLED 0.96"
void draw(void) {  
u8g.setFont(u8g_font_ncenB18); 
u8g.setPrintPos(21, 60); u8g.print(gaz_s);
}
void setup() {
  gaz_1 = analogRead(potent_pin);                  // Указываем с какого пина будет сниматься измерение кол-ва газа (А1)
  gaz_1 = map(gaz_1, 0, 1023, 0, 35);              // Меняем границы измерения с 1-1023 на 0-30.
  gaz_1 = constrain(gaz_1, 0, 35);                 // Меняем границы измерения с 1-1023 на 0-30.
  gaz_s = gaz_1;
Serial.begin(9600); 
}

void loop() {
  gaz_1 = analogRead(potent_pin);                  // Указываем с какого пина будет сниматься измерение кол-ва газа (А1)
  gaz_1 = map(gaz_1, 0, 1023, 0, 35);              // Меняем границы измерения с 1-1023 на 0-30.
  gaz_1 = constrain(gaz_1, 0, 35);                 // Меняем границы измерения с 1-1023 на 0-30.


  
if (millis() - time_1 >= 5000 && millis() - time_1 < 5001){
  z_1 = gaz_1;
  Serial.print("Z1:");Serial.println(z_1);
}
if (millis() - time_2 >= 10000 && millis() - time_2 < 10001){
  z_2 = gaz_1;
  Serial.print("Z2:");Serial.println(z_2);
}
if (millis() - time_3 >= 15000 && millis() - time_3 < 15001){
  z_3 = gaz_1;
  Serial.print("Z3:");Serial.println(z_3);
}
if (millis() - time_4 >= 20000 && millis() - time_4 < 20001){
  z_4 = gaz_1;
  Serial.print("Z4:");Serial.println(z_4);
}
if (millis() - time_5 >= 25000 && millis() - time_5 < 25001){
  z_5 = gaz_1;
  Serial.print("Z5:");Serial.println(z_5);
}
if (millis() - time_6 >= 30000 && millis() - time_6 < 30001){
  z_6 = gaz_1;
  Serial.print("Z6:");Serial.println(z_6);
}
if (millis() - time_7>= 35000 && millis() - time_7 < 35001){
  z_7 = gaz_1;
  Serial.print("Z7:");Serial.println(z_7);
}
if (millis() - time_8 >= 40000 && millis() - time_8 < 40001){
  z_8 = gaz_1;
  Serial.print("Z8:");Serial.println(z_8);
}
if (millis() - time_9 >= 45000 && millis() - time_9 < 45001){
  z_9 = gaz_1;
  Serial.print("Z9:");Serial.println(z_9);
  gaz_s=((z_1+z_2+z_3+z_4+z_5+z_6+z_7+z_8+z_9)/9);
  time_1 = millis();
  time_2 = millis();
  time_3 = millis();
  time_4 = millis();
  time_5 = millis();
  time_6 = millis();
  time_7 = millis();
  time_8 = millis();
  time_9 = millis();
Serial.print("gaz_s:");Serial.println(gaz_s);
}
    u8g.firstPage(); do {                            // обновляем дисплей
    draw();                                                 // обновляем дисплей
  } while ( u8g.nextPage() );                     // обновляем дисплей
}

 

Lin_25
Offline
Зарегистрирован: 17.02.2020

P.S. зарание всем спасибо за помошь и не пинайте сильно я только учусь

vvadim
Offline
Зарегистрирован: 23.05.2012

а вы примеры из библиотеки для вашего дисплея запускали ?
работает ?

Lin_25
Offline
Зарегистрирован: 17.02.2020

vvadim пишет:

а вы примеры из библиотеки для вашего дисплея запускали ?
работает ?

Дисплей работает точно, на экран данные выводятся но не меняются, ощушение что они просто зависают.

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, поставьте u8g.print(millis()); вместо u8g.print(gaz_s);

Если будут меняться цифири, то дисплей не виноват. 

Lin_25
Offline
Зарегистрирован: 17.02.2020

sadman41 пишет:

Ну, поставьте u8g.print(millis()); вместо u8g.print(gaz_s);

Если будут меняться цифири, то дисплей не виноват. 

так цифры меняются и что это мне в данном случае даёт? Почему не снимаются замеры и не выводятся данные о среднем?

Опять же почему в мониторе всё работает как нужно а стоит мне только добавить данные о дисплее перестаёт работать всё? И в монитор данные перестают выводиться тоже.

sadman41
Offline
Зарегистрирован: 19.10.2016

Это дает знание о том, что проблема не в U8GLIB. 

Lin_25
Offline
Зарегистрирован: 17.02.2020

Как же всё таки ей (u8) обьяснить что нужно выводить?

Lin_25
Offline
Зарегистрирован: 17.02.2020
Вот так всё работает но не совсем так как нужно 
if (millis() - time_1 >= 5000){
  time_1 = millis();
  z_1 = gaz_1;
}
else if (millis() - time_2 >= 10000){
  time_2 = millis();
  z_2 = gaz_1;
}
else if (millis() - time_3 >= 15000){
  time_3 = millis();
  z_3 = gaz_1;
}
else if (millis() - time_4 >= 20000){
  time_4 = millis();
  z_4 = gaz_1;
}
else if (millis() - time_5 >= 25000){
  time_5 = millis();
  z_5 = gaz_1;
  gaz_s=((z_1+z_2+z_3+z_4+z_5)/5);
}

 

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

Lin_25 пишет:

Дисплей работает точно, на экран данные выводятся но не меняются, ощушение что они просто зависают.

Lin_25 - вы издеваетесь?? Покажите в коде, где вы обновляете данные на экране? :)))

Lin_25
Offline
Зарегистрирован: 17.02.2020

Вот так всё работает но подсчёт не правильный (количество таймеров и замеров значения не имеют это я взял кусок из общего большого скетча который не привожу чтоб не путать вас):

#include "U8glib.h"                // библиотека экрана
#define potent_pin 1
uint32_t time_1,time_2,time_3,time_4,time_5;

int z_1,z_2,z_3,z_4,z_5;
int gaz_1;
int gaz_s;

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);    //раскоментировать если экран OLED 0.96"
void draw(void) {  
u8g.setFont(u8g_font_ncenB18); 
u8g.setPrintPos(21, 60); u8g.print(millis());
}
void setup() {
  gaz_1 = analogRead(potent_pin);                  // Указываем с какого пина будет сниматься измерение кол-ва газа (А1)
  gaz_1 = map(gaz_1, 0, 1023, 0, 35);              // Меняем границы измерения с 1-1023 на 0-30.
  gaz_1 = constrain(gaz_1, 0, 35);                 // Меняем границы измерения с 1-1023 на 0-30.
  gaz_s = gaz_1;
Serial.begin(9600); 
}

void loop() {
  gaz_1 = analogRead(potent_pin);                  // Указываем с какого пина будет сниматься измерение кол-ва газа (А1)
  gaz_1 = map(gaz_1, 0, 1023, 0, 35);              // Меняем границы измерения с 1-1023 на 0-30.
  gaz_1 = constrain(gaz_1, 0, 35);                 // Меняем границы измерения с 1-1023 на 0-30.


  
if (millis() - time_1 >= 5000){
  time_1 = millis();
  z_1 = gaz_1;
}
else if (millis() - time_2 >= 10000){
  time_2 = millis();
  z_2 = gaz_1;
}
else if (millis() - time_3 >= 15000){
  time_3 = millis();
  z_3 = gaz_1;
}
else if (millis() - time_4 >= 20000){
  time_4 = millis();
  z_4 = gaz_1;
}
else if (millis() - time_5 >= 25000){
  time_5 = millis();
  z_5 = gaz_1;
  gaz_s=((z_1+z_2+z_3+z_4+z_5)/5);
}
    u8g.firstPage(); do {                            // обновляем дисплей
    draw();                                        // обновляем дисплей
  } while ( u8g.nextPage() );                      // обновляем дисплей
}

 

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

и что в подсчете  неправЕльно? :)

Lin_25
Offline
Зарегистрирован: 17.02.2020

Не правильно то, что таймеры обнуляются сразу после замера и считают по новой и так как разбежка у них по 5 секунд по итогу в момент последнего замера, все замеры равны. А мне нужно чтоб снятый замер хранился пока не пройдёт весь цикл.

Lin_25
Offline
Зарегистрирован: 17.02.2020

Мой первый (ВЕРХНИЙ) скетч работает как нужно но как только я в него добавляю данные для вывода на дисплей всё становиться.

sadman41
Offline
Зарегистрирован: 19.10.2016

Я вообще не особо понимаю зачем там столько сложений одного и того же - усреднение что ли изображено?

Lin_25
Offline
Зарегистрирован: 17.02.2020

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

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну так это делается менее извращённо. Сейчас спецы по скользящему среднему подтянутся, подскажут формулу в одну строчку. Впрочем, её и поиском по форуму можно найти - сверху справа поле.

Lin_25
Offline
Зарегистрирован: 17.02.2020

Тут вопрос даже не в том как написать а как вывести на дисплей то что уже работает в мониторе но не хочет работать на дисплее

-NMi-
Offline
Зарегистрирован: 20.08.2018

Чуваг реальный извращенец.

1 Сделай массив из ХХ количеств измерений. (у тебя 9)

2 Сделай процедуру "первый вошёл-последний вышел"

3 Сделай процедуру усреднения по арифметически + вывод на дисплей.

4 Вызывай эти три процедуры через твои минимальные 5000 миллисов и ФСЁ!!!

Зачем такой кракозябристый код пейсать, ужаснахх!    :)))

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

Lin_25 - зачем вообще этот бредовый кусок с девятью таймерами нужен? - сделайте один таймер на 5 сек, но заведите счетчик. Накапливайте данные девять раз. потом усредняйте. и не надо будет девять переменных для газа. девять миллисов и прочую лабуду.

И. заодно, вы перестанете путаться. что вы выводите на экран. Открою вам тайну - ваш первый скетч работает и вполне все выводит, только немного не так, как вы ожидаете - и вы просто этого не замечаете

Lin_25
Offline
Зарегистрирован: 17.02.2020

Ребят я не прошу менять мой скетч (мои извращенства меня не смущают ) я прошу помочь его вывести на нужный дисплей.

Lin_25
Offline
Зарегистрирован: 17.02.2020

b707 пишет:

Открою вам тайну - ваш первый скетч работает и вполне все выводит, только немного не так, как вы ожидаете - и вы просто этого не замечаете

Я об этом и говорю он рабочий до того момента как я в него не добавлю библиотеку и данные о дисплее

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

Lin_25 пишет:

Ребят я не прошу менять мой скетч (мои извращенства меня не смущают ) я прошу помочь его вывести на нужный дисплей.

вы не понимаете. что именно эти "извращенца" усложняют вывод. Короче. как хотите - но я скажу так: я знаЮ. как исправить этот код. чтобы он выводил газ на дисплей - но делать этого не стану. Сначала перепишите таймеры.

Не нравится - разбирайтеся сами.

sadman41
Offline
Зарегистрирован: 19.10.2016

Моя сломанная нога не болит до тех пор, пока я не встаю с койки. Не лечите мне ногу, просто подскажите как пробежать марафон.

Примерно вот так всё это выглядит.

-NMi-
Offline
Зарегистрирован: 20.08.2018

b707 пишет:

 - и вы просто этого не замечаете

Это называецца эффект дворнега? Я правильно понял???

Lin_25
Offline
Зарегистрирован: 17.02.2020

b707 пишет:

вы не понимаете. что именно эти "извращенца" усложняют вывод. Короче. как хотите - но я скажу так: я знаЮ. как исправить этот код. чтобы он выводил газ на дисплей - но делать этого не стану. Сначала перепишите таймеры.

Не нравится - разбирайтеся сами.

Спасибо, в итоге пришлось переписывать так как посоветовали вы.

Lin_25
Offline
Зарегистрирован: 17.02.2020

Всем спасибо!

-NMi-
Offline
Зарегистрирован: 20.08.2018

ну... дык... ты... покаж... чо... напейсал-то... ато както нипанятно, вразумэл ли ты наши саветы аль нэт????????

Lin_25
Offline
Зарегистрирован: 17.02.2020

-NMi- пишет:

ну... дык... ты... покаж... чо... напейсал-то... ато както нипанятно, вразумэл ли ты наши саветы аль нэт????????

#include "U8glib.h"                // библиотека экрана
#define potent_pin 1               // пин датчика газа
uint32_t time_1;                   // таймер 1

int gaz_1;                         // переменная текущего значения датчика газа
int gaz_2 = 0;                     // начальное значение
int gaz_s;                         // среднее значение
int shk;                           // счётчик 

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0); // дисплей 

void draw(void) {  
u8g.setFont(u8g_font_ncenB18);                                 // шрифт 
u8g.setPrintPos(21, 60); u8g.print(gaz_s);                     // расположение выходных данных на дисплее
}

void setup() {
  gaz_1 = analogRead(potent_pin);                  // Указываем с какого пина будет сниматься измерение кол-ва газа (А1)
  gaz_1 = map(gaz_1, 0, 1023, 0, 35);              // Меняем границы измерения с 1-1023 на 0-35.
  gaz_1 = constrain(gaz_1, 0, 35);                 // Меняем границы измерения с 1-1023 на 0-35.
  gaz_s = gaz_1;                                   // нужно для того чтоб при первом включении не ждать пока пройдёт весь цикл для того чтоб увидеть сколько газа                                   // задаём начальное значение
  Serial.begin(9600);                              // отладка 
}

void loop() {
  gaz_1 = analogRead(potent_pin);                  // Указываем с какого пина будет сниматься измерение кол-ва газа (А1)
  gaz_1 = map(gaz_1, 0, 1023, 0, 35);              // Меняем границы измерения с 1-1023 на 0-30.
  gaz_1 = constrain(gaz_1, 0, 35);                 // Меняем границы измерения с 1-1023 на 0-30.
  if (millis() - time_1 >= 1000){                  // если таймер равен или больше 1с
  time_1 = millis();                               // сбрасываем таймер
  shk++;                                           // увеличиваем счётчик счётчик
  gaz_2=gaz_2+gaz_1;                               // к начальному значению прибавляем текущее
  Serial.print("счётчик:");Serial.println(shk);    // выводим в монитор показания счётчика
  Serial.print("т.знач:");Serial.println(gaz_1);   // выводим в монитор показания текущее
  Serial.print("сумма:");Serial.println(gaz_2);    // выводим в монитор сумму показаний
}
if (shk==30){                                      // если счётчик = 30
  gaz_s=gaz_2/30;                                  // делим сумму на 30 (считаем среднее)
  shk=0;                                           // обнуляем счётчик
  gaz_2=0;                                         // обнуляем начальное показание и сумму
  Serial.print("среднее на экран:");Serial.println(gaz_s); // выводим среднее на экран
}
   u8g.firstPage(); do {                           // обновляем дисплей
   draw();                                         // обновляем дисплей
 } while ( u8g.nextPage() );                       // обновляем дисплей
}

 

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

в 38 строке делить надо на 30, а не на 31. Почему - догадайся сам

-NMi-
Offline
Зарегистрирован: 20.08.2018

...ужоснах(((

Lin_25
Offline
Зарегистрирован: 17.02.2020

Возможно опечатался

Lin_25
Offline
Зарегистрирован: 17.02.2020

-NMi- пишет:

...ужоснах(((

Что не так?

Lin_25
Offline
Зарегистрирован: 17.02.2020

b707 пишет:

в 38 строке делить надо на 30, а не на 31. Почему - догадайся сам

нет всё таки правильно на 31 т.к. начальное значение gaz_2 задано в setup, и при первом "+" оно плюсуеться уже к считанному значению а не к 0.

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

Lin_25 пишет:

b707 пишет:

в 38 строке делить надо на 30, а не на 31. Почему - догадайся сам

нет всё таки правильно на 31 т.к. начальное значение gaz_2 задано в setup, и при первом "+" оно плюсуеться уже к считанному значению а не к 0.

да согласен. Но я бы начальное измерение из сетап выкинул - нафига в программе две копии одинакового кода - чтение из аналогового порта, map ...constrain...

Lin_25
Offline
Зарегистрирован: 17.02.2020

b707 пишет:

да согласен. Но я бы начальное измерение из сетап выкинул - нафига в программе две копии одинакового кода - чтение из аналогового порта, map ...constrain...

изначально так и было а добавил я этот гемор для того чтоб как только на ардуинку подаётся питание первое значение было равно первому считыванию (пока машина ещё стоит данные более менее правильные) и не нужно ждать Nное количество секунд чтоб понять на сколько полный балон

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

Lin_25 пишет:

изначально так и было а добавил я этот гемор для того чтоб как только на ардуинку подаётся питание первое значение было равно первому считыванию

читать первое значение что в сетап, что в loop - разницы никакой

Lin_25
Offline
Зарегистрирован: 17.02.2020

b707 пишет:

Lin_25 пишет:

изначально так и было а добавил я этот гемор для того чтоб как только на ардуинку подаётся питание первое значение было равно первому считыванию

читать первое значение что в сетап, что в loop - разницы никакой

Уже проверить не могу, но если в loop приравнять gaz_2 к gaz_1 то при каждом цикле (1с) gaz_2 не будет хранить сумму а приравниваться к gaz_1 ведь так?

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

Lin_25 пишет:

Уже проверить не могу, но если в loop приравнять gaz_2 к gaz_1 то при каждом цикле (1с) gaz_2 не будет хранить сумму а приравниваться к gaz_1 ведь так?

если в сетап обнулить gaz_2, а в луп только прибавлять - все будет работать

Lin_25
Offline
Зарегистрирован: 17.02.2020

ну кроме того что делить нужно будет не на 31 а на 30 что меняется?

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

Lin_25 пишет:

ну кроме того что делить нужно будет не на 31 а на 30 что меняется?

все операторы в сетап будут не нужны

nik182
Offline
Зарегистрирован: 04.05.2015

Lin_25 пишет:

b707 пишет:

да согласен. Но я бы начальное измерение из сетап выкинул - нафига в программе две копии одинакового кода - чтение из аналогового порта, map ...constrain...

изначально так и было а добавил я этот гемор для того чтоб как только на ардуинку подаётся питание первое значение было равно первому считыванию (пока машина ещё стоит данные более менее правильные) и не нужно ждать Nное количество секунд чтоб понять на сколько полный балон


А в мануале на процессор написано вроде, что или ждать или первая оцифровка в топку? Не?

Lin_25
Offline
Зарегистрирован: 17.02.2020

b707 пишет:

все операторы в сетап будут не нужны

Поправил скетч убрал gaz_2 из setup, но как убрать остальное чтоб работало так как я хочу пока не придумал.

sadman41
Offline
Зарегистрирован: 19.10.2016
Lin_25
Offline
Зарегистрирован: 17.02.2020

Изначально вопрос был немного другим а до этого мы в итоге пришли))

sadman41
Offline
Зарегистрирован: 19.10.2016

Вам тут пишут, как делать правильно, а не как искать черную кошку в тёмной комнате.