Помогите U8Glib
- Войдите на сайт для отправки комментариев
Чт, 09/04/2020 - 18:06
Вопрос следующий: Написал я не большой скетч для определения среднего значения газа в баллоне(авто). Когда проверяю его в мониторе порта всё отлично работает, но как не пытаюсь его вывести на экран с помощью библиотеки 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() ); // обновляем дисплей }
P.S. зарание всем спасибо за помошь и не пинайте сильно я только учусь
а вы примеры из библиотеки для вашего дисплея запускали ?
работает ?
а вы примеры из библиотеки для вашего дисплея запускали ?
работает ?
Дисплей работает точно, на экран данные выводятся но не меняются, ощушение что они просто зависают.
Ну, поставьте u8g.print(millis()); вместо u8g.print(gaz_s);
Если будут меняться цифири, то дисплей не виноват.
Ну, поставьте u8g.print(millis()); вместо u8g.print(gaz_s);
Если будут меняться цифири, то дисплей не виноват.
так цифры меняются и что это мне в данном случае даёт? Почему не снимаются замеры и не выводятся данные о среднем?
Опять же почему в мониторе всё работает как нужно а стоит мне только добавить данные о дисплее перестаёт работать всё? И в монитор данные перестают выводиться тоже.
Это дает знание о том, что проблема не в U8GLIB.
Как же всё таки ей (u8) обьяснить что нужно выводить?
Дисплей работает точно, на экран данные выводятся но не меняются, ощушение что они просто зависают.
Lin_25 - вы издеваетесь?? Покажите в коде, где вы обновляете данные на экране? :)))
Вот так всё работает но подсчёт не правильный (количество таймеров и замеров значения не имеют это я взял кусок из общего большого скетча который не привожу чтоб не путать вас):
и что в подсчете неправЕльно? :)
Не правильно то, что таймеры обнуляются сразу после замера и считают по новой и так как разбежка у них по 5 секунд по итогу в момент последнего замера, все замеры равны. А мне нужно чтоб снятый замер хранился пока не пройдёт весь цикл.
Мой первый (ВЕРХНИЙ) скетч работает как нужно но как только я в него добавляю данные для вывода на дисплей всё становиться.
Я вообще не особо понимаю зачем там столько сложений одного и того же - усреднение что ли изображено?
именно так, для того чтоб не смотря на наши кривые дороги подсчёт был максимально точным.
Ну так это делается менее извращённо. Сейчас спецы по скользящему среднему подтянутся, подскажут формулу в одну строчку. Впрочем, её и поиском по форуму можно найти - сверху справа поле.
Тут вопрос даже не в том как написать а как вывести на дисплей то что уже работает в мониторе но не хочет работать на дисплее
Чуваг реальный извращенец.
1 Сделай массив из ХХ количеств измерений. (у тебя 9)
2 Сделай процедуру "первый вошёл-последний вышел"
3 Сделай процедуру усреднения по арифметически + вывод на дисплей.
4 Вызывай эти три процедуры через твои минимальные 5000 миллисов и ФСЁ!!!
Зачем такой кракозябристый код пейсать, ужаснахх! :)))
Lin_25 - зачем вообще этот бредовый кусок с девятью таймерами нужен? - сделайте один таймер на 5 сек, но заведите счетчик. Накапливайте данные девять раз. потом усредняйте. и не надо будет девять переменных для газа. девять миллисов и прочую лабуду.
И. заодно, вы перестанете путаться. что вы выводите на экран. Открою вам тайну - ваш первый скетч работает и вполне все выводит, только немного не так, как вы ожидаете - и вы просто этого не замечаете
Ребят я не прошу менять мой скетч (мои извращенства меня не смущают ) я прошу помочь его вывести на нужный дисплей.
Открою вам тайну - ваш первый скетч работает и вполне все выводит, только немного не так, как вы ожидаете - и вы просто этого не замечаете
Я об этом и говорю он рабочий до того момента как я в него не добавлю библиотеку и данные о дисплее
Ребят я не прошу менять мой скетч (мои извращенства меня не смущают ) я прошу помочь его вывести на нужный дисплей.
вы не понимаете. что именно эти "извращенца" усложняют вывод. Короче. как хотите - но я скажу так: я знаЮ. как исправить этот код. чтобы он выводил газ на дисплей - но делать этого не стану. Сначала перепишите таймеры.
Не нравится - разбирайтеся сами.
Моя сломанная нога не болит до тех пор, пока я не встаю с койки. Не лечите мне ногу, просто подскажите как пробежать марафон.
Примерно вот так всё это выглядит.
- и вы просто этого не замечаете
Это называецца эффект дворнега? Я правильно понял???
вы не понимаете. что именно эти "извращенца" усложняют вывод. Короче. как хотите - но я скажу так: я знаЮ. как исправить этот код. чтобы он выводил газ на дисплей - но делать этого не стану. Сначала перепишите таймеры.
Не нравится - разбирайтеся сами.
Спасибо, в итоге пришлось переписывать так как посоветовали вы.
Всем спасибо!
ну... дык... ты... покаж... чо... напейсал-то... ато както нипанятно, вразумэл ли ты наши саветы аль нэт????????
ну... дык... ты... покаж... чо... напейсал-то... ато както нипанятно, вразумэл ли ты наши саветы аль нэт????????
в 38 строке делить надо на 30, а не на 31. Почему - догадайся сам
...ужоснах(((
Возможно опечатался
...ужоснах(((
Что не так?
в 38 строке делить надо на 30, а не на 31. Почему - догадайся сам
нет всё таки правильно на 31 т.к. начальное значение gaz_2 задано в setup, и при первом "+" оно плюсуеться уже к считанному значению а не к 0.
в 38 строке делить надо на 30, а не на 31. Почему - догадайся сам
нет всё таки правильно на 31 т.к. начальное значение gaz_2 задано в setup, и при первом "+" оно плюсуеться уже к считанному значению а не к 0.
да согласен. Но я бы начальное измерение из сетап выкинул - нафига в программе две копии одинакового кода - чтение из аналогового порта, map ...constrain...
да согласен. Но я бы начальное измерение из сетап выкинул - нафига в программе две копии одинакового кода - чтение из аналогового порта, map ...constrain...
изначально так и было а добавил я этот гемор для того чтоб как только на ардуинку подаётся питание первое значение было равно первому считыванию (пока машина ещё стоит данные более менее правильные) и не нужно ждать Nное количество секунд чтоб понять на сколько полный балон
изначально так и было а добавил я этот гемор для того чтоб как только на ардуинку подаётся питание первое значение было равно первому считыванию
читать первое значение что в сетап, что в loop - разницы никакой
изначально так и было а добавил я этот гемор для того чтоб как только на ардуинку подаётся питание первое значение было равно первому считыванию
читать первое значение что в сетап, что в loop - разницы никакой
Уже проверить не могу, но если в loop приравнять gaz_2 к gaz_1 то при каждом цикле (1с) gaz_2 не будет хранить сумму а приравниваться к gaz_1 ведь так?
Уже проверить не могу, но если в loop приравнять gaz_2 к gaz_1 то при каждом цикле (1с) gaz_2 не будет хранить сумму а приравниваться к gaz_1 ведь так?
если в сетап обнулить gaz_2, а в луп только прибавлять - все будет работать
ну кроме того что делить нужно будет не на 31 а на 30 что меняется?
ну кроме того что делить нужно будет не на 31 а на 30 что меняется?
да согласен. Но я бы начальное измерение из сетап выкинул - нафига в программе две копии одинакового кода - чтение из аналогового порта, map ...constrain...
изначально так и было а добавил я этот гемор для того чтоб как только на ардуинку подаётся питание первое значение было равно первому считыванию (пока машина ещё стоит данные более менее правильные) и не нужно ждать Nное количество секунд чтоб понять на сколько полный балон
А в мануале на процессор написано вроде, что или ждать или первая оцифровка в топку? Не?
все операторы в сетап будут не нужны
Поправил скетч убрал gaz_2 из setup, но как убрать остальное чтоб работало так как я хочу пока не придумал.
http://arduino.ru/forum/programmirovanie/usrednenie-znachenii-s-potentsiometra
Изначально вопрос был немного другим а до этого мы в итоге пришли))
Вам тут пишут, как делать правильно, а не как искать черную кошку в тёмной комнате.