Arduino барометр - барограф

ra6fnq
ra6fnq аватар
Offline
Зарегистрирован: 26.10.2011

Во первых можно допилить, во вторых, этот экран сильно жрущий, у меня дома метеостанция на таком, с графиком, влажностью и двумя температурами.

Зато он наглядный и не надо щуриться пытаясь сломать глаза об экранчик 48х48

witaly_k
Offline
Зарегистрирован: 21.07.2020

Здорово! Это экранчик пошустрее моего будет. В скетче для него будет другая либа и строчка инициализации.

#include <TFT_HX8357.h>

TFT_HX8357 tft = TFT_HX8357();

tft.init();

tft.setRotation(3.14/2);

Эти строчки нужно записать вместо текущих для дисплея.

glw555
Offline
Зарегистрирован: 07.08.2020

stojanov пишет:

Вы сделали очень хорошую графику, которая мне очень понравилась! Если хочешь, я могу отправить тебе свой чужой файл, если хочешь посмотреть, я все исправил! Еще раз, я очень благодарен вам за то, что прислали мне вашу работу. Чтобы немного пополнить его, я также установлю литий-ионную батарею, чтобы обеспечить память измеренных состояний, потому что, как вы знаете, если по какой-либо причине нет питания, чтение начинается с нуля !!!

Какой дисплей использовали? Можно ваш Скетч

stojanov
stojanov аватар
Offline
Зарегистрирован: 14.06.2017
#include <U8glib.h>                                            
#include <Adafruit_Sensor.h>                                   
#include <Adafruit_BMP280.h>
 
Adafruit_BMP280 bmp280;
 
U8GLIB_ST7920_128X64_1X u8g(10);                               
float n_press;
float n_pr;              
float p_pr;              
int takt;
int dlit;
int stolb;
int temp;
int h;
uint8_t vert[64] ;
char buf[57];
char buf2[5];
float n_pr2;
 
 
void setup() {
  pinMode(3, INPUT);
  digitalWrite(3, HIGH);
  n_pr = 0;
  p_pr = 0;
  takt = 0;
  dlit = 2464;    // беше 2700                                   
  h = 613;                                           
    Serial.begin(9600);
    Serial.println(F("BMP280"));
  while (!bmp280.begin(BMP280_ADDRESS - 1)) {
    Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
    delay(1000);
  }
}
void loop () {
  if (digitalRead(3) == LOW) {   
    switch(dlit){
    case 154  : dlit = 308;break;  
    case 308  : dlit = 616;break;      
    case 616  : dlit = 1232;break;
    case 1232 : dlit = 2464;break;                    
    case 2464 : dlit = 154;break;}                    
   // цикл обнуления массива    
    for (int i = 0; i < 63; i++) {
      vert[i] = 0;}
     takt = 0;
    delay(2000);          
  }
temp = bmp280.readTemperature();
  takt = takt - 1;
  if (takt <= 1) {
    n_press = bmp280.readPressure();
    // цикл перезаписи массива                  
    for (int i = 0; i < 63; i++) {
      vert[i] = vert[i + 1];
    }
stolb = ( ((n_press/100) * pow(1 - (0.0065 * h / (temp + 0.0065 * h + 273.15)), - 4.780)) - 990 ) * 4.65   ;     
    if ( stolb > 120 ) {                        
      stolb = 120; }                            
    if ( stolb < 1 ) {
      stolb = 1  ; }
    vert[63] = stolb;
    takt = dlit;
  }
  u8g.firstPage();                                          
  do {
    u8g.setColorIndex(1);                                   
    u8g.setFont(u8g_font_6x10);
    //----- цртаме графика --------------------------------------
    for (int i = 0; i < 64; i++) {
      u8g.drawHLine(0, i, vert[i] );
    }
    //------ цртаме притисок и разлика -----------------------
    p_pr = n_pr;
    float n_pr = ((n_press/100) * pow(1 - (0.0065 * h / (temp + 0.0065 * h + 273.15)), -5.257));       
    
    dtostrf (n_pr, 5, 2, buf); (buf, "%03d", n_pr2);        
    u8g.drawStr90(120, 23 , buf);                           
 
    //--------  цртање на макета ------------------------------------
 
//    u8g.setColorIndex(1);                                 
    u8g.setFont(u8g_font_4x6);
    u8g.setColorIndex(0);                                   
    u8g.drawBox(0, 0, 7, 8);                              
    //u8g.drawBox(12, 0, 7, 12);      
    u8g.drawBox(18, 0, 7, 16);        
    u8g.drawBox(40, 0, 7, 16);        
    u8g.drawBox(61, 0, 7, 16);           
    u8g.drawBox(82, 0, 7, 16);        
    u8g.drawBox(104, 0, 7, 16);       
    //u8g.drawBox(122, 0, 6, 16);       
    //u8g.drawBox(120, 28, 1, 29);        
    
    u8g.drawBox(0, 56, 6, 8);         
    u8g.drawBox(0, 43, 6, 9);         
    u8g.drawBox(0, 27, 6, 9);         
    u8g.drawBox(0, 11, 6, 9);         
 
    
    //u8g.drawVLine(119, 0, 64);                              
    //u8g.drawVLine(105, 0, 64);                              
    u8g.drawVLine(107, 0, 64);                                
    u8g.drawVLine(85, 0, 64);                                 
    u8g.drawVLine(64, 0, 64);                                 
    u8g.drawVLine(43, 0, 64);                                 
    u8g.drawVLine(21, 0, 64);                                 
    //u8g.drawVLine(15, 0, 64);                               
    
    
    u8g.setColorIndex(1);                                   
//    u8g.setFont(u8g_font_4x6);
                            
    //u8g.drawStr90(12, 0 , "995");                         
    u8g.drawStr90(18, 0 , "1000");
    u8g.drawStr90(40, 0 , "1005");
    u8g.drawStr90(61, 0 , "1010");                          
    u8g.drawStr90(82, 0 , "1015");
    u8g.drawStr90(104, 0 , "1020");
    //u8g.drawStr90(102, 0 , "1025");                       
    
    u8g.drawStr90(-1, 0 , "48");
    u8g.drawStr90(-1, 12 , "36");                            
    u8g.drawStr90(-1, 28 , "24");                            
    u8g.drawStr90(-1, 44 , "12");                                                     
    
 
    switch(dlit){
    case 154  : u8g.drawStr90(-1, 57 , "3");break;  
    case 308  : u8g.drawStr90(-1, 57 , "6");break;          
    case 616  : u8g.drawStr90(-1, 57 , "12");break;         
    case 1232 : u8g.drawStr90(-1, 57 , "24");break;          
    case 2464 : u8g.drawStr90(-1, 57 , "48");break;          
    
   
 }
    
    //u8g.drawStr90(64, 0 , "1010");                          
    sprintf (buf2, "%d",  takt );
    u8g.drawStr90(122, 0 , buf2);
 
    //u8g.drawVLine(119, 03, 0);                             
    //u8g.drawVLine(119, 13, 0);
    //u8g.drawVLine(119, 23, 5);
    //u8g.drawVLine(119, 33, 5);
    //u8g.drawVLine(119, 43, 5);
    //u8g.drawVLine(119, 53, 5);
 
    u8g.drawVLine(107, 03, 0);                             
    u8g.drawVLine(107, 13, 0);
    u8g.drawVLine(107, 23, 5);
    u8g.drawVLine(107, 33, 5);
    u8g.drawVLine(107, 43, 5);
    u8g.drawVLine(107, 53, 5);   
 
 
    u8g.drawVLine(85, 03, 0);                              
    u8g.drawVLine(85, 13, 0);
    u8g.drawVLine(85, 23, 5);
    u8g.drawVLine(85, 33, 5);
    u8g.drawVLine(85, 43, 5);
    u8g.drawVLine(85, 53, 5);
 
    u8g.drawVLine(64, 03, 0);                               
    u8g.drawVLine(64, 13, 0);
    u8g.drawVLine(64, 23, 5);
    u8g.drawVLine(64, 33, 5);
    u8g.drawVLine(64, 43, 5);
    u8g.drawVLine(64, 53, 5);
    
    u8g.drawVLine(43, 13, 0);                                       
    u8g.drawVLine(43, 23, 5);
    u8g.drawVLine(43, 33, 5);
    u8g.drawVLine(43, 43, 5);
    u8g.drawVLine(43, 53, 5);
 
    u8g.drawVLine(21, 03, 0);                              
    u8g.drawVLine(21, 13, 0);
    u8g.drawVLine(21, 23, 5);
    u8g.drawVLine(21, 33, 5);
    u8g.drawVLine(21, 43, 5);
    u8g.drawVLine(21, 53, 5);
 
    //u8g.drawVLine(30, 03, 0);                             
    //u8g.drawVLine(30, 13, 0);
    //u8g.drawVLine(30, 23, 5);
    //u8g.drawVLine(30, 33, 5);
    //u8g.drawVLine(30, 43, 5);
    //u8g.drawVLine(30, 53, 5);
    
    //u8g.drawVLine(15, 03, 0);                              
    //u8g.drawVLine(15, 13, 5);
    //u8g.drawVLine(15, 23, 5);
    //u8g.drawVLine(15, 33, 5);
    //u8g.drawVLine(15, 43, 5);
    //u8g.drawVLine(15, 53, 5);
 
   
    
  }    while (u8g.nextPage());
  delay(1000);
}
stojanov
stojanov аватар
Offline
Зарегистрирован: 14.06.2017

Только что переделал скетч sel_oleg !!! Я подогнал его под себя. Сфотографирую и попробую прислать как выглядит. По оборудованию все как у sel_oleg, и все тоже связано. Думаю добавить еще запасной аккумулятор, чтобы даже при кратковременном отключении электричества барограф заработал с самого начала !!! Когда я исправлю это и некоторые другие вещи, такие как регулировка яркости экрана и его выключение, я тоже отправлю это !!! Извините, если сделаю опечатку!

stojanov
stojanov аватар
Offline
Зарегистрирован: 14.06.2017

Droid135
Offline
Зарегистрирован: 02.09.2020

А где можно скачать?

stojanov
stojanov аватар
Offline
Зарегистрирован: 14.06.2017

Для ra6fnq!

Экран 3.5 мне очень нравится. Вы можете опубликовать свою работу? Хотелось бы сделать Барограф на таком экране от 3.5. Большое спасибо!!!

Попробуйте датчик влажности Si7021. После того, как в течении 3-4 месяцев на улице, сгнили несколько DHT22, + в наших условиях повышенной влажности зимой, показания 99,9% норма, перешёл на него. статистики пока нет.

[/quote]

ra6fnq
ra6fnq аватар
Offline
Зарегистрирован: 26.10.2011

Флешка умерла, а с ней и скетч...

Когда ни будь перепишу, есть недостатки.

stojanov
stojanov аватар
Offline
Зарегистрирован: 14.06.2017

Большое спасибо за ответ !!! Надеюсь, вы сделаете еще лучшую работу !!! Приветствие!!!

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

подскажите пожалуйста, залил скетч из поста #520  но дисплей ничего не показывает... проверил отдельно дисплей и датчик bme280 все работает. Может адрес дисплея какой-то не такой стандартный

neitron10
Offline
Зарегистрирован: 29.05.2020

Xumuk пишет:

подскажите пожалуйста, залил скетч из поста #520  но дисплей ничего не показывает... проверил отдельно дисплей и датчик bme280 все работает. Может адрес дисплея какой-то не такой стандартный

OLED  myOLED(SDA, SCL, 8);

попробуйте убрать 8.

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

спасибо за ответ, нашел причину, у меня оказывается прошивка стопарилась на опросе датчика. У  меня ВМЕ280. Кстати ктонибудь прикручивал к такому дисплею ВМЕ?

runaway
Offline
Зарегистрирован: 25.09.2012

Здравствуйте, уважаемые участники! Упешно повторил конструкцию участника 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;
} 
}