Рад что тема, предложенная Sergey_Ch не завяла. Из за загруженности на работе("даём тепло и радость" людям), редко заглядываю на форум. К тому же опять задерживается посылка из Китая с 3.3В Ардуинкой и датчиками. Сборка, описанная в 38п. (на NANO) функционирует не выключаясь с времени описания. Погодозависимые окружающие благодарны. Переделывать на батарейное питание и дорабатывать код буду по прибытии посылки с востока.
......Если есть возможность оптимизировать энергопотребление......
Про мини 3,3V .... Потребляемый ток 1,7мА...... После "поднятия" резистора светодиода с платы ("питание" не светится) - 0,3мА. Сейчас поищу другой тестер - попробую замерить точнее.... АКБ подключен к RAW (к внутреннему стабилизатору).
Привет! Видимо туплю - не могу разобраться как сделать в данном примере например 3 экрана: сначала отдельно текущее давление, потом отдельно температуру, а потом график изменения давления. В будущем наверно еще и с датчика влажности отдельно хочется значение и график повесить. Переменную cnt увеличить, например до 4, и последовательно перебрать:
if (count1 == CNT){действие 1}
else if (count1 == CNT-1){действие 2}
else if (count1 == CNT-2){действие 3}
Но как тогда выставить время между действиями?Помогите пожалуйста разобраться.
В код пока вникнуть некогда (да и рановато мне коментировать, сам ещё не во всём разбираюсь).
Проект понравился . Перекликается с моей конструкцией .
Я делал для родителей (хотя и сам уже - погодозависимый). Поэтому - всего одна кнопка(и без графика). Архив суточный 4-х страничный(на фото одна из страниц) EEPROM - ский. Код пока не окончательный (пока половина памяти свободна). TFT - на фото , UNO , BMP180 , DS3231 .
Корпус - коробка из под ангийских булавок(иголок с ушком). Фото - экспромт на мобильник (не пинайте - я на работе). Если кого то заинтересует - будет тема с кодом и фотками в субботу - воскресенье.
Уважаемые коллеги!!! На форуме кучи разных наработок с незаконченными до конца кодами, можете кто выложить нормальный, отлаженный код, достаточно прокомментирован, с такими возможностями: в коде можно внести коррекцию по высоте над уровнем моря, интервал вывода столбцов. Сохранение данных в EEPROM. На экране только текущее отображение давления с точностью до десятых. Схемма подключения дисплея и датчика. Буду очень благодарен!
Каждый пишет код для себя (под свои требования). Берите любой код , загружайте , пробуйте , меняйте под свои требования , что не получается - ищите по форуму "букварям" и мануалам , меняйте , опять пробуйте .....
Если мне не нужна корреция по высоте (интересует абсолютное давление в точке где я нахожусь и информация о его изменнении в течении предыдущих суток (двух-трёх)(отчего голова разламывается) ) - прошу прощения ...... вникать некогда (было бы готовое решение - не жалко... Выше что то фуромчане предлагали.).
Интервал записи высоты столбцов в память считается исходя из времени одного цикла сна (max-8сек) (дальше по вашим требованиям - кол-во циклов).
Если Вам нужны десятые (сотые) доли миллиметра давления - имените тип переменной давления (int) на переменную с плавающей точкой (например - float )(это - "букварь" данного сайта.....)
Немножко модифицировал код автора, убрал контроль заряда аккумулятора, управление от кнопок, выбор диапазонов измерения, интервал - 1 сутки. Барометр стационарный, поэтому данные функции оказались не востребованы. В качестве резервного питания подключил Li-ion батарейку на 3.0v напрямую, в цепи 3.3v, на новой батарее напряжение то же самое - 3.3v, посмотрим как оно будет. Управление подсветкой дисплея, через транзистор обратной полярности, припаянный эмитером на корпус и базой через 5кОм на +5 вольт от источника питания, коллектор подключен на вход LIGHT дисплея. (Кстати, у меня почему то в отличие от дисплея автора, на вход "LIGHT" нужно подавать GND а не +3.3v). Устройство поместил в корпус KZ-51 вместе с часами из набора деталей http://www.ebay.com/itm/381432801698?_trksid=p2057872.m2749.l2649&var=650588717117&ssPageName=STRK%3AMEBIDX%3AIT
Далее планирую переделать код под базовую линию посреди экрана (на уровне 760Hg), от которой график (столбики) будут рисоваться вверх или вниз в зависимости от повышеного или пониженного давления относительно нормального. В дальнейшем, постараюсь поменять дисплей на цветной и сделать график цветным в зависимости от величины пониженного или повышенного давления.
/*********************************
Проект "Барограф"
mmHg Pa
720 95992
740 98658
760 101325
780 103991
800 106658
Pmin Pmax
РЕЖИМ ИЗМ:(740-780 ммHg = 98558 -103991 Pa)
************* Подключение дисплея Nokia 5110 к Arduino ProMini **************
// 1 - VCC---------------------------------------- +3.3v от понижающего модуля
// 2 - GND------------------------------------------------------- к общему GND
// 3 - SCE (LCD chip select (CS)-------- через R=10 kOm pin 7 Arduino ProMicro
// 4 - RST--------------------------------------------- pin 8 Arduino ProMicro
// 5 - D/C (Data/Command select)-------- через R=10 kOm pin 6 Arduino ProMicro
// 6 - DN<MOSI> (Serial data out (DIN)-- через R=10 kOm pin 5 Arduino ProMicro
// 7 - SCLK (Serial clock out (SCLK)---- через R=10 kOm pin 4 Arduino ProMicro
// 8 - LED--------------------------------------------VCC +5v Arduino ProMicro
************** Подключение датчика BMP085 к Arduino ProMicro *****************
// 1 - VCC----- VCC +5v Arduino ProMicro
// 2 - SDA--- SDA pin 2 Arduino ProMicro
// 3 - SCL--- SCL pin 3 Arduino ProMicro
// 4 - XCLR------------- не используется
// 5 - EDC-------------- не используется
// 6 - GND----------------- к общему GND
*****************************************************************************/
#include <Wire.h> // библиотека шины получения и передачи данных
#include <BMP085.h> // библиотека для работы с датчиком давления BMP085
#include <Adafruit_GFX.h> // библиотека для работы дисплея Nokia5110
#include <Adafruit_PCD8544.h>
#include <TimeHelpers.h> // библиотека для работы с периодами времени
//Инициализируем дисплей на указанных пинах ArduinoUNO
Adafruit_PCD8544 display = Adafruit_PCD8544(4, 5, 6, 7, 8);
BMP085 dps = BMP085(); // Модель Digital Pressure Sensor - BMP085
long Pressure = 0; // переменная для получения данных с датчика давления
long Pmax = 0; // переменная для установки максимального значения давления
long Pmin = 0; // переменная для установки минимального значения давления
int regim = 0; // переменная - номер режима работы
int cycle = 0; // Значение переменной - шаг изменения при выполнении цикла for
int x = 70; // Значение переменной Х - х координата дисплея
int y = 0; // Значение переменной Y – y координата дисплея
int z = 47; // координата z – 48-я строка дисплея(нижняя) по оси y для
// привязки линии от значения температуры к нулевому уровню
/*-------------- Настройка времени работы циклов измерения давления --------------------------*/
#define Diagram_interval _SEC_(1234) // переодичность вывода данных на дисплей (86400сек/70=1234 (24часа)) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// объявляем переменные у0 - у70 и присваиваем им значение 47.
// При первом цикле получения данных горизонтальная линия на 47 позиции в виде 70 точек
int y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11, y12, y13, y14, y15,
y16, y17, y18, y19, y20, y21, y22, y23, y24, y25, y26, y27, y28, y29, y30, y31,
y32, y33, y34, y35, y36, y37, y38, y39, y40, y41, y42, y43, y44, y45, y46, y47,
y48, y49, y50, y51, y52, y53, y54, y55, y56, y57, y58, y59, y60, y61, y62, y63,
y64, y65, y66, y67, y68, y69, y70=47;
long v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31,
v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47,
v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63,
v64, v65, v66, v67, v68, v69, v70=47;
void setup ()
{
Wire.begin(); // старт шины данных
display.begin(); // старт дисплея
delay(500); // время на инициализацию датчика и дисплея
dps.init(MODE_ULTRA_HIGHRES, 2700, true);
/*
значение 2700 см = 27 метров - истинная высота Энергодара над уровнем моря, !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
давление будет рассчитываться на основе этой величины.
Примечание: используйте функцию zeroCal после инициализации датчика.
dps.zeroCal (101800, 0); // Установить нулевую точку
*/
display.setContrast(60); // регулировка контраста изображения
display.clearDisplay(); // Очистка экрана и буфера дисплея
}
void loop()
{
Diagram(); // Выполняем подпрограмму построения графика давления
// выполняем подпрограмму периодичного измерения давления Meterage()
// с переодичностью, установленной в коде для переменной Diagram_interval (сек).
DO_EVERY(Diagram_interval,
{
Meterage();
}
);
} // завершаем цикл void loop
//==============================================================//
//------- ПОДПРОГРАММА ПЕРИОДИЧНОСТИ ИЗМЕРЕНИЙ ДАВЛЕНИЯ --------//
//==============================================================//
void Meterage ()
{
dps.getPressure(&Pressure); // получаем данные о давлении
delay (50);
// последовательно изменяем значение давления « v » на предыдущее при каждом цикле замера
v70 = v69; v69 = v68; v68 = v67; v67 = v66; v66 = v65; v65 = v64; v64 = v63; v63 = v62; v62 = v61; v61 = v60;
v60 = v59; v59 = v58; v58 = v57; v57 = v56; v56 = v55; v55 = v54; v54 = v53; v53 = v52; v52 = v51; v51 = v50;
v50 = v49; v49 = v48; v48 = v47; v47 = v46; v46 = v45; v45 = v44; v44 = v43; v43 = v42; v42 = v41; v41 = v40;
v40 = v39; v39 = v38; v38 = v37; v37 = v36; v36 = v35; v35 = v34; v34 = v33; v33 = v32; v32 = v31; v31 = v30;
v30 = v29; v29 = v28; v28 = v27; v27 = v26; v26 = v25; v25 = v24; v24 = v23; v23 = v22; v22 = v21; v21 = v20;
v20 = v19; v19= v18; v18 = v17; v17 = v16; v16 = v15; v15 = v14; v14 = v13; v13 = v12; v12 = v11; v11 = v10;
v10 = v9; v9 = v8; v8 = v7; v7 = v6; v6 = v5; v5 = v4; v4 = v3; v3 = v2; v2 = v1; v1 = v0; v0 = Pressure;
} // закрываем void meterage ()
//==============================================================//
//-------- ПОДПРОГРАММА ОТОБРАЖЕНИЯ ГРАНИЦ ИЗМЕРЕНИЙ -----------//
//==============================================================//
void Draw_Bord_val ()
{
// В зависимости от выбранных пределлов границ измерений рисуем отметки значений давления
int Bord_val_min = (Pmin/133.3)-700;
int Bord_val_max= (Pmax/133.3)-700;
display.setCursor(72,0);
display.println (Bord_val_max);
display.setCursor(72,10);
display.println("<=");
display.setCursor(72,21);
display.println("<H");
display.setCursor(72,32);
display.println("<=");
display.setCursor(72,41);
display.println(Bord_val_min);
} // закрываем void Draw_Bord_val ()
//==============================================================//
//--------------- ПОДПРОГРАММА ПОСТРОЕНИЯ ГРАФИКА --------------//
//==============================================================//
void Diagram()
{
dps.getPressure(&Pressure); // получаем данные о давлении
delay (50);
/********* Оформляем экран ***********/
display.setTextSize(1);
display.setTextColor(BLACK);
// устанавливаем значение мин и мах давление отображаемое на графике !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
switch (regim)
{
case 0:
{
Pmin = 98658; Pmax = 103991;
break;
}
} // закрываем (regim)
Draw_Bord_val (); //рисуем отметки значений давления
/*************** Рисуем значение текущего давления ********************/
display.setCursor(0,0);
display.print (Pressure/133.3); // выводим текущее атм. давление переведя его в мм Рт.Ст.
display.print ("Hg");
/**************** Готовим данные для вывода на график ********************/
//Значение Y (высоту линий графика 0-47) приводим пропорционально к параметрам измеряемого давления
// формируем массив из 71-го значения данных, которые будут выводиться на дисплей
int arrayDraw [71] =
{
y0 = map(v0, Pmin, Pmax, 47, 1),
y1 = map(v1, Pmin, Pmax, 47, 1),
y2 = map(v2, Pmin, Pmax, 47, 1),
y3 = map(v3, Pmin, Pmax, 47, 1),
y4 = map(v4, Pmin, Pmax, 47, 1),
y5 = map(v5, Pmin, Pmax, 47, 1),
y6 = map(v6, Pmin, Pmax, 47, 1),
y7 = map(v7, Pmin, Pmax, 47, 1),
y8 = map(v8, Pmin, Pmax, 47, 1),
y9 = map(v9, Pmin, Pmax, 47, 1),
y10 = map(v10, Pmin, Pmax, 47, 1),
y11 = map(v11, Pmin, Pmax, 47, 1),
y12 = map(v12, Pmin, Pmax, 47, 1),
y13 = map(v13, Pmin, Pmax, 47, 1),
y14 = map(v14, Pmin, Pmax, 47, 1),
y15 = map(v15, Pmin, Pmax, 47, 1),
y16 = map(v16, Pmin, Pmax, 47, 1),
y17 = map(v17, Pmin, Pmax, 47, 1),
y18 = map(v18, Pmin, Pmax, 47, 1),
y19 = map(v19, Pmin, Pmax, 47, 1),
y20 = map(v20, Pmin, Pmax, 47, 1),
y21 = map(v21, Pmin, Pmax, 47, 1),
y22 = map(v22, Pmin, Pmax, 47, 1),
y23 = map(v23, Pmin, Pmax, 47, 1),
y24 = map(v24, Pmin, Pmax, 47, 1),
y25 = map(v25, Pmin, Pmax, 47, 1),
y26 = map(v26, Pmin, Pmax, 47, 1),
y27 = map(v27, Pmin, Pmax, 47, 1),
y28 = map(v28, Pmin, Pmax, 47, 1),
y29 = map(v29, Pmin, Pmax, 47, 1),
y30 = map(v30, Pmin, Pmax, 47, 1),
y31 = map(v31, Pmin, Pmax, 47, 1),
y32 = map(v32, Pmin, Pmax, 47, 1),
y33 = map(v33, Pmin, Pmax, 47, 1),
y34 = map(v34, Pmin, Pmax, 47, 1),
y35 = map(v35, Pmin, Pmax, 47, 1),
y36 = map(v36, Pmin, Pmax, 47, 1),
y37 = map(v37, Pmin, Pmax, 47, 1),
y38 = map(v38, Pmin, Pmax, 47, 1),
y39 = map(v39, Pmin, Pmax, 47, 1),
y40 = map(v40, Pmin, Pmax, 47, 1),
y41 = map(v41, Pmin, Pmax, 47, 1),
y42 = map(v42, Pmin, Pmax, 47, 1),
y43 = map(v43, Pmin, Pmax, 47, 1),
y44 = map(v44, Pmin, Pmax, 47, 1),
y45 = map(v45, Pmin, Pmax, 47, 1),
y46 = map(v46, Pmin, Pmax, 47, 1),
y47 = map(v47, Pmin, Pmax, 47, 1),
y48 = map(v48, Pmin, Pmax, 47, 1),
y49 = map(v49, Pmin, Pmax, 47, 1),
y50 = map(v50, Pmin, Pmax, 47, 1),
y51 = map(v51, Pmin, Pmax, 47, 1),
y52 = map(v52, Pmin, Pmax, 47, 1),
y53 = map(v53, Pmin, Pmax, 47, 1),
y54 = map(v54, Pmin, Pmax, 47, 1),
y55 = map(v55, Pmin, Pmax, 47, 1),
y56 = map(v56, Pmin, Pmax, 47, 1),
y57 = map(v57, Pmin, Pmax, 47, 1),
y58 = map(v58, Pmin, Pmax, 47, 1),
y59 = map(v59, Pmin, Pmax, 47, 1),
y60 = map(v60, Pmin, Pmax, 47, 1),
y61 = map(v61, Pmin, Pmax, 47, 1),
y62 = map(v62, Pmin, Pmax, 47, 1),
y63 = map(v63, Pmin, Pmax, 47, 1),
y64 = map(v64, Pmin, Pmax, 47, 1),
y65 = map(v65, Pmin, Pmax, 47, 1),
y66 = map(v66, Pmin, Pmax, 47, 1),
y67 = map(v67, Pmin, Pmax, 47, 1),
y68 = map(v68, Pmin, Pmax, 47, 1),
y69 = map(v69, Pmin, Pmax, 47, 1),
y70 = map(v70, Pmin, Pmax, 47, 1)};
/**************** Рисуем график ********************/
for (cycle = 0; cycle <71; cycle ++) // 71 цикл вывода 71-ой линии на дисплей
{
// рисуем линии на позициях от х=70 до х=0 справа налево с значениями, полученными из массива
// с номерами согласно циклу от 0 до 71, значениями, равными от=у0 до у=70)
display.drawLine (70-cycle, arrayDraw [cycle], 70-cycle, z, BLACK);
}
display.display(); // все нарисованное выводим на экран дисплея
if (cycle >70) // Если значение циклов cycle достигло значения больше 70 (экран дисплея заполнен)
{
cycle = 0;
/* номер цикла приобретает значение = 0, начинаем убирать значение с позиции по х=0
на его месте размещаем значение с поз.1, на его - с поз.2 и так далее.
Самое свежее значение выводится на позиции 70, остальные сдвигаются на 1 влево. Самое старое
значение, полученное 71 цикл назад, удаляется безвозвратно. */
}
display.clearDisplay(); // очищаем дисплей
} // завершаем подпрограмму void Diagram()
/*********************************************************/
Уважаемый ValSerg позвольте выразить Вам респект и уважение и пожелать дальнейших успехов и удачных проектов, а также всем, у кого руки растут из головы.
Доброго времени Андрей1963 , не ругайте пожалуйста soznik, он очень нам погает когда Вы не отвечаете на наши вопросы , чтоб разобраться в вашем коде. Очень ждём когда Вы покажете нам Ваш код. Мы благодарны Вам за то , что дарите тепло людям.
43 пост - код осцилографа на этом дисплее. Остальное сейчас уже и не вспомнить..... Урывал информацию со всех форумов где упоминался 1,8" LCD....
Уважаемые. Я только осваиваю програмирование . Код (в 61 посте) писался методом проб. В английском я не силен.... С библиотеками пока одни проблемы.... Эта тема помогла освоить спящий режим , EEPROM, работу с массивами данных.... На этом фоне мой код под цветной дисплей выглядит ....... очень хреновым.... Переделывать пока некогда.
Может я немножко не грамотный, но не плохо было бы вместе с кодом, предоставить схемку подключения и типы используемых модулей, тогда можно будет и заказать их и повторить...
Более подробно о подключении расписано в статье по указаной ссылке.
2. Подключение дисплея к Arduino
Дисплей может быть подключен к Arduino по последовательному или параллельному порту. При работе с Arduino Uno или Nano более перспективным представляется подключение по последовательному порту – для него потребуется всего 3 выхода микроконтроллера. Итак, по порядку:
• Контакт 1 (GND) подключается к общей шине
• Контакт 2 (VCC) подключается к шине питания +5V, причем потребляемый ток сравнительно небольшой и дисплей можно питать от встроенного стабилизатора Arduino.
• Контакты 4, 5 и 6 подключаются к цифровым выходам Arduino, образуя последовательный интерфейс SPI:
контакт 4 – (RS) – соответствует линии CS (например 7)
контакт 5 – (RW) – соответствует линии MOSI (например 8)
контакт 6 – (E) – соответствует линии SCK (например 3)
номера контактов Arduino могут быть любыми, главное не забыть потом правильно указать их в тексте программы при инициализации дисплея.
• Контакт 15 (PSB) соединяется с общей шиной.
• Контакты 19 (A) и 20 (K) – это питание подсветки (+5V и GND соответственно). Для регулировки яркости подсветки можно использовать переменный резистор 10кОм, включенный между шинами питания и GND. Напряжение с его движка подается на контакт 19 дисплея.
Доброго времени суток!!!
Вы так подключали как здесь расписано? Если да, то я так понял что 3.3в питание уже не подойдет, потому, как эти дисплеи только 5-ти вольтовые. Если 5 на 5 вольт, значит резисторов между этими устройствами тоже не нужно?
Прикольно! Такой огромный дисплей, тут то уже есть где "разгуляться", в смысле места хватит и под температуру и под текущее давление. Кстати, какой используется датчик температуры?, посмотрел код - DS18b20 не видно, или датчик давления имеет и датчик температуры на борту? Все, заказываю такой дисплей - все таки "размер имеет значение")). Жаль, конечно, что он не OLED тот наверное будет не дешево стоить. Я привык передние панели устройств со светодиодными матрицами изготавливать оз стекла или оргстекла и покрывать их пленкой для тонировки стекол автомобиля (сверху и на сухую), вид получается очень даже отличный, но вот для таких LCD дисплейчиков, наверное такой вариант не прокатит...
Фото передних панелей, может кому пригодится идея..
Ну и очень много выдаёт в поисковике на "спящий режим ардуино" (конкретно - сейчас уже не вспомнить).
wdt_enable(WDTO_8S) это время одного цикла сна (2s;4s;8s максимум-8s) #define CNT 2 - колличество циклов сна между измерениями (раз в час - 3600сек разделить на время одного цикла)
В 38посте у меня нет подсветки (делалось всё на экономию энергии).
Уважаемые коллеги вводили регулировку подсветки. В посте 61 я я сделал регулировку в зависимости от освещения фоторезистора(на фото дисплея внизу справа) чтобы не слепил ночью.
034
intanalogPin = 0; // пин входа фоторезистора с "+" , на "-" резистор ....
035
intledPin = 6 ; // пин регулировки яркости " BL "
103
///////// регулируем яркость (что бы ночью не светил как прожектор) //////
104
105
intval = analogRead(analogPin); // Создаем переменную val для чтения analogRead
106
val= constrain(val,50 ,799); // устанавливаем нужные(посмотрим в Serial.print) границы переменной
107
val /= 4 ; // 1024 преобразуем в 255
108
analogWrite(ledPin,val); // установим яркость в соотв.с освещением
Если каким либо способом регулировать подсветку в коде 38 поста, то только тогда когда процессор не спит (после 56 строки - раз в 8 сек ; после 60 строки - вместе с измерением ). Может и неполучится ....... Что будет на выводе регулировки во время "сна" я не знаю......
Если не использовать спящий режим всё упрощается .......
Библиотеки <avr/sleep.h> <avr/wdt.h> не нужны. Из кода убирается всё относящееся к спящему режиму. Регулировку подсветки сделать в основном цикле программы (voidloop()) . Вместо delay() лучше использовать millis(). В ней задать время цикла между измерениями (тогда не будет тормозиться основная программа).
delay() - пауза в выполнении программы а millis() - время с момента старта программы .....
time = millis(); // текущее время независимо от всех процессов
voidloop(){
контролируем аккумулятор , регулируем подсветку и т.д. и т.п. - все постоянные процессы
if(time >= (loopTime + 8000)) // проверяем если прошло 8 сек...... (уже не имеет смысла отсчитывать 8сек и считать циклы по 8сек.....(count1 - тоже выпадает)) Проще - 3600000 - 1 час от измерения до измерения (кому сколько надо....) программа будет каждый раз проверять пока не будет выполнено данное условие .
Если выражение верно ТО -
{ измеряем давление пишем его в память , выполняем voidgrafik(); - рисуем всё что надо
loopTime = time; } // переменная времени начала измерения (тут приравнивается к текущему времени и начинаем всё сначала)
Конечно..... Только не millis() он от наших желаний не зависит (да и вообще ни от чего не зависит). А вот глянуть сколько там millis() натикало и от него отсчитать сколько нам надо - это - запросто....
unsigned long time ;
unsigned long loopTime;
int n = 0;
void setup(){
Serial.begin(9600);
time = millis();
}
void loop(){
time = millis();
if(time >= (loopTime + 60000)) // 1 минута для контроля
{
n = n+1 ;
Serial.println(n ) ; // колл-во минут
Serial.println(time ) ; // колл-во миллисекунд с момента старта программы
loopTime = time
}
}
Ну как то так ...... А время компа смотреть на компе ......
А я добил пока ....
/* 96 столбцов , измерения каждые полчаса , график 48 часов , логотип "BARO" (вместо него будет или
температура или что нибуть ещё) , регулировка яркости подсветки в зависимости от освещения */
//////////////// библиотеки ///////////////////
#include <U8glib.h>
#include <Adafruit_BMP085.h>
#include <Wire.h>
#include <EEPROM.h>
/////////// активизируем дисплей ////////////
U8GLIB_ST7920_128X64_4X u8g(10, 11, 12);
/////////// активизируем датчик давления ////////////
Adafruit_BMP085 bmp;
///////////////////переменные/////////////////////
unsigned long time = 0; // текущее время
unsigned long loopTime = 0; // время измерения
int Press = 0 ; // переменная давление
byte PressEP ; // высота столбца в памяти
byte addressP = 0; // адрес записи высоты столбца
int adresP = 95 ; // адрес считывания высоты столбца
byte cycle = 0 ; // колличество столбцов в графике
int adrP = 95 ; // место столбца графика
int cons = 0 ; // константа высоты столбца
int analogPin = 0; // вход фоторезистор на корпус
int ledPin = 6; // выход подсветка
void setup()
{
Wire.begin();
bmp.begin();
digitalWrite(A0,HIGH); // включаем внутренний резистор подтяжки к "+"
pinMode(ledPin, OUTPUT); // 6 пин - выход
//Serial.begin(9600); // это используется для вывода в монитор порта данных при настройке
constanta(); // если не выполнить эти две функции монитор будет пустой до
grafik(); // первого измерения
}
void loop()
{
int val = analogRead(0); // читаем аналоговый вход пишем в переменную val
//Serial.println(val);
val = map(val, 25, 1024, 90, 0); // приводим значения в обратной пропорции к выходу ШИМа и ограничиваем выходное напряжение
// 25 - min значение на 0 пине, 90 - значение ШИМа при котором достигается желаемый максимум яркости
// может достигать значения 255
//Serial.println(val);
analogWrite(6, val); // устанавливаем напряжение на 6 пине в соотв. с освещённостью
// при 3,3V подсветка потребляла 14 мА Выход держит 40мА нагрузки
// поэтому не стал ставить ни каких транзисторов
// BLA подключен непосредственно к 6 пину
time = millis();
if(time >= (loopTime + 1800000)) // если уже "пора" то
{
///////////// устанавливаем константу величины столбца в зависимости от текущего давления /////////////////
// 781(760 - 770); 771(750 - 760); 761(740 - 750); 751(730 - 740)
constanta();
///////////// пишем высоту столбца в EEPROM /////////////////////////////
EEPROM.write(addressP,(cons - Press)*3); // от константы отнимаем текущее давление , вписываем 10мм давления в (63 - 33) величину столбца, 1мм давления-3пикселя
grafik(); // рисуем график
addressP = addressP + 1; // устанавливаем следующий адрес
if (addressP >= 96) // адреса 0 - 95
{addressP = 0;}
loopTime = time;
//Serial.println(loopTime);
//delay(50);
}
}
////// ФУНКЦИИ //////
///////////// устанавливаем константу величины столбца в зависимости от текущего давления /////////////////
// 781(760 - 770); 771(750 - 760); 761(740 - 750); 751(730 - 740)
void constanta()
{
Press = bmp.readPressure()/133.3;
//Press = 755;
if ( Press < 770)
{cons = 781;}
if ( Press < 760)
{cons = 771;}
if (Press < 750)
{cons = 761;}
if (Press < 740)
{cons = 751;}
}
///////////////// рисуем график ////////////////////////
void grafik()
{ Press = bmp.readPressure()/133.3;
u8g.firstPage(); // открываем страницу
do {
u8g.setFont(u8g_font_timR24); // выбираем шрифт
u8g.setPrintPos(5, 23); // устанавливаем позицию
u8g.print(Press,1); // рисуем текущее давление
//u8g.setFont(u8g_font_unifont);
u8g.setFont(u8g_font_timR08); // шрифт поменьше
u8g.print(" MM");
u8g.drawRFrame(89,2,35,20,3);
u8g.setPrintPos(93, 15);
u8g.print("BARO");
u8g.setPrintPos(2, 33);
u8g.print("< ------ 48 chas ------ >");
//////////// рисуем пределы отображения давления ////////////
//////////// в зависимости от текущего давления ////////////
u8g.setPrintPos(1,35);
u8g.print(".");
u8g.setPrintPos(94,35);
u8g.print(".");
u8g.setPrintPos(1, 37);
u8g.print("................................ .. ");
u8g.setPrintPos(99,49);
u8g.print("..");
u8g.setPrintPos(109,42);
if (cons == 781)
{u8g.print("769");}
if (cons == 771)
{u8g.print("759");}
if (cons == 761)
{u8g.print("749");}
if (cons == 751)
{u8g.print("739");}
u8g.setPrintPos(1,64);
u8g.print("................................ .. ");
if (cons == 781)
{u8g.print("760");}
if (cons == 771)
{u8g.print("750");}
if (cons == 761)
{u8g.print("740");}
if (cons == 751)
{u8g.print("730");}
adresP = addressP ; // начальный адрес чтения - текущий адрес записи
for (cycle = 0; cycle <96; cycle ++) // 96 циклов вывода линий на дисплей
stolb(); // рисуем график отдельными столбцами (96 шт.)
} while( u8g.nextPage() ); // закрываем страницу
//delay(10);
}
void stolb()
{
PressEP = EEPROM.read(adresP); // читаем из памяти высоту столбца
u8g.drawLine (adrP, PressEP, adrP ,64); // рисуем столбец
//u8g.drawPixel(adrP ,PressEP) // линия (спасибо soznik)
//u8g.drawLine (adrP, PressEP, adrP ,PressEP+1); // линия толщиной 2 пикселя (спасибо soznik)
adrP = adrP - 1; // устанавливаем место следующего столбца
if (adrP < 0) // следим за местом
{adrP = 95 ; } // при переходе через начало ставим в конец
adresP = adresP - 1 ; // устанавливаем следующий адрес памяти
if (adresP < 0) // следим за адресом
{adresP = 95 ;}
}
Мужики не могу найти ссылку на библиотеку TimeHelpers от автора Leshak.
Спасибо за помощь
Попробуй здесь. Или спроси у автора, ссылка в теме есть.
https://bitbucket.org/alxarduino/leshakutils/downloads
В самом начале, я в статье выражал благодарность автору библиотеки
Большое спасибо участнику форума Leshak за представленную библиотеку работы с функцией времениhttp://alxarduino.blogspot.ru/2013/08/delay.html.
Рад что тема, предложенная Sergey_Ch не завяла. Из за загруженности на работе("даём тепло и радость" людям), редко заглядываю на форум. К тому же опять задерживается посылка из Китая с 3.3В Ардуинкой и датчиками. Сборка, описанная в 38п. (на NANO) функционирует не выключаясь с времени описания. Погодозависимые окружающие благодарны. Переделывать на батарейное питание и дорабатывать код буду по прибытии посылки с востока.
......Если есть возможность оптимизировать энергопотребление......
Про мини 3,3V .... Потребляемый ток 1,7мА...... После "поднятия" резистора светодиода с платы ("питание" не светится) - 0,3мА. Сейчас поищу другой тестер - попробую замерить точнее.... АКБ подключен к RAW (к внутреннему стабилизатору).
0,362мА
Привет! Видимо туплю - не могу разобраться как сделать в данном примере например 3 экрана: сначала отдельно текущее давление, потом отдельно температуру, а потом график изменения давления. В будущем наверно еще и с датчика влажности отдельно хочется значение и график повесить. Переменную cnt увеличить, например до 4, и последовательно перебрать:
Но как тогда выставить время между действиями?Помогите пожалуйста разобраться.
Если кого то заинтересует - будет тема с кодом и фотками в субботу - воскресенье.
Ждем - ждем, воскресенья проходят, а кода и фото все нет!(( Очень хотелось бы!
Уважаемые коллеги!!! На форуме кучи разных наработок с незаконченными до конца кодами, можете кто выложить нормальный, отлаженный код, достаточно прокомментирован, с такими возможностями: в коде можно внести коррекцию по высоте над уровнем моря, интервал вывода столбцов. Сохранение данных в EEPROM. На экране только текущее отображение давления с точностью до десятых. Схемма подключения дисплея и датчика. Буду очень благодарен!
Если кого то заинтересует - будет тема с кодом и фотками в субботу - воскресенье.
Ждем - ждем, воскресенья проходят, а кода и фото все нет!(( Очень хотелось бы!
Прошу прощения ..... Очень редко тут бываю .
Код писался до освоения функций и массивов ....... Переделывать сейчас времени нету ......
Когда будет полегче на работе перепишу под 3,5 дюймовый TFT (совсем слепой стал) с использованием масивов, EEPROM и т.д. в пределах освоенного .....
Уважаемый ValSerg.
Схема в основном из первого поста.
Каждый пишет код для себя (под свои требования). Берите любой код , загружайте , пробуйте , меняйте под свои требования , что не получается - ищите по форуму "букварям" и мануалам , меняйте , опять пробуйте .....
Если мне не нужна корреция по высоте (интересует абсолютное давление в точке где я нахожусь и информация о его изменнении в течении предыдущих суток (двух-трёх)(отчего голова разламывается) ) - прошу прощения ...... вникать некогда (было бы готовое решение - не жалко... Выше что то фуромчане предлагали.).
Интервал записи высоты столбцов в память считается исходя из времени одного цикла сна (max-8сек) (дальше по вашим требованиям - кол-во циклов).
Если Вам нужны десятые (сотые) доли миллиметра давления - имените тип переменной давления (int) на переменную с плавающей точкой (например - float )(это - "букварь" данного сайта.....)
Уважаемый Андрей1963.
Какой испльзовали дисплей (можно с фото ).
С таким контроллером нашел только 1,8 дюйма TFT SPI 128*160
Уважаемый soznik.
Я точно когда нибуть сорвусь......
Даже на моих хрреновых фото (телефоном сделаных) видно что ОНО и используется ..........
Немножко модифицировал код автора, убрал контроль заряда аккумулятора, управление от кнопок, выбор диапазонов измерения, интервал - 1 сутки. Барометр стационарный, поэтому данные функции оказались не востребованы. В качестве резервного питания подключил Li-ion батарейку на 3.0v напрямую, в цепи 3.3v, на новой батарее напряжение то же самое - 3.3v, посмотрим как оно будет. Управление подсветкой дисплея, через транзистор обратной полярности, припаянный эмитером на корпус и базой через 5кОм на +5 вольт от источника питания, коллектор подключен на вход LIGHT дисплея. (Кстати, у меня почему то в отличие от дисплея автора, на вход "LIGHT" нужно подавать GND а не +3.3v). Устройство поместил в корпус KZ-51 вместе с часами из набора деталей http://www.ebay.com/itm/381432801698?_trksid=p2057872.m2749.l2649&var=650588717117&ssPageName=STRK%3AMEBIDX%3AIT
Далее планирую переделать код под базовую линию посреди экрана (на уровне 760Hg), от которой график (столбики) будут рисоваться вверх или вниз в зависимости от повышеного или пониженного давления относительно нормального. В дальнейшем, постараюсь поменять дисплей на цветной и сделать график цветным в зависимости от величины пониженного или повышенного давления.
Уважаемый ValSerg позвольте выразить Вам респект и уважение и пожелать дальнейших успехов и удачных проектов, а также всем, у кого руки растут из головы.
Спасибо Сергей!!! И Вам НЕ СДАВАТЬСЯ!!!
Доброго времени Андрей1963 , не ругайте пожалуйста soznik, он очень нам погает когда Вы не отвечаете на наши вопросы , чтоб разобраться в вашем коде. Очень ждём когда Вы покажете нам Ваш код. Мы благодарны Вам за то , что дарите тепло людям.
С уважением Алекс
Спасибо Вам, За вашу помощь в освоении проекта.
Ваш Алекс.
Уважаемый Андрей1963, если не трудно, скиньте пожалуйста ссылочки, где можно почитать о управлении Вашим дисплеем. Спасибо!
Прошу прощения.
Я пользовался темой
http://arduino.ru/forum/proekty/mini-ostsillograf-arduino-na-lcd-5110
43 пост - код осцилографа на этом дисплее. Остальное сейчас уже и не вспомнить..... Урывал информацию со всех форумов где упоминался 1,8" LCD....
Уважаемые. Я только осваиваю програмирование . Код (в 61 посте) писался методом проб. В английском я не силен.... С библиотеками пока одни проблемы.... Эта тема помогла освоить спящий режим , EEPROM, работу с массивами данных.... На этом фоне мой код под цветной дисплей выглядит ....... очень хреновым.... Переделывать пока некогда.
Ничего, мы все тут такие)) и нечего скромничать)))
Спасибо за ссылочку, да, для изучения тут непаханные поля - и жизни не хватит), но все же стремиться нужно, будем читать..
Да "за ради бога"..... Будет времени поболе - займёмся посерьезнее.
Доброго вреиени суток.
Огромное спасибо участнику форума Андрей1963 за проект барографа пост # 38.
Предлогаю редакцию данного проекта с использованием дисплея
LCD 12864 на контролере ST7920. Размером 3,2"
По данному дисплею пользовался статьей
http://nnm.me/blogs/pencraft/arduino-i-graficheskiy-displey-128x64-s-kontrollerom-st7920/page2/
При подгонке графика под новый размер (100 столбцов по 40 точек)
разобрался с принципом построения графиков.
В редакции пост # 49 есть ошибка в выводе значения дясятых долей температуры.
Здесь исправил.
В строках 7 и 35 проставить рабочии значения
В строках 123-130 выбрать что выводить на экран
температуру или напряжение
Добрый день!!!
Может я немножко не грамотный, но не плохо было бы вместе с кодом, предоставить схемку подключения и типы используемых модулей, тогда можно будет и заказать их и повторить...
Спасибо!
Доброго времени суток.
Смотрите пост № 1 в этой теме.
Это камень скорее всего в мой огород.
Немогу прикрепить фото.
Датчик давления подключается так-же как и в посте № 1
Rx,Tx выводы А4, А5 Ардуины. Питание в зависимости от исполнеия модуля, у меня 5 вольтовое.
Дисплей подключается 5-ю проводами 3 данные и 2 питание.
Указанно в коментариях (строка 14 ).
Более подробно о подключении расписано в статье по указаной ссылке.
Спасибо!!!
С аванса закажу и такой дисплейчик, так что, если что, буду задавать вопросы!))
Более подробно о подключении расписано в статье по указаной ссылке.
2. Подключение дисплея к Arduino
Дисплей может быть подключен к Arduino по последовательному или параллельному порту. При работе с Arduino Uno или Nano более перспективным представляется подключение по последовательному порту – для него потребуется всего 3 выхода микроконтроллера. Итак, по порядку:
• Контакт 1 (GND) подключается к общей шине
• Контакт 2 (VCC) подключается к шине питания +5V, причем потребляемый ток сравнительно небольшой и дисплей можно питать от встроенного стабилизатора Arduino.
• Контакты 4, 5 и 6 подключаются к цифровым выходам Arduino, образуя последовательный интерфейс SPI:
контакт 4 – (RS) – соответствует линии CS (например 7)
контакт 5 – (RW) – соответствует линии MOSI (например 8)
контакт 6 – (E) – соответствует линии SCK (например 3)
номера контактов Arduino могут быть любыми, главное не забыть потом правильно указать их в тексте программы при инициализации дисплея.
• Контакт 15 (PSB) соединяется с общей шиной.
• Контакты 19 (A) и 20 (K) – это питание подсветки (+5V и GND соответственно). Для регулировки яркости подсветки можно использовать переменный резистор 10кОм, включенный между шинами питания и GND. Напряжение с его движка подается на контакт 19 дисплея.
Доброго времени суток!!!
Вы так подключали как здесь расписано? Если да, то я так понял что 3.3в питание уже не подойдет, потому, как эти дисплеи только 5-ти вольтовые. Если 5 на 5 вольт, значит резисторов между этими устройствами тоже не нужно?
Спасибо!!!
Получилось загрузить.
Всё верно кроме подсветки. Я буду делать регулируемую подсветку т.е. А- + 5V , К через полевик на корпус
и через фоторезистор на аналоговый вход.
Пока собрано на макетной UNO на pro mini сегодня только начал
Выводы SPI будут подключены у портам D 4,5,6.
Да и не забывайте про регулеровку контрастности дисплея вывод 3.
На моём дисплее вывод 15 под SPI уже на корпусе и рег. контрастности на плате.
Желаю удачи.
Прикольно! Такой огромный дисплей, тут то уже есть где "разгуляться", в смысле места хватит и под температуру и под текущее давление. Кстати, какой используется датчик температуры?, посмотрел код - DS18b20 не видно, или датчик давления имеет и датчик температуры на борту? Все, заказываю такой дисплей - все таки "размер имеет значение")). Жаль, конечно, что он не OLED тот наверное будет не дешево стоить. Я привык передние панели устройств со светодиодными матрицами изготавливать оз стекла или оргстекла и покрывать их пленкой для тонировки стекол автомобиля (сверху и на сухую), вид получается очень даже отличный, но вот для таких LCD дисплейчиков, наверное такой вариант не прокатит...
Фото передних панелей, может кому пригодится идея..





Вопрос Андрею1963.
Какими источниками вы пользовались по функции watchdog и sleep?
Ардуиной занимаюсь менее 3-х месяцев.
Никак не могу разобратся в скетч с поста №38
Вставляю строчку ШИМ.
И начинается ерунда 26 сек. подсветка горит и 26 сек. потухшая.
Независимо от значения
watchdog стоит 8 сек
И где эта собака зарыта не могу понять.
Заказал сегодня вот такой дисплейчик, смотрю на него много описания и темок на форуме, по приходу займусь...
1.3" I2C IIC Serial 128X64 SH1106 OLED LCD LED Display Module for Arduino Blue
http://arduino.ru/forum/obshchii/spyashchii-rezhim
Ну и очень много выдаёт в поисковике на "спящий режим ардуино" (конкретно - сейчас уже не вспомнить).
wdt_enable(WDTO_8S) это время одного цикла сна (2s;4s;8s максимум-8s) #define CNT 2 - колличество циклов сна между измерениями (раз в час - 3600сек разделить на время одного цикла)
В 38посте у меня нет подсветки (делалось всё на экономию энергии).
Уважаемые коллеги вводили регулировку подсветки. В посте 61 я я сделал регулировку в зависимости от освещения фоторезистора(на фото дисплея внизу справа) чтобы не слепил ночью.
034
int
analogPin = 0;
// пин входа фоторезистора с "+" , на "-" резистор ....
035
int
ledPin = 6 ;
// пин регулировки яркости " BL "
103
///////// регулируем яркость (что бы ночью не светил как прожектор) //////
104
105
int
val = analogRead(analogPin);
// Создаем переменную val для чтения analogRead
106
val= constrain(val,50 ,799);
// устанавливаем нужные(посмотрим в Serial.print) границы переменной
107
val /= 4 ;
// 1024 преобразуем в 255
108
analogWrite(ledPin,val);
// установим яркость в соотв.с освещением
Если каким либо способом регулировать подсветку в коде 38 поста, то только тогда когда процессор не спит (после 56 строки - раз в 8 сек ; после 60 строки - вместе с измерением ). Может и неполучится ....... Что будет на выводе регулировки во время "сна" я не знаю......
Удачи!
Большое спасибо.
Я убрал спящий режим.
Вместо wdt_enable(WDTO_8S) поставил delay (8000) /
Сейчас регулировка яркости изменяется через 8 сек.
Можно уменьшить задержку и увеличить кол-во циклов .
А со спящим режимом как я понял рег-ка не получится.
Только я так и не смог разобратся откуда взялось этот странный цикл вкл.-выкл. 26 сек.
На led 12864 работает все нормально.
Сейчас пытаю TFT 2.2" на ILI 9341.
Понемногу учусь.
Если не использовать спящий режим всё упрощается .......
Библиотеки <avr/sleep.h> <avr/wdt.h> не нужны. Из кода убирается всё относящееся к спящему режиму. Регулировку подсветки сделать в основном цикле программы (
void
loop
())
. Вместо delay() лучше использовать millis(). В ней задать время цикла между измерениями (тогда не будет тормозиться основная программа).Будет время - протестим и такой вариант.
Функцию millis() еще не изучал.
Надо попробовать. Хотя в этой прграмме применение deley() мешает только скорости обновления
данных об освещении.
Питание барографа сетевое , на аккамуляторе дежурное ( для него контроль напряжения ).
А с millis() разберусь попробую вставить.
Где-то вот так функция milis() .
delay() короче . Но millis() интересней. Буду вставлять.
delay() - пауза в выполнении программы а millis() - время с момента старта программы .....
time = millis(); // текущее время независимо от всех процессов
void
loop
(){
контролируем аккумулятор , регулируем подсветку и т.д. и т.п. - все постоянные процессы
if
(time >= (loopTime + 8000)) // проверяем если прошло 8 сек...... (уже не имеет смысла отсчитывать 8сек и считать циклы по 8сек.....(
count1 - тоже выпадает))Проще -
3600000 - 1 час от измерения до измерения (кому сколько надо....) программа будет каждый раз проверять пока не будет выполнено данное условие .Если выражение верно ТО -
{ измеряем давление пишем его в память ,
выполняем
void
grafik(); - рисуем всё что надо
loopTime = time; } // переменная времени начала измерения (тут приравнивается к текущему времени и начинаем всё сначала)
}
Ну как то так .....
Значит это можно убрать.
А увеличить millis().
Конечно..... Только не millis() он от наших желаний не зависит (да и вообще ни от чего не зависит). А вот глянуть сколько там millis() натикало и от него отсчитать сколько нам надо - это - запросто....
Получилось .
Сегодня уже поздно , а завтра подчистю и добавлю комментарии.
Прорисовку графика и прочей информации вывел из под функции millis().
Сейчас все измерения на дисплей выводятся без задержки.
Да всё очень сильно упрощается.... Меня сначала озадачил интервал 14,4 мин. Потом дошло...... при помощи калькулятора.
У меня практически тоже получилось.
128
//u8g.drawLine (adrP, PressEP, adrP,63); // рисуем столбец (PressEP вместо 63 - получим одну линию)
129
u8g.drawLine (adrP, PressEP, adrP ,PressEP);
Только здесь было u8g.drawPixel( adrP, PressEP);
Мне линией не понравилось дисплей мало контрастный столбиками красивей.
Можно попробовать вот так u8g.drawLine (adrP, PressEP, adrP ,PressEP+1); по 2 пикселя.
Да ещё есть вопрос. У меня построение графика похоже спешит.
Видимо в ардуине кварц совсем не точный.
Как на мониторе вместо "????" вывести время компьютера.
Ну как то так ...... А время компа смотреть на компе ......
А я добил пока ....
Так я пробовал устал считать решил сделать по другому.
В предидущих вариантах у Вас был добавлен сброс EEPROM.
Сброшу и посмотрю за какое время пройдет график после пересчитаю.
Надо сначала доделать батарейное питание (сегодня днём опять отключали элек-во)
Фоторезистор у меня уже подключен делителем +5 ---- фото ---- A1 ---- R ---- КОРПУС
Переделовать не буду и полевик на подсветку стоит.
А вот транспорант BARO я увас позаимствовал.
Понравился он мне. Надо сейчас заставить моргать "BATT".
Почему-то не хочет работать:
Хотел заставить моргать "BATT"