Вы сделали очень хорошую графику, которая мне очень понравилась! Если хочешь, я могу отправить тебе свой чужой файл, если хочешь посмотреть, я все исправил! Еще раз, я очень благодарен вам за то, что прислали мне вашу работу. Чтобы немного пополнить его, я также установлю литий-ионную батарею, чтобы обеспечить память измеренных состояний, потому что, как вы знаете, если по какой-либо причине нет питания, чтение начинается с нуля !!!
Только что переделал скетч 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 "зависание" происходит почти через час. Но, при этом включения датчика газа заставляет дисплей сильно пульсировать. Вот уже несколько дней вожусь... не пойму в чём дело.
Подскажите почему дисплей 5110 (синего цвета ) через несколько часов темнеет, я заменил на другой думал бракованный и то же самое( как будто контрастность меняется)?
Так же как и в комментарии выше, синий дисплей через некоторое время покрывается мусором.
Через месяц вообще перестал работать. Подсветка есть, информации нет. Сброс ардуины или отключение питания помогали раза с 5го - 10го, и снова дисплей через некоторое время в мусоре.
Достал другой дисплей (покупал отдельно без платы) плату взял от треснутого, который китаец прислал упаковав неаккуратно, перепаял.
Все заработало отлично.
3 дисплея хоть и не синие, но пожелтели со временем. Походу все такие. Еще их надо намертво припаивать иначе глючат. Мне кажется самый крутой вариант это с электронными чернилами, еслиб кто то замутил такой проект.
В ответ на пост 597 хочу предложить для пробы библиотеку ST7735.
Библиотека русифицирована занимает места меньше чем адафруит.
Все штифты в папке.
Если кому надо пробуйте. https://disk.yandex.ru/d/f0f06r1aAUTIoQ
Доброго всем времени. Попробовал собрать на FTF дисплее 2,4 дюйма на скетче из поста https://arduino.ru/forum/proekty/arduino-barometr-barograf?page=9#comment-341292 подправив скетч под этот дисплей (библиотека UTFT правленная). но столкнулся с такой проблеммой что данные давления очень сильно скачут - минимальные от сотни мм рт а максимальные до нескольких сотен тысяч мм рт. и график конечно получается полная фигня. Хотя текущее давление показывает верно. Может кто окажет помощь в решении этой проблеммы.
//Open-Smart screen resolution of 176X220 pixels.
#include <UTFT.h>
#include <Wire.h>
#include "i2c.h"
#include "i2c_BMP280.h"
BMP280 bmp280;
// Declare which fonts we will be using
extern uint8_t BigFont[];
#define wide_win 219
#define high_win 143 //175-14+14+4
long arr_y[wide_win];
//***********************************************//
// If you use OPEN-SMART TFT breakout board //
// You need to add 5V-3.3V level converting circuit.
// Of course you can use OPEN-SMART UNO Black version with 5V/3.3V power switch,
// you just need switch to 3.3V.
// The control pins for the LCD can be assigned to any digital or
// analog pins...but we'll use the analog pins as this allows us to
//----------------------------------------|
// TFT Breakout -- OPEN-SMART UNO Black /Red
// GND -- GND
// 3V3 -- 3.3V
// CS -- A3
// RS -- A2
// WR -- A1
// RD -- 3.3V
// RST -- A0
// LED -- GND
// DB0 -- 8
// DB1 -- 9
// DB2 -- 10
// DB3 -- 11
// DB4 -- 4
// DB5 -- 13
// DB6 -- 6
// DB7 -- 7
// Remember to change the model parameter to suit your display module!
//#define LCD_CS A3 // Chip Select goes to Analog 3
//#define LCD_RS A2 // Command/Data goes to Analog 2
//#define LCD_WR A1 // LCD Write goes to Analog 1
//#define LCD_RST A0 //
//UTFT tft(LGDP4524,LCD_RS,LCD_WR,LCD_CS,LCD_RST);
UTFT myGLCD(8,A0,A1,A2,A3); // подключаем дисплей 240*400
//------------Functions----------------------------------------------------------
//----Maxium
long Max(long a,long b){
long maxi;
if (a > b)
{
maxi = a;
}
else
{
maxi = b;
}
//println "(a=";a;" b=";b;") ";
return maxi;
}
//----Minimum
long Min(long a,long b){
long mini;
if (a < b)
{
mini = a;
}
else
{
mini = b;
}
//println "(a=";a;" b=";b;") ";
return mini;
}
void setup()
{
// randomSeed(analogRead(0));
// Setup the LCD
// tft.InitLCD();
myGLCD.InitLCD(); // подключаем дисплей
myGLCD.clrScr(); // очищаем дисплей
myGLCD.setFont(BigFont);
// Serial.begin(115200);
Serial.print("Probe BMP280: ");
if (bmp280.initialize()) Serial.println("Sensor found");
else
{
Serial.println("Sensor missing");
while (1) {}
}
// onetime-measure:
bmp280.setEnabled(0);
bmp280.triggerMeasurement();
}
//----------main---------------------------------------------------------
void loop()
{
unsigned long time;
long y,y_next,x2,y2,y_max,y_min,delta_xy;
float p,oldp,temperature;
unsigned int mm_rs;
bmp280.awaitMeasurement();
bmp280.getTemperature(temperature);
bmp280.getPressure(p);
mm_rs=round(p*7.500637e-3);
// static float meters, metersold;
// bmp280.getAltitude(meters);
// metersold = (metersold * 10 + meters)/11;
bmp280.triggerMeasurement();
Serial.print(" Pressure: ");
Serial.print(p);
Serial.print(" p ; Pressure: ");
Serial.print(mm_rs);
Serial.print(" mm.rt.st; T: ");
Serial.print(temperature);
Serial.println(" C");
//------- Draw gyperbola grid
//myGLCD.clrScr();
// myGLCD.setColor(0, 0, 255); //blue color
// myGLCD.setBackColor(0, 0, 0);
// for (int i=1; i<176; i+=10)
// myGLCD.drawLine(1, i, 176-i, 1);
// myGLCD.setColor(0, 255, 0); //green color
// myGLCD.setBackColor(0, 0, 0);
// for (int i=1; i<176; i+=10)
// myGLCD.drawLine(175, 176-i, i, 175);
//----------------------------------------------
// Clear the screen and draw the frame
myGLCD.clrScr();
//-------Draw digital values on tft screen----------
myGLCD.setFont(BigFont);
myGLCD.setBackColor(64, 64, 64);
myGLCD.setColor(255,255,0);
myGLCD.print("Pressure=",1, 1);
myGLCD.setColor(255, 255, 255);
myGLCD.setBackColor(0, 0, 0);
myGLCD.printNumI(mm_rs, 145, 1);
myGLCD.setBackColor(0, 0, 0);
myGLCD.setColor(0,255,0);
myGLCD.print("Averaged press",0, 20);
myGLCD.print("ure values are",0, 37);
myGLCD.print("output after ",0, 52);
myGLCD.print("393 seconds. ",0, 67);
myGLCD.setColor(0,255,255);
myGLCD.print("A total of 220",0, 82);
myGLCD.print("points in 24 h",0, 97);
myGLCD.print("(X-axis=24 h) ",0, 112);
myGLCD.setColor(255,255,0);
myGLCD.print("The Y-axis is ",0, 127);
myGLCD.print("autoscaled. ",0, 142);
// tft.setBackColor(47, 79, 79);
myGLCD.setColor(255,0,0);
myGLCD.print("Firmware 10.5 ",0, 162);
//---------Create values of massive-------------------
for ( int x = 0; x<=wide_win ;x++){
arr_y[x]=p;
//arr_y[x]=100000+4000*sin(x/10.0)*exp(0.004*x);
//Serial.println (arr_y[x]);
}
oldp=p;
//-----------begin try infinity loop--------------------
label1:
for ( int x = 0; x<197 ;x++) //x<393 это задержка 392.7 сек * 220 точек = 86400 сек (24 часа)
{
bmp280.awaitMeasurement();
bmp280.getTemperature(temperature);
bmp280.getPressure(p);
mm_rs=round(p*7.500637e-3);
oldp = (oldp * 10 + p)/11;
bmp280.triggerMeasurement();
delay(1000); // задержка 1 сек
}
Serial.print(" Pressure: ");
Serial.print(p);
Serial.print(" p ; Pressure: ");
Serial.print(mm_rs);
Serial.print(" mm.rt.st; T: ");
Serial.print(temperature);
Serial.println(" C");
/*
//-----Shift array to right on one element----------
for ( int x = 0; x<=wide_win ;x++){
arr_y[wide_win-x]=arr_y[wide_win-x-1];
//Serial.println (arr_y[x]);
}
//---Save first element array by load pressure---------
arr_y[0]=p;
*/
//-----Shift array to left on one element----------
for ( int x = 0; x<=wide_win-1 ;x++){
arr_y[x]=arr_y[x+1];
//Serial.println (arr_y[x]);
}
//---Save last element array by load pressure---------
arr_y[wide_win]=oldp;
//------Calculate max and min value of massive-----
y_max=arr_y[0];
y_min=arr_y[0];
for (int x = 1; x<=wide_win ;x++){
y_max=Max(y_max,arr_y[x]);
//Serial.print ("y_max=");
//Serial.println (y_max);
y_min=Min(y_min,arr_y[x]);
//Serial.print ("y_min=");
//Serial.println (y_min);
}
delta_xy=y_max-y_min;
Serial.println (y_max);
Serial.println (y_min);
Serial.println (delta_xy);
// Clear the screen and draw the frame
myGLCD.clrScr();
//-------Draw digital values on tft screen----------
myGLCD.setFont(BigFont);
myGLCD.setBackColor(64, 64, 64);
myGLCD.setColor(255,255,0);
myGLCD.print("Pmm=",1, 1);
myGLCD.setColor(255, 255, 255);
myGLCD.setBackColor(0, 0, 0);
myGLCD.printNumI(mm_rs, 60, 1);
myGLCD.setBackColor(153, 0, 102);
myGLCD.setColor(255,255,0);
myGLCD.print("Max=",158, 1);
myGLCD.setColor(255, 255, 255);
myGLCD.setBackColor(0, 0, 0);
myGLCD.printNumI(y_max*7.500637e-3, 234, 1);
myGLCD.setBackColor(64, 64, 64);
myGLCD.setColor(0,255,0);
myGLCD.print("TdC=",1, 163-2);
myGLCD.setColor(255, 255, 255);
myGLCD.setBackColor(0, 0, 0);
myGLCD.printNumI(round(temperature), 60, 163-2);
myGLCD.setBackColor(0, 0, 128);
myGLCD.setColor(255,255,0);
myGLCD.print("Min=",110, 163-2);
myGLCD.setColor(255, 255, 255);
myGLCD.setBackColor(0, 0, 0);
myGLCD.printNumI(y_min*7.500637e-3, 186, 163-2);
//------- Draw crosshairs
myGLCD.setColor(0, 0, 255); //blue color
myGLCD.setBackColor(0, 0, 0);
myGLCD.drawLine(109, 15, 109, 160);
myGLCD.drawLine(1, 88, 218, 88);
for (int i=10; i<211; i+=9)
myGLCD.drawLine(i, 86, i, 90);
for (int i=18; i<154; i+=10)
myGLCD.drawLine(107, i, 111, i);
//----------resize Y-axiss and draving line-------
myGLCD.setColor(255,255,0); //yellow color
for (int x = 0; x<=wide_win-1 ;x++)
{
y=high_win-(arr_y[wide_win-1-x]-y_min)*high_win/delta_xy + 17;
y_next=high_win-(arr_y[wide_win-1-x+1]-y_min)*high_win/delta_xy + 17;
//Serial.println (y);
myGLCD.drawLine(wide_win-1-x,y,wide_win-1-x+1,y_next);
//tft.drawPixel(x,y);
}
// Serial.print("Time: ");
// time = millis();
//---выводит количество миллисекунд с момента начала выполнения программы
// Serial.println(time);
delay (10); //T=1000ms debug mode
goto label1; // :)
}
встречали мы велосипедистов из Москвы как-то раз у нас, они на Эльбрус на 3500 поднялись, там их снегом немного засыпало и поморозило несколько, оттуда они двинулись на Усть-Джегуту, в п.Московском и поднялись к нам на Апхуа, хорошая у них вышла поездка, более 3 тысяч километров )))
PS да сам два раза переболел модным диагнозом, пытаюсь потихоньку восстанавливаться
Может кто поможет. На ST7735 все работает, перешел на IPS ST7789 240x320. Решил для дачи сделать часы с кукушкой, а заодно барометр с графиком давления. Все хорошо, но график работает только в сторону увеличения, в сторону уменьшения по
#include <DS3231.h>
#include <GyverBME280.h>
#include <NST7789.h>
#include <DFRobotDFPlayerMini.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include <SPI.h>
#define sclk 13
#define sid 11
#define cs 10
#define dc 9
#define rst 8 // you can also connect this to the Arduino reset
ST7789 tft = ST7789(dc, rst, cs);
// Color definitions
//#define TOMAT 0xD087
#define LATUN (192, 96, 0)
#define ORANG (255,69,0)
#define SHOKOLAD (160,82,45)
//#define ZEL (77, 189, 1)
#define Silver (192, 192, 192)
//#define GOLUB 0x1C7F
//#define TRAVA 0x8585
#define BIRUZA 74, 219, 192
#define BLACK 0x0000
//#define DGREEN 0x0300
#define GOLD 0xFEA0
//#define SINIY 0x27ff
#define DGREY 0x7BEF /* 128, 128, 128 */
//#define MORKVA 0xFA20
//#define AQUA 0x07FF
#define TEAL 0x0410
GyverBME280 bmp; // Создание обьекта bme
DS3231 rtc(A3, A2);
boolean Refresh = true;
#define zapolnen // Заполнение графика 1
long P_win = 155*133.3; // Верхняя граница абс. графика по умолчанию до сдвига (600 + 180) = 780
uint16_t Pressure;
unsigned char p_count, p2;
long P_Min, P_Max, P_Mid, P_Dt;
uint16_t P_Mem[401]; //-79980 = 600мм (3 day 20min memory, 72 per 24 hour)
signed char x, y, last_x, last_y;
char Cur_Minute = 0, Last_Minute = 0, Count_Minute = 0;
Time t; // Инициализация структуры
char d = (1, 2, 3, 4, 5, 6, 7);
DFRobotDFPlayerMini myDFPlayer;
SoftwareSerial mySoftwareSerial(2, 3); // RX, TX
int Hor, Min, Sec;
extern uint8_t mik_61[];
//extern uint8_t cifr[];
extern uint8_t nik[];
//################# ZVUK #####################
void Zvuk() {
Hor = t.hour;
Min = t.min;
Sec = t.sec;
if(Min == 0 && Sec == 0) {
switch (Hor) // Каждый час кукушка будет куковать
{
case 1:
case 13:
myDFPlayer.play(1); // проигрываем файл mp3/0001.mp3
break;
case 2:
case 14:
myDFPlayer.play(2); // проигрываем файл mp3/0002.mp3
break;
case 3:
case 15:
myDFPlayer.play(3); // проигрываем файл mp3/0003.mp3
break;
case 4:
case 16:
myDFPlayer.play(4); // проигрываем файл mp3/0004.mp3
break;
case 5:
case 17:
myDFPlayer.play(5); // проигрываем файл mp3/0005.mp3
break;
case 6:
case 18:
myDFPlayer.play(6); // проигрываем файл mp3/0006.mp3
break;
case 7:
case 19:
myDFPlayer.play(7); // проигрываем файл mp3/0007.mp3
break;
case 8:
case 20:
myDFPlayer.play(8); // проигрываем файл mp3/0008.mp3
break;
case 9:
case 21:
myDFPlayer.play(9); // проигрываем файл mp3/0009.mp3
break;
case 10:
case 22:
myDFPlayer.play(10); // проигрываем файл mp3/0010.mp3
break;
case 11:
case 23:
myDFPlayer.play(11); // проигрываем файл mp3/0011.mp3
break;
case 12:
case 24:
myDFPlayer.play(12); // проигрываем файл mp3/0012.mp3
break;
//default:
//{ }
}
}
}
void setup() {
tft.init(240, 380);
tft.setRotation(2);
tft.fillScreen(BLACK);
rtc.begin();
bmp.setFilter(FILTER_COEF_8); // Настраиваем коофициент фильтрации
bmp.setTempOversampling(OVERSAMPLING_8); // Настраиваем передискретизацию для датчика температуры
bmp.setPressOversampling(OVERSAMPLING_16); // Настраиваем передискретизацию для датчика давления
bmp.setStandbyTime(STANDBY_1000MS); // Устанавливаем время сна между измерениями (у нас обычный циклический режим)
bmp.begin();
Time t; // Инициализация структур
//rtc.setDOW(7); // Установка дня недели
//rtc.setTime(13, 11, 0); // Установка времени 10:59:10
//rtc.setDate(26, 3, 2023); // Установка даты 20 июля 2013
tft.setScrollArea(0x00, 0x00);
tft.setPartArea(0x00, 0x013F);
}
//#################################################################
void loop() {
t = rtc.getTime();
tft.setColors(192, 96, 0);
tft.setFont(mik_61); // Установка набора символов
if (t.hour < 10) {
tft.print("0", 40 , 151);
tft.printNumI(int(t.hour), 72, 151);
}
else {
tft.printNumI(int(t.hour), 40, 151);
}
if (t.min < 10) {
tft.print("0", 136 , 151);
tft.printNumI(int(t.min), 168, 151);
}
else {
tft.printNumI(int(t.min), 136, 151);
}
if (t.sec % 2 == 1) {
tft.print(":", 105, 151);
}
else {
tft.print(";", 105, 151);
}
tft.setColors(BIRUZA);
tft.setFont(nik);
tft.print(rtc.getDateStr(), 43, 217); // Вывод даты
switch (t.dow) {
case 1: d = 1; tft.printRu (("ПОНЕДЕЛЬНИК"), 25, 240); break;
case 2: d = 2; tft.printRu(F(" ВТОРНИК "), 25, 240); break;
case 3: d = 3; tft.printRu(F(" СРЕДА "), 25, 240); break;
case 4: d = 4; tft.printRu(F(" ЧЕТВЕРГ "), 25, 240); break;
case 5: d = 5; tft.printRu(F(" ПЯТНИЦА "), 25, 240); break;
case 6: d = 6; tft.printRu(F(" СУББОТА "), 25, 240); break;
case 7: d = 7; tft.printRu (("ВОСКРЕСЕНЬЕ"), 25, 240); break;
}
tft.setColor(TEAL);
tft.printNumF(bmp.readPressure() / 133.3, 3 , 1 , 0);
tft.printNumF(bmp.readTemperature(), 1, 140, 0); //температура
Pressure = bmp.readPressure();
P_Mid = Pressure - 79980;
Cur_Minute = int(t.min);
if (Cur_Minute != Last_Minute) {
Count_Minute++;
Last_Minute = Cur_Minute;
}
if (Count_Minute >= 8) {
Refresh = true;
if (p_count == 400) {
for (int i = 0; i < 400; i++) // сдвигаем если буфер полон
{
P_Mem[i] = P_Mem[i + 1];
}
}
else {
p_count++;
}
if(Pressure > 79980) {
P_Mid = Pressure - 79980; } // новый старт усреднения
P_Mem[p_count] = P_Mid;
Count_Minute = 0;
}
if (Refresh) {
if (p_count < 200) { p2 = 0; }
else { p2 = p_count - 200; }
P_Dt = 30*133.3; // Размах графика 30мм
for (int i = p2; i < p_count ; i++) { // ищем окно графика
if (P_win < P_Mem[i]) {
P_win = P_win + P_Dt; // сдвиг графика на текущий размер
}
if ((P_win - P_Dt) > P_Mem[i]) {
P_win = P_win;
}
}
P_Max = P_win;
P_Min = P_Max - P_Dt;
tft.setColors(160,82,45);
tft.printNumI(((P_win + 79980)/133.3) -699.5, 206, 14);
tft.printNumI(((P_win + 79980 - P_Dt/2)/133.3)-699.5, 206, 74);
tft.printNumI(((P_win + 79980 - P_Dt)/133.3)-699.5, 206, 134);
x = 200;
for (int i = p_count; i > p2 ; i--) {
y = map (P_Mem[i], P_Max, P_Min, 22, 141);
y = constrain(y, 22, 141);
#if defined (zapolnen)
tft.drawLine(x, y, x, 141, DGREY);
#else
if (x == 200) {
tft.setPixel(x, y, DGREY);
}
else {
tft.drawLine(last_x, last_y, x, y, DGREY);
}
last_x = x;
last_y = y;
#endif
x--;
}
}
for (uint8_t i = 0; i <= 200; i += 5) {
tft.drawPixel(i, 22, GOLD);
tft.drawPixel(i, 52, GOLD);
tft.drawPixel(i, 82, GOLD);
tft.drawPixel(i, 112, GOLD);
tft.drawPixel(i, 142, GOLD);
}
for (uint8_t i = 22; i <= 142; i += 5) {
tft.drawPixel(0, i, GOLD);
tft.drawPixel(40, i, GOLD);
tft.drawPixel(80, i, GOLD);
tft.drawPixel(120, i, GOLD);
tft.drawPixel(160, i, GOLD);
tft.drawPixel(200, i, GOLD);
}
Zvuk();
}
Может кто поможет. На ST7735 все работает, перешел на IPS ST7789 240x320. Решил для дачи сделать часы с кукушкой, а заодно барометр с графиком давления. Все хорошо, но график работает только в сторону увеличения, в сторону уменьшения по
#include <DS3231.h>
#include <GyverBME280.h>
#include <NST7789.h>
#include <DFRobotDFPlayerMini.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include <SPI.h>
#define sclk 13
#define sid 11
#define cs 10
#define dc 9
#define rst 8 // you can also connect this to the Arduino reset
ST7789 tft = ST7789(dc, rst, cs);
// Color definitions
//#define TOMAT 0xD087
#define LATUN (192, 96, 0)
#define ORANG (255,69,0)
#define SHOKOLAD (160,82,45)
//#define ZEL (77, 189, 1)
#define Silver (192, 192, 192)
//#define GOLUB 0x1C7F
//#define TRAVA 0x8585
#define BIRUZA 74, 219, 192
#define BLACK 0x0000
//#define DGREEN 0x0300
#define GOLD 0xFEA0
//#define SINIY 0x27ff
#define DGREY 0x7BEF /* 128, 128, 128 */
//#define MORKVA 0xFA20
//#define AQUA 0x07FF
#define TEAL 0x0410
GyverBME280 bmp; // Создание обьекта bme
DS3231 rtc(A3, A2);
boolean Refresh = true;
#define zapolnen // Заполнение графика 1
long P_win = 155*133.3; // Верхняя граница абс. графика по умолчанию до сдвига (600 + 180) = 780
uint16_t Pressure;
unsigned char p_count, p2;
long P_Min, P_Max, P_Mid, P_Dt;
uint16_t P_Mem[401]; //-79980 = 600мм (3 day 20min memory, 72 per 24 hour)
signed char x, y, last_x, last_y;
char Cur_Minute = 0, Last_Minute = 0, Count_Minute = 0;
Time t; // Инициализация структуры
char d = (1, 2, 3, 4, 5, 6, 7);
DFRobotDFPlayerMini myDFPlayer;
SoftwareSerial mySoftwareSerial(2, 3); // RX, TX
int Hor, Min, Sec;
extern uint8_t mik_61[];
//extern uint8_t cifr[];
extern uint8_t nik[];
//################# ZVUK #####################
void Zvuk() {
Hor = t.hour;
Min = t.min;
Sec = t.sec;
if(Min == 0 && Sec == 0) {
switch (Hor) // Каждый час кукушка будет куковать
{
case 1:
case 13:
myDFPlayer.play(1); // проигрываем файл mp3/0001.mp3
break;
case 2:
case 14:
myDFPlayer.play(2); // проигрываем файл mp3/0002.mp3
break;
case 3:
case 15:
myDFPlayer.play(3); // проигрываем файл mp3/0003.mp3
break;
case 4:
case 16:
myDFPlayer.play(4); // проигрываем файл mp3/0004.mp3
break;
case 5:
case 17:
myDFPlayer.play(5); // проигрываем файл mp3/0005.mp3
break;
case 6:
case 18:
myDFPlayer.play(6); // проигрываем файл mp3/0006.mp3
break;
case 7:
case 19:
myDFPlayer.play(7); // проигрываем файл mp3/0007.mp3
break;
case 8:
case 20:
myDFPlayer.play(8); // проигрываем файл mp3/0008.mp3
break;
case 9:
case 21:
myDFPlayer.play(9); // проигрываем файл mp3/0009.mp3
break;
case 10:
case 22:
myDFPlayer.play(10); // проигрываем файл mp3/0010.mp3
break;
case 11:
case 23:
myDFPlayer.play(11); // проигрываем файл mp3/0011.mp3
break;
case 12:
case 24:
myDFPlayer.play(12); // проигрываем файл mp3/0012.mp3
break;
//default:
//{ }
}
}
}
void setup() {
tft.init(240, 380);
tft.setRotation(2);
tft.fillScreen(BLACK);
rtc.begin();
bmp.setFilter(FILTER_COEF_8); // Настраиваем коофициент фильтрации
bmp.setTempOversampling(OVERSAMPLING_8); // Настраиваем передискретизацию для датчика температуры
bmp.setPressOversampling(OVERSAMPLING_16); // Настраиваем передискретизацию для датчика давления
bmp.setStandbyTime(STANDBY_1000MS); // Устанавливаем время сна между измерениями (у нас обычный циклический режим)
bmp.begin();
Time t; // Инициализация структур
//rtc.setDOW(7); // Установка дня недели
//rtc.setTime(13, 11, 0); // Установка времени 10:59:10
//rtc.setDate(26, 3, 2023); // Установка даты 20 июля 2013
tft.setScrollArea(0x00, 0x00);
tft.setPartArea(0x00, 0x013F);
}
//#################################################################
void loop() {
t = rtc.getTime();
tft.setColors(192, 96, 0);
tft.setFont(mik_61); // Установка набора символов
if (t.hour < 10) {
tft.print("0", 40 , 151);
tft.printNumI(int(t.hour), 72, 151);
}
else {
tft.printNumI(int(t.hour), 40, 151);
}
if (t.min < 10) {
tft.print("0", 136 , 151);
tft.printNumI(int(t.min), 168, 151);
}
else {
tft.printNumI(int(t.min), 136, 151);
}
if (t.sec % 2 == 1) {
tft.print(":", 105, 151);
}
else {
tft.print(";", 105, 151);
}
tft.setColors(BIRUZA);
tft.setFont(nik);
tft.print(rtc.getDateStr(), 43, 217); // Вывод даты
switch (t.dow) {
case 1: d = 1; tft.printRu (("ПОНЕДЕЛЬНИК"), 25, 240); break;
case 2: d = 2; tft.printRu(F(" ВТОРНИК "), 25, 240); break;
case 3: d = 3; tft.printRu(F(" СРЕДА "), 25, 240); break;
case 4: d = 4; tft.printRu(F(" ЧЕТВЕРГ "), 25, 240); break;
case 5: d = 5; tft.printRu(F(" ПЯТНИЦА "), 25, 240); break;
case 6: d = 6; tft.printRu(F(" СУББОТА "), 25, 240); break;
case 7: d = 7; tft.printRu (("ВОСКРЕСЕНЬЕ"), 25, 240); break;
}
tft.setColor(TEAL);
tft.printNumF(bmp.readPressure() / 133.3, 3 , 1 , 0);
tft.printNumF(bmp.readTemperature(), 1, 140, 0); //температура
Pressure = bmp.readPressure();
P_Mid = Pressure - 79980;
Cur_Minute = int(t.min);
if (Cur_Minute != Last_Minute) {
Count_Minute++;
Last_Minute = Cur_Minute;
}
if (Count_Minute >= 8) {
Refresh = true;
if (p_count == 400) {
for (int i = 0; i < 400; i++) // сдвигаем если буфер полон
{
P_Mem[i] = P_Mem[i + 1];
}
}
else {
p_count++;
}
if(Pressure > 79980) {
P_Mid = Pressure - 79980; } // новый старт усреднения
P_Mem[p_count] = P_Mid;
Count_Minute = 0;
}
if (Refresh) {
if (p_count < 200) { p2 = 0; }
else { p2 = p_count - 200; }
P_Dt = 30*133.3; // Размах графика 30мм
for (int i = p2; i < p_count ; i++) { // ищем окно графика
if (P_win < P_Mem[i]) {
P_win = P_win + P_Dt; // сдвиг графика на текущий размер
}
if ((P_win - P_Dt) > P_Mem[i]) {
P_win = P_win;
}
}
P_Max = P_win;
P_Min = P_Max - P_Dt;
tft.setColors(160,82,45);
tft.printNumI(((P_win + 79980)/133.3) -699.5, 206, 14);
tft.printNumI(((P_win + 79980 - P_Dt/2)/133.3)-699.5, 206, 74);
tft.printNumI(((P_win + 79980 - P_Dt)/133.3)-699.5, 206, 134);
x = 200;
for (int i = p_count; i > p2 ; i--) {
y = map (P_Mem[i], P_Max, P_Min, 22, 141);
y = constrain(y, 22, 141);
#if defined (zapolnen)
tft.drawLine(x, y, x, 141, DGREY);
#else
if (x == 200) {
tft.setPixel(x, y, DGREY);
}
else {
tft.drawLine(last_x, last_y, x, y, DGREY);
}
last_x = x;
last_y = y;
#endif
x--;
}
}
for (uint8_t i = 0; i <= 200; i += 5) {
tft.drawPixel(i, 22, GOLD);
tft.drawPixel(i, 52, GOLD);
tft.drawPixel(i, 82, GOLD);
tft.drawPixel(i, 112, GOLD);
tft.drawPixel(i, 142, GOLD);
}
for (uint8_t i = 22; i <= 142; i += 5) {
tft.drawPixel(0, i, GOLD);
tft.drawPixel(40, i, GOLD);
tft.drawPixel(80, i, GOLD);
tft.drawPixel(120, i, GOLD);
tft.drawPixel(160, i, GOLD);
tft.drawPixel(200, i, GOLD);
}
Zvuk();
}
Во первых можно допилить, во вторых, этот экран сильно жрущий, у меня дома метеостанция на таком, с графиком, влажностью и двумя температурами.
Зато он наглядный и не надо щуриться пытаясь сломать глаза об экранчик 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 "зависание" происходит почти через час. Но, при этом включения датчика газа заставляет дисплей сильно пульсировать. Вот уже несколько дней вожусь... не пойму в чём дело.
Подскажите почему дисплей 5110 (синего цвета ) через несколько часов темнеет, я заменил на другой думал бракованный и то же самое( как будто контрастность меняется)?
Спасибо за скетчи и схемы. Все работает.
Так же как и в комментарии выше, синий дисплей через некоторое время покрывается мусором.
Через месяц вообще перестал работать. Подсветка есть, информации нет. Сброс ардуины или отключение питания помогали раза с 5го - 10го, и снова дисплей через некоторое время в мусоре.
Достал другой дисплей (покупал отдельно без платы) плату взял от треснутого, который китаец прислал упаковав неаккуратно, перепаял.
Все заработало отлично.
скетч не рабочий у mr.Rulez
3 дисплея хоть и не синие, но пожелтели со временем. Походу все такие. Еще их надо намертво припаивать иначе глючат. Мне кажется самый крутой вариант это с электронными чернилами, еслиб кто то замутил такой проект.
где вы ( neitron10 ) раньше были? припаял и все заработало!
Рад что помог. Сам не раз обжигался. Не работают они нормально при быстром монтаже.
"Дело было вечером, делать было нечего..." (С) С. В. Михалков :)
Скрестил пару скетчей и получил ретро-барометр-барограф :)
Спасибо за идею и спасибо за скетч!
Вот мои варианты исполнения...
"Дело было вечером, делать было нечего..." (С) С. В. Михалков :)
Скрестил пару скетчей и получил ретро-барометр-барограф :)
Спасибо за идею и спасибо за скетч!
Вот мои варианты исполнения...
Можете ли вы дать этот скетч и схему вы сделали. Большое спасибо!!!
Скетч на 11 странице. Подключение по скетчу понять можно, там расписано. Я не смог найти подходящую библиотеку для OLED.
В ответ на пост 597 хочу предложить для пробы библиотеку ST7735.
Библиотека русифицирована занимает места меньше чем адафруит.
Все штифты в папке.
Если кому надо пробуйте.
https://disk.yandex.ru/d/f0f06r1aAUTIoQ
Доброго всем времени. Попробовал собрать на FTF дисплее 2,4 дюйма на скетче из поста https://arduino.ru/forum/proekty/arduino-barometr-barograf?page=9#comment-341292 подправив скетч под этот дисплей (библиотека UTFT правленная). но столкнулся с такой проблеммой что данные давления очень сильно скачут - минимальные от сотни мм рт а максимальные до нескольких сотен тысяч мм рт. и график конечно получается полная фигня. Хотя текущее давление показывает верно. Может кто окажет помощь в решении этой проблеммы.
Для ra6fnq!
Удалось ли вам восстановить свой скетч? Если да то поделитесь пожалуйста
ra6fnq Евгений, а я тут терзаем мыслями, что так редко на ардуно.ру появляешься, окруженный такими ПИОНЭРКАМИ мне бы было тоже недосуг )))
ua6em, ra6fnq только сейчас догнал что это позывные. Искренний привет радиолюбителям. В юности тоже был фанатом радиосвязи.
я уже бывший пока валялся по больницам закончилось разрешение, вот думаю нужно ли мне оно?!
Не, заделался автопутешественником, заходите в гости: http://www.drive2.ru/users/ra6fnq/
я уже бывший пока валялся по больницам закончилось разрешение, вот думаю нужно ли мне оно?!
Эта любовь на всю жизнь.
я уже бывший пока валялся по больницам закончилось разрешение, вот думаю нужно ли мне оно?!
да малышку однозначно надо иметь, восстанови, несложно жеж
есть малышка и не одна ...
Не, заделался автопутешественником, заходите в гости: http://www.drive2.ru/users/ra6fnq/
встречали мы велосипедистов из Москвы как-то раз у нас, они на Эльбрус на 3500 поднялись, там их снегом немного засыпало и поморозило несколько, оттуда они двинулись на Усть-Джегуту, в п.Московском и поднялись к нам на Апхуа, хорошая у них вышла поездка, более 3 тысяч километров )))
PS да сам два раза переболел модным диагнозом, пытаюсь потихоньку восстанавливаться
Может кто поможет. На ST7735 все работает, перешел на IPS ST7789 240x320. Решил для дачи сделать часы с кукушкой, а заодно барометр с графиком давления. Все хорошо, но график работает только в сторону увеличения, в сторону уменьшения по
казывает последнее давление.
Может кто поможет. На ST7735 все работает, перешел на IPS ST7789 240x320. Решил для дачи сделать часы с кукушкой, а заодно барометр с графиком давления. Все хорошо, но график работает только в сторону увеличения, в сторону уменьшения по
казывает последнее давление.
For stojano
Код сырой, писался на скорую руку чтобы работало. Кнопка на PIN 3 замыкается на землю, индикатор и сенсор стандартно
Доброго дня! Залил скетч, экран не показывает. На тестовых скетчах проверял-экран рабочий. Подскажите в какую сторону рыть?
Доброго времени суток.
Кто то может объяснить - в метеостанции GhostLion - во время коррекции кнопки "+" и "-" хотят работают, хотят так нет.
Кнопка перебора работает всегда.
[quote=MIK22]
Добрый день. Поделитесь скетчем для дисплея на ST7735
Эх жаль - совсем нет жизни в ветке