Вы сделали очень хорошую графику, которая мне очень понравилась! Если хочешь, я могу отправить тебе свой чужой файл, если хочешь посмотреть, я все исправил! Еще раз, я очень благодарен вам за то, что прислали мне вашу работу. Чтобы немного пополнить его, я также установлю литий-ионную батарею, чтобы обеспечить память измеренных состояний, потому что, как вы знаете, если по какой-либо причине нет питания, чтение начинается с нуля !!!
Только что переделал скетч sel_oleg !!! Я подогнал его под себя. Сфотографирую и попробую прислать как выглядит. По оборудованию все как у sel_oleg, и все тоже связано. Думаю добавить еще запасной аккумулятор, чтобы даже при кратковременном отключении электричества барограф заработал с самого начала !!! Когда я исправлю это и некоторые другие вещи, такие как регулировка яркости экрана и его выключение, я тоже отправлю это !!! Извините, если сделаю опечатку!
Экран 3.5 мне очень нравится. Вы можете опубликовать свою работу? Хотелось бы сделать Барограф на таком экране от 3.5. Большое спасибо!!!
Попробуйте датчик влажности Si7021. После того, как в течении 3-4 месяцев на улице, сгнили несколько DHT22, + в наших условиях повышенной влажности зимой, показания 99,9% норма, перешёл на него. статистики пока нет.
подскажите пожалуйста, залил скетч из поста #520 но дисплей ничего не показывает... проверил отдельно дисплей и датчик bme280 все работает. Может адрес дисплея какой-то не такой стандартный
подскажите пожалуйста, залил скетч из поста #520 но дисплей ничего не показывает... проверил отдельно дисплей и датчик bme280 все работает. Может адрес дисплея какой-то не такой стандартный
спасибо за ответ, нашел причину, у меня оказывается прошивка стопарилась на опросе датчика. У меня ВМЕ280. Кстати ктонибудь прикручивал к такому дисплею ВМЕ?
Здравствуйте, уважаемые участники! Упешно повторил конструкцию участника s13. Знакомый увидел и попросил сделать ему такой же барограф, только чтобы можно было выбирать между мм.рт.ст. и кПа по щелчку кнопки. Я так понял, что датчик bmp180 выдаёт данные в Па. Следовательно, чтобы получить показания в кПа, нужно содержимое соотв. переменной поделить на 1000. Что и сделал. Экран "давление в кПа" вставил вместо экрана одного из графиков давления. На первый взгляд всё вроде бы получилось - 757 мм.рт.ст. переводятся в 100 кПа, и нормально выводятся на экран, причём уже убедился в том, что это не просто статическое число, а именно изменяющиеся показания (уже наблюдал 101 кПа, а сейчас опять отыграло на 100). И всё бы здОрово, только вот никак не могу разобраться с десятыми и сотыми. Я практически ничего не понимаю в программировании, ещё меньше - в математике. Просто действую "методом тыка", по образу и подобию: увидел в тексте строчку, где содержимое переменной данных давления делится на 133,3 - ага, понимаю, что это Па переводятся в мм.рт.ст., значит, переменную надо поделить не на 133,3 а на 1000, и получу кПа. Так и сделал, но при попытке повторить то же самое с десятыми и сотыми получил отлуп - на экране всегда ,00. Ниже привожу скетч со своими правками (case1). Буду очень благодарен, если подскажете, как правильно поступить, чтобы получить значения кПа с десятыми и сотыми долями.
#include <LCD5110_Graph.h> // rinkydinkelectronics.com/library.php
#include <Wire.h>
#include <Adafruit_BMP085.h> // github.com/adafruit/Adafruit-BMP085-Library
#include <LowPower.h> // github.com/rocketscream/Low-Power
Adafruit_BMP085 dps;
// ********** Опции компиляции **************
//#define SeaLevel // раскоментировать для коррекции на высоту
//#define debug // для тестирования графиков (ан.вход a1 как задатчик давления)
#define cont 67 // для изменения раскоментировать эту строку (70 по умолчанию)
#define zapolnen // Заполнение графика 1
//#define gasim_lcd // если экономим батарейки гашением LCD
long P_win = 165 * 133.3; // Верхняя граница абс. графика по умолчанию до сдвига (600 + 165) = 765мм
#if defined (SeaLevel) // если не включена коррекция, экономим память
float Alt_corr = 32.4; // Коррекция высоты в метрах.
#endif
uint32_t Pressure;
float temp;
unsigned char sotki ; // сотые для давления
unsigned char p_count, p2;
long P_Min, P_Max, P_Dt, P_Mid;
uint16_t P_Mem[217]; //-79980 = 600мм (3 day 20min memory, 72 per 24 hour)
signed char x, y, last_x, last_y;
// nokia 5110 connect
// pin d3 - Serial clock out (SCLK)
// pin d4 - Serial data out (DIN)
// pin d5 - Data/Command select (D/C)
// pin d6 - LCD reset (RST)
// pin d7 - LCD chip select (CS)
LCD5110 myGLCD(3, 4, 5, 6, 7);
// bmp180 connect
// sda - a4
// scl - a5
// Use pin 2 as wake up pin
const char wakeUpPin = 2; // d2 для кнопки
const char lightPin1 = 12; // d11 подсветка дисплея
const char lightPin2 = 11; // d12 инверсная подсветка дисплея
const char batPin = 0; // a0 - ан. вход для контроля батареи 220к/51к
volatile char scr_num = 0; // Номер экрана для отображения
volatile boolean key_pressed = false; // Признак что кнопку жали
volatile boolean in_int = false; // Признак нахождения в прерывании
volatile boolean Refresh = true; // Признак что нужно обновить отрисовку (для экономии батарей)
volatile boolean Lcd_On = true; // Признак что дисплей включен
volatile char light_on = 1; // длительность подсветки при включении 4*4 = 16с.
extern unsigned char SmallFont[]; // внешние шрифты
extern unsigned char BigNumbers[];
extern unsigned char TinyFont[];
unsigned char tik = 0; // счетчики для времени
unsigned char Count_Minute = 0;
uint32_t Son_count = 0;
//******************************** START ***************************************
void setup() {
myGLCD.InitLCD();
#if defined (cont)
myGLCD.setContrast(cont); //регулировка контраста при необходимости
#endif
myGLCD.setFont(SmallFont);
Wire.begin();
analogReference(INTERNAL); //1.1v internal op.source
pinMode(batPin,INPUT); //Вход для контроля батареи
#if defined (debug)
pinMode(1,INPUT); // а1 - задание давления
analogRead(1);
#endif
LowPower.powerDown(SLEEP_1S, ADC_OFF, BOD_OFF);
//dps.begin(BMP085_ULTRALOWPOWER);
//dps.begin(BMP085_STANDARD);
dps.begin(BMP085_HIGHRES);
//dps.begin(BMP085_ULTRAHIGHRES);
pinMode(wakeUpPin, INPUT); // Configure wake up pin as input.
digitalWrite(wakeUpPin, 1); // pullup
pinMode(lightPin1, OUTPUT);// lcd light pin as output;
pinMode(lightPin2, OUTPUT);// lcd light inv pin as output;
#if defined (SeaLevel)
Pressure = dps.readSealevelPressure(Alt_corr); // с коррекцией на уровень моря
#else
Pressure = dps.readPressure(); // без коррекции к уровню моря
#endif
P_Mid = Pressure - 79980; // (79980 = 600mm) отсекаем лишнее
P_Mem[p_count] = P_Mid; // заносим в память первое значение давления для правильной работы усреднения
// Serial.begin(9600);
// while (!Serial) ; // wait for Arduino Serial Monitor
// delay(200);
}
void loop() { // *********************************************************
// Allow wake up pin to trigger interrupt on low.
#if defined (debug)
#else
if ((Son_count < 5)||((!(Son_count % 5))&&(tik==0))) { // через 5 минут активности, не заходим в тело по 5 минут
#endif
// Serial.print("S=");Serial.print(Son_count);Serial.print(" %=");Serial.println(Son_count % 5);
detachInterrupt(0); // запрет прерываний
#if defined (SeaLevel)
Pressure = dps.readSealevelPressure(Alt_corr); // с коррекцией на уровень моря
#else
Pressure = dps.readPressure()-380; // без коррекции к уровню моря; "-73" = коррекция данных давления (подставить нужный знак и число)
#endif
temp = dps.readTemperature()-1.3; // "-0.5" = коррекция данных температуры (подставить нужный знак и число градусов Цельсия)
attachInterrupt(0, wakeUp, LOW); // восстановить прерывания от кнопки
#if defined (debug)
Pressure = map(analogRead(1),0,1023,730*133.3,790*133.3); // для отладки резистор на а1 - задатчик давления
#endif
// для экранов с инверсным подсветом использовать lightPin2
if (light_on > 0) {
digitalWrite(lightPin1, 1);digitalWrite(lightPin2, 0);
light_on--;
}
else {digitalWrite(lightPin1, 0);digitalWrite(lightPin2, 1);} // lcd light on/off
if (Pressure > 79900){ // 600mm
P_Mid = (P_Mid + (Pressure - 79980))/2; // усреднение замеров, отбрасываем показания ниже 600мм.(сбоит бывает)
}
#if defined (debug)
if (Count_Minute >= 2){ Refresh = true; // раз в секунду
#else
if (Count_Minute >= 20){ Refresh = true; // каждые 20 мин. запоминаем усредненное значение в память и обновляем графики
#endif
if (p_count == 216) {
for (int i = 0; i < 216; i++) // сдвигаем если буфер полон
{
P_Mem[i] = P_Mem[i+1];
}
}
else {
p_count++;
}
P_Mem[p_count] = P_Mid;
if (Pressure > 79980){
P_Mid = Pressure - 79980; // новый старт усреднения
}
Count_Minute = 0;
}
#if defined (gasim_lcd)
if ((Son_count < 3)&&(!Lcd_On)) {myGLCD.disableSleep(); Lcd_On = true;} // Если разрешено, гасим дисплей через 15 мин.
if ((Son_count >= 3)&&(Lcd_On)) {myGLCD.enableSleep(); Lcd_On = false;}
#endif
// Отображение экранов
if (Lcd_On) {switch (scr_num)
{
case 0: // summary screen
Refresh = true; // Обновить отрисовку каждый цикл
myGLCD.clrScr(); // Очистка экрана
myGLCD.setFont(BigNumbers);
//Давление с BMP180
myGLCD.printNumI((Pressure / 133.3), 15, 5, 3); //расчет атмосферного давления;
myGLCD.setFont(SmallFont);
myGLCD.print(".", 57, 22);
sotki = ((Pressure / 133.3)-int(Pressure / 133.3))*100;
myGLCD.printNumI((sotki / 10), 63, 22, 1);// десятые;
myGLCD.printNumI((sotki % 10), 69, 22, 1);// сотые
myGLCD.print("Hg", 63, 6);
myGLCD.print("C", 29, 35);
myGLCD.printNumF(temp, 1, LEFT, 35); //температура
myGLCD.print("V", RIGHT, 35);
myGLCD.printNumF(analogRead(batPin)/176.5, 2, 53, 35); //напряжение питания (коэффициент xxx.x подбирается, точка и десятые обязательны)
//одна единица коэффициента (ххХ.х) =~ 0,02 В; (чем коэффициент >, тем напряжение <)
myGLCD.setFont(TinyFont);
myGLCD.print("o", 26, 33);
break;
case 1: // давление в кПа *****************************************************
Refresh = true; // Обновить отрисовку каждый цикл
myGLCD.clrScr(); // Очистка экрана
myGLCD.setFont(BigNumbers);
//Давление с BMP180
myGLCD.printNumI((Pressure / 1000), 15, 5, 3); //расчет атмосферного давления;
myGLCD.setFont(SmallFont);
myGLCD.print(".", 57, 22);
sotki = ((Pressure / 133.3) - int (Pressure / 133.3))*100;
myGLCD.printNumI((sotki / 10), 63, 22, 1);// десятые;
myGLCD.printNumI((sotki % 10), 69, 22, 1);// сотые
myGLCD.print("kPa", 63, 6);
myGLCD.print("C", 29, 35);
myGLCD.printNumF(temp, 1, LEFT, 35); //температура
myGLCD.print("V", RIGHT, 35);
myGLCD.printNumF(analogRead(batPin)/176.5, 2, 53, 35); //напряжение питания (коэффициент xxx.x подбирается, точка и десятые обязательны)
//одна единица коэффициента (ххХ.х) =~ 0,02 В; (чем коэффициент >, тем напряжение <)
myGLCD.setFont(TinyFont);
myGLCD.print("o", 26, 33);
break;
case 2: // график давления за сутки с масштабированием
if (Refresh){ // Рисуем если разрешено обновить
P_Min = P_Mem[p_count];
P_Max = P_Min; // сбросить значения
if (p_count < 72) {
p2 = 0;
}
else {
p2 = p_count - 72;
}
for (int i=p_count; i>p2 ; i--) {
if (P_Min > P_Mem[i]) {
P_Min = P_Mem[i];
}
if (P_Max < P_Mem[i]) {
P_Max = P_Mem[i];
}
}
P_Dt = P_Max - P_Min; // макс. разница
myGLCD.clrScr(); // Очистка экрана
myGLCD.setFont(TinyFont); // Установка набора символов
x=77;
if (P_Dt > 0){
for (int i=p_count; i>p2 ; i--) {
y = ((36 * (P_Max - P_Mem[i]))/P_Dt)+6;
if (x == 77) {
myGLCD.setPixel(x, y);
}
else {
myGLCD.drawLine(last_x, last_y, x, y);
}
last_x = x;
last_y = y;
x--;
}
}
myGLCD.print("Max:", LEFT, 0);
myGLCD.printNumF((P_Max +79980)/ 133.3, 2, 20, 0);
myGLCD.print("24 Hrs", RIGHT, 0);
myGLCD.print("Min:", LEFT, 42);
myGLCD.printNumF((P_Min+79980) / 133.3, 2, 20, 42);
}
break;
case 3: // график давления за трое суток
if (Refresh){ // Рисуем если разрешено обновить
P_Min = P_Mem[p_count];
P_Max = P_Min; // сбросить значения
for (int i=p_count; i>0 ; i = i - 3) {
if (P_Min > P_Mem[i]) {
P_Min = P_Mem[i];
}
if (P_Max < P_Mem[i]) {
P_Max = P_Mem[i];
}
}
P_Dt = P_Max - P_Min; // макс. разница
myGLCD.clrScr(); // Очистка экрана
myGLCD.setFont(TinyFont); // Установка набора символов
x=77;
if (P_Dt > 0){
for (int i=p_count; i>0 ; i = i - 3) {
y = ((36 * (P_Max - P_Mem[i]))/P_Dt)+6;
if (x == 77) {
myGLCD.setPixel(x, y);
}
else {
myGLCD.drawLine(last_x, last_y, x, y);
}
last_x = x;
last_y = y;
x--;
}
}
myGLCD.print("Max:", LEFT, 0);
myGLCD.printNumF((P_Max +79980)/ 133.3, 2, 20, 0);
myGLCD.print("72 Hrs", RIGHT, 0);
myGLCD.print("Min:", LEFT, 42);
myGLCD.printNumF((P_Min+79980) / 133.3, 2, 20, 42);
}
break;
/*case 4: // напряжение аккумулятора для контроля
Refresh = true; // Обновить отрисовку каждый цикл
myGLCD.clrScr(); // Очистка экрана
myGLCD.setFont(SmallFont); // Установка набора символов
myGLCD.print("Bat:", LEFT, 15);
myGLCD.printNumF(analogRead(batPin)/176.6, 2, 24, 15); //напр.батареи (коэфф. подобрать при желании)
break; */
}
if (Refresh) {myGLCD.update(); Refresh = false;} // Вывод вместимого буфера на дисплей и сброс признака обновления
} // if (Lcd_On)
#if defined (debug)
#else
} // скобка для условия сна в начале цикла в отладке не спим
#endif
attachInterrupt(0, wakeUp, LOW); // Проснемся от кнопки
// Отключить питание на 4с
#if defined (debug)
LowPower.powerDown(SLEEP_500MS, ADC_OFF, BOD_OFF);
#else
LowPower.powerDown(SLEEP_4S, ADC_OFF, BOD_OFF);
#endif
if (!key_pressed) {tik++;} else {key_pressed = false; Son_count = 0;} // в зачёт 4с. если не тыкали кнопку
#if defined (debug)
if (tik >=1) {Count_Minute++; Son_count++; tik = 0;} // минута натикала
#else
if (tik >=15) {Count_Minute++; Son_count++; tik = 0;} // минута натикала
#endif
} // Конец цикла
void wakeUp() // прерывание сна по нажатию кнопки
{ // Just a handler for the pin interrupt.
if (!in_int){
in_int = true;
detachInterrupt(0);
if (light_on > 0) {scr_num++;} // Первый тычок только подсвет
light_on = 2; // после нажатия на кнопку подсветка 2*4 = 8с.
Refresh = true; // Обновить отрисовку
key_pressed = true; // кнопку жали
if (scr_num > 3) { // цифра = количество окон (case 1, case 2, case 3)
scr_num = 0;
}
LowPower.powerDown(SLEEP_500MS, ADC_OFF, BOD_OFF); //задержка антидребезга
attachInterrupt(0, wakeUp, LOW); // восстановить прерывания от кнопки
in_int = false;
}
}
ЗдРАвия всем! Вариант барографа от уважаемого Lavr (554). Комплектацию собрал с возможностью полуавтономной работы. И вот тут столкнулся с непонятностями. При включении, как через USB так на своё питание - tp4056+LiPo(4а/ч)+mt3608, и при пяти вольтах на выходе, уже через 5-15 минут работа останавливается... и пустой белый экран. Если напряжение уменьшить до 4,25v "зависание" происходит почти через час. Но, при этом включения датчика газа заставляет дисплей сильно пульсировать. Вот уже несколько дней вожусь... не пойму в чём дело.
Во первых можно допилить, во вторых, этот экран сильно жрущий, у меня дома метеостанция на таком, с графиком, влажностью и двумя температурами.
Зато он наглядный и не надо щуриться пытаясь сломать глаза об
экранчик 48х48
Здорово! Это экранчик пошустрее моего будет. В скетче для него будет другая либа и строчка инициализации.
#include <TFT_HX8357.h>
TFT_HX8357 tft = TFT_HX8357();
tft.init();
tft.setRotation(3.14/2);
Эти строчки нужно записать вместо текущих для дисплея.
Вы сделали очень хорошую графику, которая мне очень понравилась! Если хочешь, я могу отправить тебе свой чужой файл, если хочешь посмотреть, я все исправил! Еще раз, я очень благодарен вам за то, что прислали мне вашу работу. Чтобы немного пополнить его, я также установлю литий-ионную батарею, чтобы обеспечить память измеренных состояний, потому что, как вы знаете, если по какой-либо причине нет питания, чтение начинается с нуля !!!
Какой дисплей использовали? Можно ваш Скетч
Только что переделал скетч sel_oleg !!! Я подогнал его под себя. Сфотографирую и попробую прислать как выглядит. По оборудованию все как у sel_oleg, и все тоже связано. Думаю добавить еще запасной аккумулятор, чтобы даже при кратковременном отключении электричества барограф заработал с самого начала !!! Когда я исправлю это и некоторые другие вещи, такие как регулировка яркости экрана и его выключение, я тоже отправлю это !!! Извините, если сделаю опечатку!
А где можно скачать?
Для ra6fnq!
Экран 3.5 мне очень нравится. Вы можете опубликовать свою работу? Хотелось бы сделать Барограф на таком экране от 3.5. Большое спасибо!!!
Попробуйте датчик влажности Si7021. После того, как в течении 3-4 месяцев на улице, сгнили несколько DHT22, + в наших условиях повышенной влажности зимой, показания 99,9% норма, перешёл на него. статистики пока нет.
[/quote]
Флешка умерла, а с ней и скетч...
Когда ни будь перепишу, есть недостатки.
Большое спасибо за ответ !!! Надеюсь, вы сделаете еще лучшую работу !!! Приветствие!!!
подскажите пожалуйста, залил скетч из поста #520 но дисплей ничего не показывает... проверил отдельно дисплей и датчик bme280 все работает. Может адрес дисплея какой-то не такой стандартный
подскажите пожалуйста, залил скетч из поста #520 но дисплей ничего не показывает... проверил отдельно дисплей и датчик bme280 все работает. Может адрес дисплея какой-то не такой стандартный
OLED myOLED(SDA, SCL, 8);
попробуйте убрать 8.
спасибо за ответ, нашел причину, у меня оказывается прошивка стопарилась на опросе датчика. У меня ВМЕ280. Кстати ктонибудь прикручивал к такому дисплею ВМЕ?
Здравствуйте, уважаемые участники! Упешно повторил конструкцию участника s13. Знакомый увидел и попросил сделать ему такой же барограф, только чтобы можно было выбирать между мм.рт.ст. и кПа по щелчку кнопки. Я так понял, что датчик bmp180 выдаёт данные в Па. Следовательно, чтобы получить показания в кПа, нужно содержимое соотв. переменной поделить на 1000. Что и сделал. Экран "давление в кПа" вставил вместо экрана одного из графиков давления. На первый взгляд всё вроде бы получилось - 757 мм.рт.ст. переводятся в 100 кПа, и нормально выводятся на экран, причём уже убедился в том, что это не просто статическое число, а именно изменяющиеся показания (уже наблюдал 101 кПа, а сейчас опять отыграло на 100). И всё бы здОрово, только вот никак не могу разобраться с десятыми и сотыми. Я практически ничего не понимаю в программировании, ещё меньше - в математике. Просто действую "методом тыка", по образу и подобию: увидел в тексте строчку, где содержимое переменной данных давления делится на 133,3 - ага, понимаю, что это Па переводятся в мм.рт.ст., значит, переменную надо поделить не на 133,3 а на 1000, и получу кПа. Так и сделал, но при попытке повторить то же самое с десятыми и сотыми получил отлуп - на экране всегда ,00. Ниже привожу скетч со своими правками (case1). Буду очень благодарен, если подскажете, как правильно поступить, чтобы получить значения кПа с десятыми и сотыми долями.
по скетчу пост 159 не
подскажите как подключаются кнопки для переключения трех страниц
Извените soznik, по скетчу пост 159 прошу Вас подсказать как подключаются кнопки для переключения страниц 1. Общая информация.
2. График с переключением диапазона.
3.График во весь экран с плавающеми по высоте показаниями текущего давления.)
Переключение страниц кнопка D8 на корпус (в посте 125) не переключаются.
Спасибо за Вашу разработку.
С уважением vasilii48!
!
!
Кнопки подключены к пин А2 через делитель напряжения
примерно так (+5v);(R1);(ПИН A2);(КНОПКА НА GND РЕЖИМ 1) ;(R2);(КНОПКА НА GND РЕЖИМ 2);(R3) ;(КНОПКА НА GND РЕЖИМ 3)
Если не понятно напишите нарисую схемку.
Спасибо Вам.
Все понятно. А я пытался подключать на цифровые входы, хотя было все в скетче. Ваш скетч компилируется и в ардуино 1.8.10.
Еще раз спасибо за разработку барографа и ответ на мой вопрос.
С уважением vasilii48!
Извените меня soznik у меня не получается подобрать соотношения резисторов, что бы переключались страницы или первая или вторая и все.
Не подскажите номиналы резисторов или схему с номиналами.
С уважением vasilii48!
Простите меня за мою самоуверенность.
Если 2 страницы переключаются значит вы на верном пути.
Схемка такая только используем три кнопки
диапазон АЦП 0-1023 из этого считаем сопротивление резисторов исходя из Vпит. 5 вольт
0 вольт АЦП 0, 5 вольт АЦП 1023
нам надо получить 2 диапазона АЦП 700-800 и 800-900 (их можно расширить)
Получаем КН1(s2 по схеме) АЦП=0
КН2 делитель R2&R3 КН3 делитель R2&(R3+R4)
Спасибо Вам, все понятно как рассчитать делитель под Ваш скетч или внести в скетч изменение и потом рассчитать резисторы.
ЗдРАвия всем! Вариант барографа от уважаемого Lavr (554). Комплектацию собрал с возможностью полуавтономной работы. И вот тут столкнулся с непонятностями. При включении, как через USB так на своё питание - tp4056+LiPo(4а/ч)+mt3608, и при пяти вольтах на выходе, уже через 5-15 минут работа останавливается... и пустой белый экран. Если напряжение уменьшить до 4,25v "зависание" происходит почти через час. Но, при этом включения датчика газа заставляет дисплей сильно пульсировать. Вот уже несколько дней вожусь... не пойму в чём дело.