усложнить код

gulin176
Offline
Зарегистрирован: 03.09.2016

благодаря участникам форума сделал некое подобие прогноза погоды. всё хорошо, но хочется усложнить код. суть такая. смотрим давление за прошлый час и сравниваем с настоящим. если ростет или падает делаем выводы. но разовое изменение давления может и не говорить о изменении погоды. а вот если смотреть за 2 периода(возможно час, может два). код выводит на экран стрелочку(вверх, вниз, равно) и цифру разницы. что хочу? допустим стречка вверх цифра 1 в позиции 13 и 14. через час эти данные сдвигаются в позицию 11 и 12, а новые данные заносятся в позицию 13 и 14. пытался командой сдвинуть выведенное на экран, которая есть в библиотеке на экран 1602. но похоже команда сдвигает всё содержимое экрана а не отдельный элемент. сделал(с помощью) 2 варианта. 1 вариант смотрит когда наступит 00 минут и сравнивает данные старого часа и нового. 2 вариант на millis, смотрит когда пройдет интервал в час и тоже сравнивает.

2вариант

void loop()
{
  dt = clock.getDateTime();
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis > interval)
  {
    previousMillis = currentMillis;
    novoeDavlenie  = ((uint32_t)mySensor.readFloatPressure() / 100);
    if (novoeDavlenie > predDavenie )
    {
      Rost = 1;
      lcd.setCursor(14, 1);
      lcd.print("\1");
    }
    if (novoeDavlenie < predDavenie )
    {
      Padenie = 2;
      lcd.setCursor(14, 1);
      lcd.print("\2");
    }
    if (novoeDavlenie == predDavenie )
    {
      Netizmenenia = 3;
      lcd.setCursor(14, 1);
      lcd.print("\3");
    }
    Raznica = novoeDavlenie - predDavenie;
    if (Raznica < 0)
    {
      Raznica = Raznica * -1;
    }
    lcd.setCursor(15, 1);
    lcd.print(Raznica);
    predDavenie = novoeDavlenie;
  }

1 вариант

void loop()
{
  dt = clock.getDateTime();
  float nowHour = dt.hour;
  float nowMinutes = dt.minute;
  if ( nowHour != prevHour && nowMinutes == 0)
  {
    prevHour = nowHour;
    novoeDavlenie  = ((uint32_t)mySensor.readFloatPressure() / 100);
    if (novoeDavlenie > predDavenie )
    {
      lcd.setCursor(14, 1);
      lcd.print("\1");
    }
    if (novoeDavlenie < predDavenie )
    {
      lcd.setCursor(14, 1);
      lcd.print("\2");
    }
    if (novoeDavlenie == predDavenie )
    {
      lcd.setCursor(14, 1);
      lcd.print("\3");
    }
    Raznica = novoeDavlenie - predDavenie;
    if (Raznica < 0)
    {
      Raznica = Raznica * -1;
    }
    lcd.setCursor(15, 1);
    lcd.print(Raznica);
    predDavenie = novoeDavlenie;
  }

первый вариант с 00 минут не понравился тем что надо ждать когда произойдёт это 00. и ещё если усложнять в таком варианте условие if выполняется многократно пока на часах 00 минут. пытался рисовать на бумаге и этот ньюанс мне помешал чтото построить вразумительное

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Вы наверно еще не знаете, но сейчас идет 2016 год. А ваше решение ну 1995-2000. Ведь наверно знаете, что есть видеокарты, Windows всякие. А вы балуетесь всякими сдвигами по экрану.  Просто создайте все переменые которые надо вывести на экран. всякие давления и стелочки и ввыдете за раз на экран и все.Потом можете обновлять экран раз в секунду , минуту, час. Но целиком.

gulin176
Offline
Зарегистрирован: 03.09.2016

а можно блок схему? не могу придумать алгоритм. переменные не проблема, главное как план составить

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну начинается так 

//#1
//#2
//#3
void setup() {
//#1
//#2
//#3
}

void loop() {
  static uint32_t MILLIS ;
  MILLIS = millis() ; 
//#1 1000 миллисекунд вычислит. поток 1
  static uint32_t future1 = 0 ;
  if (MILLIS>=future1) {
  future1 = MILLIS + 1000 ;
  // сам код
  MILLIS = millis() ;    
  }
//#2  200 миллисекунд вычислит. поток 2
  static uint32_t future2 = 0 ;
  if (MILLIS>=future2) {
  future2 = MILLIS + 200 ;
  // сам код
  MILLIS = millis() ;    
  }
//#3  100 миллисекунд вычислит. поток 3
  static uint32_t future3 = 0 ;
  if (MILLIS>=future3) {
  future3 = MILLIS + 100 ;  
    // сам код  
  }
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Но можно так . На энкодер не смотрите.

//#1 энкодер
 const int reset_pin=6; // кнопка сброса показаний 0 нажата /1 нет
 volatile int place_enc; // количество импульсов
 const int enc_A_pin = 2;// нога на энкодер фазы A прерывание 0
 const int enc_B_pin = 3; // нога на энкоде  фазы B.

void scan_enc1() {   // функция работающая по прерыванию 0 подсчет импульсов
  if(digitalRead(enc_B_pin))place_enc++; 
  else place_enc--;
    }  
  void scan_enc2() {   // функция работающая по прерыванию 0 подсчет импульсов
  if(digitalRead(enc_B_pin))place_enc--; 
  else place_enc++;
    }    
//#2 экран 
  #include <Wire.h>
  #include <LiquidCrystal.h>
  LiquidCrystal lcd(12, 11, 10, 9, 8, 7); 
void setup(){
//#1 энкодер
  pinMode(reset_pin, INPUT_PULLUP); // настройка  кнопки сбоса показаний
  pinMode(enc_A_pin, INPUT);
  pinMode(enc_B_pin, INPUT);
  attachInterrupt(0, scan_enc1, FALLING); //прерывание INT0. 1>0
  attachInterrupt(0, scan_enc2, RISING); //прерывание INT0. 0>1
//#2 экран 
  lcd.begin(16, 2); 
}
void loop(){ 
//#1 энкодер  
  if (!digitalRead(reset_pin)) place_enc = 0; //сброс счетчика импульсов                              
//#2 экран обновление раз в 1 секунда
  static uint32_t future2 = 0 ;
  if (millis() >= future2)   {
     future2 = millis() + 1000 ;
     lcd.setCursor(0,0)       ; //курсор. 
     lcd.print("Place=")      ; //выводит текст.
     lcd.print(place_enc)     ; //выводит значение переменной P.
     lcd.print("         ")   ; //выводит выводит пробел.           
     }        
} 

 

gulin176
Offline
Зарегистрирован: 03.09.2016

а что код словами делает? в 3 посте. мне надо как я понимаю запомнить 2 переменные(из позиции 14,15) и раз в час записывать их в позицию 12,13.  Позиция 14,15 обновляются каждый час и переложить данные из 14,15 в 12,13 надо до того как обновились данные в 14,15.  В позиции 12,13 старые данные будут просто затираться вновь поступившими

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Надо сначала определится, что выводить и в какой форме. Скорее вам надо выводить результат. А вот промежуточные значения и ход решения задачи не нужен. Экран вам не черновик, а чистовик в котором надо только ответы. Так что если потеряются ненужные цифры так и пусть теряются.

gulin176
Offline
Зарегистрирован: 03.09.2016

из куска кода выше видно что данные выводятся в позицию 14 и 15 и меняются раз в час(условно) . мне надо в момент перед тем как обновятся данные 14 и 15 положить их в позиции 12 и 13. выводить надо в том же виде как и были в позиции 14 и 15. важен конечно результат

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

А что указатели в ардуино отменили. Или char .

char * a1,* a2;
//char * a2;
void setup() {
 a1="/1";
 a2=a1;
 a1="/2";
}

void loop() {

}
// вроде работает.

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну и так набросок.

//#1
//#2
const uint32_t interval=1000;// интервал просчета
char * stat_davl;
//#3
void loop(){
  static uint32_t MILLIS ;
  MILLIS = millis() ; 
  //#1
 dt = clock.getDateTime();

  //#2
  static uint32_t future2 = 0 ;
  if (MILLIS >= future2)   {
    future2 = MILLIS + interval ;
    predDavenie = novoeDavlenie;
    novoeDavlenie  = ((uint32_t)mySensor.readFloatPressure() / 100);
    if (novoeDavlenie > predDavenie )stat_davl="\1";
    else if (novoeDavlenie < predDavenie )stat_davl="\2";
    else stat_davl="\3";
    Raznica = novoeDavlenie - predDavenie;
    if (Raznica < 0) Raznica = -Raznica;
    }
  //#3
      lcd.setCursor(14, 1);
      lcd.print(stat_davl);
      lcd.setCursor(15, 1);
      lcd.print(Raznica);
}

 

gulin176
Offline
Зарегистрирован: 03.09.2016

в посту #9 вы переписали мой код. спасибо так действительно более правильно, красиво. я перепишу свою писанину. что обозначают коментарии #1,2,3? но из поста #9 я не вижу как мне stat_davl и Raznica перенести в другую позицию на экране перед (одновременно с) когда сработает 

if (MILLIS >= future2)   {
    future2 = MILLIS + interval ;

ведь если сработает это условие переменные с stat_davl и Raznica будут перезаписаны и брать данные с них надо до того

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Про #1,#2,#3. Вы конечно слышали про принцип модульности. Ну или ЛЕГО конструктор. Когда один модуль(деталь) выдернуть из одной консрукции и воткнуть в другую. Вот что-то подобное. Но так как я не хочу создавать свои классы и библиотеки. А элементарный модуль , что бы нормально работал должен быть в разных местах. Вот я и отмечаю модуль #1 модуль #2.  Вот примерный шаблон.

//#1
//#2
//#3

void setup() {
  //#1
  //#2
  //#3

}

void loop() {
  //#1
  //#2
  //#3

}

Но есть и дальнейшее развитие этой идеи. Модуль становится элементарным вычислительным процессом.

//#1
//#2
//#3
void setup() {
//#1
//#2
//#3
}

void loop() {
  static uint32_t MILLIS ;
  MILLIS = millis() ; 
//#1 1000 миллисекунд вычислит. поток 1
  static uint32_t future1 = 0 ;
  if (MILLIS>=future1) {
  future1 = MILLIS + 1000 ;
  // сам код
  MILLIS = millis() ;    
  }
//#2  200 миллисекунд вычислит. поток 2
  static uint32_t future2 = 0 ;
  if (MILLIS>=future2) {
  future2 = MILLIS + 200 ;
  // сам код
  MILLIS = millis() ;    
  }
//#3  100 миллисекунд вычислит. поток 3
  static uint32_t future3 = 0 ;
  if (MILLIS>=future3) {
  future3 = MILLIS + 100 ;  
    // сам код  
  }
}

Ну и наконец. Как я вам предлагал ранее вынести экран в один модуль процесс. И дальше не заморачиваться.

gulin176
Offline
Зарегистрирован: 03.09.2016

спасибо на счёт # так и подумал. а если делить на потоки... допустим переменные записываем из одного потока, а как синхронизироваться? для меня проблема в том что не знаю как взять данные stat_davl и Raznica ПЕРЕД их обновлением, ну или не взять тогда как вывести перед обновлением. потому что после обновления брать их уже поздно. и за долго до обновления тоже не то. то есть позиция 14,15 должна переноситься в 12,13 прямо перед обновлением 14,15. может я не то несу, но именно это не понимаю. может не вижу очевидного...

P.S. если использовать счётчики с разным периодом как вы выше написали то потоки пойдут с разными количествами циклов. однако потоки по времени не должны расходится не насколько. по этому стит ли делать различное количество потоков

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ну с независимыми потоками вы поняли. А вот с перемеными из разных потоков. Вот вывод на экран это последний поток, так как он показывант (использует) переменные которые уже создали предыдущие потоки.  Вообще-то экран это предпоследний поток. последний это Контролы. Ну это клавиатура которая командует, что надо показывать на экране.

Теперь по переменым. есть у нас 

void setup() {
//#1
//#2
//#3
}

Вот там задайте пустые переменные. То есть в setup() получите первое давление. А изменение сделайте "БЕЗ ИЗМЕНЕНИЙ".РАЗНИЦА=0. И все.

gulin176
Offline
Зарегистрирован: 03.09.2016

а почему 

char * stat_davl;

а не 

char = stat_davl;

ещё

if (условие выполняется)
{то действие
 
}

и 

if (условие выполняется )то действие;

в первом условии есть фигурные скобки а то что ниже без скобок. это для общего развития

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
if (условие) действие;
или же
if(условие) {
  действие1;
  действие2;
  }

есть еще такая штука
 if 1 действие_выполняется;
 или
  if !0 действие_выполняется;

но
 if !1 действие_не_выполняется;
 или
  if 0 действие_не_выполняется;

 

gulin176
Offline
Зарегистрирован: 03.09.2016

qwone пишет:

вывод на экран это последний поток, так как он показывант (использует) переменные которые уже создали предыдущие потоки

ну мне хочется разобраться если первый поток крутится с периодичностью 1 час. а второй поток с периодом 6 минут(всё условно). то что мешает 2 потоку смотреть переменные из 1 потока с такой же частотой. я выложу программу. может поправите, а то у меня похоже дефицит головного мозга. спасибо за возьню со мной. но я по вашему написанному поправил свой некрасивый if

[code]
#include <DS3231.h>
#include <LiquidCrystal_I2C.h>
#include <stdint.h>
#include "SparkFunBME280.h"
#include "Wire.h"
#define alt = 160
byte vverh[8] =
{
  B00100,
  B01110,
  B11111,
  B00100,
  B00100,
  B00100,
  B00100,
};
byte vniz[8] =
{
  B00100,
  B00100,
  B00100,
  B00100,
  B11111,
  B01110,
  B00100,
};
byte ravno[8] =
{
  B11111,
  B00000,
  B11111,
  B00000,
  B11111,
  B00000,
  B11111,
};
BME280 mySensor;
LiquidCrystal_I2C lcd(0x3f, 16, 2);
DS3231 clock;
RTCDateTime dt;
long novoeDavlenie = 0;
long predDavenie = 0;
long Raznica = 0;
long Rost = 0;
long Padenie = 0;
long Netizmenenia = 0;
long previousMillis = 0;
char * stat_davl;
long interval = 360000;   // 1/10 часа debug
void setup()
{
  lcd.begin();
  lcd.createChar(1, vverh);
  lcd.createChar(2, vniz);
  lcd.createChar(3, ravno);
  mySensor.settings.commInterface = I2C_MODE;
  mySensor.settings.I2CAddress = 0x76;
  mySensor.settings.runMode = 3; //  3, Normal mode
  mySensor.settings.tStandby = 0; //  0, 0.5ms
  mySensor.settings.filter = 4; //  0, filter off
  mySensor.settings.tempOverSample = 5;
  mySensor.settings.pressOverSample = 5;
  mySensor.settings.humidOverSample = 5;
  delay(10);  //Make sure sensor had enough time to turn on. BME280 requires 2ms to start up.
  (mySensor.begin(), HEX);
}
void loop()
{
  dt = clock.getDateTime();
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis > interval)
  {
    previousMillis = currentMillis;
    novoeDavlenie  = ((uint32_t)mySensor.readFloatPressure() / 100);
    if (novoeDavlenie > predDavenie )stat_davl = "\1";
    else if (novoeDavlenie < predDavenie )stat_davl = "\2";
    else stat_davl = "\3";
    Raznica = novoeDavlenie - predDavenie;
    if (Raznica < 0) Raznica = -Raznica;
  }
  lcd.setCursor(14, 1);
  lcd.print(stat_davl);
  lcd.setCursor(15, 1);
  lcd.print(Raznica);
  predDavenie = novoeDavlenie;
  mySensor.readTempC();
  lcd.setCursor(4, 0);
  lcd.print((uint32_t)mySensor.readFloatPressure() / 100 + 15);
  lcd.print("Pa ");
  lcd.setCursor(11, 0);
  lcd.print(mySensor.readTempC());
  lcd.setCursor(15, 0);
  lcd.print("C");
  lcd.setCursor(0, 0);
  lcd.print((uint8_t)mySensor.readFloatHumidity());
  lcd.print("%");
  if (dt.hour >= 10) {
    lcd.setCursor(6, 1);
    lcd.print(dt.hour);
  }
  if (dt.hour >= 0 && dt.hour < 10) {
    lcd.setCursor(6, 1);
    lcd.print(0);
    lcd.setCursor(7, 1);
    lcd.print(dt.hour);
  }
  lcd.print(":");
  if (dt.minute >= 10) {
    lcd.setCursor(9, 1);
    lcd.print(dt.minute);
  }
  if (dt.minute >= 0 && dt.minute < 10) {
    lcd.setCursor(9, 1);
    lcd.print(0);
    lcd.setCursor(10, 1);
    lcd.print(dt.minute);
  }
}
[/code]

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Вот перебрал ваш код под себя. Скопилировать не могу. Надо искать библиотеки.

//#1
#include <DS3231.h>
DS3231 clock;
RTCDateTime dt;
uint8_t hour; // время часы.
uint8_t minute; // время минуты.
//#2
BME280 mySensor; // создать датчик давления
const long interval = 360000; //  1/10 часа время обновления давления
long novoeDavlenie ;
long predDavenie ;
long Raznica = 0;
char * stat_davl;
//#3
#include <LiquidCrystal_I2C.h>
#include <stdint.h>
#include "SparkFunBME280.h"
#include "Wire.h"
#define alt = 160
LiquidCrystal_I2C lcd(0x3f, 16, 2);
byte vverh[8] = {
  B00100,
  B01110,
  B11111,
  B00100,
  B00100,
  B00100,
  B00100,
};
byte vniz[8] = {
  B00100,
  B00100,
  B00100,
  B00100,
  B11111,
  B01110,
  B00100,
};
byte ravno[8] = {
  B11111,
  B00000,
  B11111,
  B00000,
  B11111,
  B00000,
  B11111,
};
void setup() {
  //#1
  //#2
  mySensor.settings.commInterface = I2C_MODE;
  mySensor.settings.I2CAddress = 0x76;
  mySensor.settings.runMode = 3; //  3, Normal mode
  mySensor.settings.tStandby = 0; //  0, 0.5ms
  mySensor.settings.filter = 4; //  0, filter off
  mySensor.settings.tempOverSample = 5;
  mySensor.settings.pressOverSample = 5;
  mySensor.settings.humidOverSample = 5;
  delay(10);  //Make sure sensor had enough time to turn on. BME280 requires 2ms to start up.
  (mySensor.begin(), HEX);
  novoeDavlenie  = ((uint32_t)mySensor.readFloatPressure() / 100);// делаем первичный замер. В цикле loop() он станет старым
  //#3
  lcd.begin();
  lcd.createChar(1, vverh);
  lcd.createChar(2, vniz);
  lcd.createChar(3, ravno);
}

void loop() {
  static uint32_t MILLIS ;
  MILLIS = millis() ;
  //#1  опрос частотой в секунду( можно еще реже ;) часы
  static uint32_t future1 = 0 ;
  if (MILLIS >= future1) {
    future1 = MILLIS + 1000 ;
    dt = clock.getDateTime();
    hour = dt.hour;
    minute = dt.minute;
  }
  //#2 interval милисекунд - измерение давления
  static uint32_t future2 = 0 ;
  if (MILLIS >= future2) {
    future2 = MILLIS + interval ;
    predDavenie = novoeDavlenie;  // я давно пришел к мысли что старое значение лучше сохранять перед получением нового.
    novoeDavlenie  = ((uint32_t)mySensor.readFloatPressure() / 100);
    if (novoeDavlenie > predDavenie )stat_davl = "\1";
    else if (novoeDavlenie < predDavenie )stat_davl = "\2";
    else stat_davl = "\3";
    Raznica = novoeDavlenie - predDavenie;
    if (Raznica < 0) Raznica = -Raznica;
  }
  //#3 обновление раз в секунду (1000 миллисек) экран
  static uint32_t future3 = 0 ;
  if (MILLIS >= future3) {
    future3 = MILLIS + 1000 ;
    lcd.setCursor(14, 1);
    lcd.print(stat_davl);
    lcd.setCursor(15, 1);
    lcd.print(Raznica);
    lcd.setCursor(4, 0);
    lcd.print((uint32_t)mySensor.readFloatPressure() / 100 + 15);
    lcd.print("Pa ");
    lcd.setCursor(11, 0);
    lcd.print(mySensor.readTempC());
    lcd.setCursor(15, 0);
    lcd.print("C");
    lcd.setCursor(0, 0);
    lcd.print((uint8_t)mySensor.readFloatHumidity());
    lcd.print("%");
    lcd.setCursor(6, 1);  // вывод времени
    if (hour >= 10) lcd.print(hour);
    else {
      lcd.print(0);
      lcd.print(hour);
    }
    lcd.print(":");
    if (minute >= 10) lcd.print(minute);
    else {
      lcd.print(0);
      lcd.print(minute);
    }
  }
}

 

gulin176
Offline
Зарегистрирован: 03.09.2016

спасибо за оператор else. но я не вижу никаких изменений. может я неправильно изъясняюсь... но мне надо(я с начала темы пишу одно и тоже). Есть данные в позиции 14,15 их видно как stat_davl и Raznica так вот их надо раз в час перекладывать в позицию 12,13 прямо перед тем как в позиции 14,15 наступит const long interval = 360000; //  1/10 часа время обновления давления. я же тему начал по этому только. я принципиальных изменений не вижу. уж извините

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну а так?

//#1
#include <DS3231.h>
DS3231 clock;
RTCDateTime dt;
uint8_t hour; // время часы.
uint8_t minute; // время минуты.
//#2
BME280 mySensor; // создать датчик давления
const long interval = 360000; //  1/10 часа время обновления давления
long Davlenie,Davlenie_old ;// давление
long Raznica,Raznica_old;// временной перепад давления
byte stat_davl,stat_davl_old;// значек перепада
//#3
#include <LiquidCrystal_I2C.h>
#include <stdint.h>
#include "SparkFunBME280.h"
#include "Wire.h"
#define alt = 160
LiquidCrystal_I2C lcd(0x3f, 16, 2);
byte vverh[8] = {
  B00100,
  B01110,
  B11111,
  B00100,
  B00100,
  B00100,
  B00100,
};
byte vniz[8] = {
  B00100,
  B00100,
  B00100,
  B00100,
  B11111,
  B01110,
  B00100,
};
byte ravno[8] = {
  B11111,
  B00000,
  B11111,
  B00000,
  B11111,
  B00000,
  B11111,
};
void setup() {
  //#1
  //#2
  mySensor.settings.commInterface = I2C_MODE;
  mySensor.settings.I2CAddress = 0x76;
  mySensor.settings.runMode = 3; //  3, Normal mode
  mySensor.settings.tStandby = 0; //  0, 0.5ms
  mySensor.settings.filter = 4; //  0, filter off
  mySensor.settings.tempOverSample = 5;
  mySensor.settings.pressOverSample = 5;
  mySensor.settings.humidOverSample = 5;
  delay(10);  //Make sure sensor had enough time to turn on. BME280 requires 2ms to start up.
  (mySensor.begin(), HEX);
  stat_davl=3;
  Raznica=0;
  Davlenie  = ((uint32_t)mySensor.readFloatPressure() / 100);// делаем первичный замер. В цикле loop() он станет старым
  //#3
  lcd.begin();
  lcd.createChar(1, vverh);
  lcd.createChar(2, vniz);
  lcd.createChar(3, ravno);
}

void loop() {
  static uint32_t MILLIS ;
  MILLIS = millis() ;
  //#1  опрос частотой в секунду( можно еще реже ;) часы
  static uint32_t future1 = 0 ;
  if (MILLIS >= future1) {
    future1 = MILLIS + 1000 ;
    dt = clock.getDateTime();
    hour = dt.hour;
    minute = dt.minute;
  }
  //#2 interval милисекунд - измерение давления
  static uint32_t future2 = 0 ;
  if (MILLIS >= future2) {
    future2 = MILLIS + interval ;
    Davenie_old = Davlenie;  // я давно пришел к мысли что старое значение лучше сохранять перед получением нового.
    Davlenie  = ((uint32_t)mySensor.readFloatPressure() / 100);
    stat_davl_old =stat_davl;
    if (Davlenie > Davenie_old )stat_davl = 1;
    else if (Davlenie < Davenie_old )stat_davl = 2;
    else stat_davl = 3;
    Raznica_old=Raznica;
    Raznica = Davlenie - Davenie_old;
    if (Raznica < 0) Raznica = -Raznica;
  }
  //#3 обновление раз в секунду (1000 миллисек) экран
  static uint32_t future3 = 0 ;
  if (MILLIS >= future3) {
    future3 = MILLIS + 1000 ;
    lcd.setCursor(0, 0) ;lcd.print((uint8_t)mySensor.readFloatHumidity())            ;lcd.print("%"); 
    lcd.setCursor(4, 0) ;lcd.print((uint32_t)mySensor.readFloatPressure() / 100 + 15);lcd.print("Pa ");
    lcd.setCursor(11, 0);lcd.print(mySensor.readTempC());
    lcd.setCursor(15, 0);lcd.print("C"); 
    lcd.setCursor(6, 1);  // вывод времени
    if (hour  < 10) lcd.print(0);
    lcd.print(hour);
    lcd.print(":");
    if (minute < 10)lcd.print(0);
    lcd.print(minute);    
    lcd.setCursor(12, 1);lcd.write(byte(stat_davl_old));// поставьте куда надо на экране
    lcd.setCursor(13, 1);lcd.print(Raznica_old); // поставьте куда надо на экране 
    lcd.setCursor(14, 1);lcd.write(byte(stat_davl));
    lcd.setCursor(15, 1);lcd.print(Raznica);  
    }
}

Похоже код надо и дальше чистить. http://arduino.ua/ru/prog/LiquidCrystalCreateChar

gulin176
Offline
Зарегистрирован: 03.09.2016

спасибо огромное. вроде бы даже работает. давление сейчас стоит как вкопанное, пришёл антициклон. но по первичному включению когда датчик врёт не прогревшись видно что алгоритм работает. пожелание для тех кто решит воспользоваться этим кодом исправить ошибки: BME280 mySensor; // создать датчик давления

надо писать ниже библиотеки соответствующей. 

и Davlenie_old а у вас почему то везде Davenie_old первый раз думал описка, смотрю и дальше также