усложнить код
- Войдите на сайт для отправки комментариев
благодаря участникам форума сделал некое подобие прогноза погоды. всё хорошо, но хочется усложнить код. суть такая. смотрим давление за прошлый час и сравниваем с настоящим. если ростет или падает делаем выводы. но разовое изменение давления может и не говорить о изменении погоды. а вот если смотреть за 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 минут. пытался рисовать на бумаге и этот ньюанс мне помешал чтото построить вразумительное
Вы наверно еще не знаете, но сейчас идет 2016 год. А ваше решение ну 1995-2000. Ведь наверно знаете, что есть видеокарты, Windows всякие. А вы балуетесь всякими сдвигами по экрану. Просто создайте все переменые которые надо вывести на экран. всякие давления и стелочки и ввыдете за раз на экран и все.Потом можете обновлять экран раз в секунду , минуту, час. Но целиком.
а можно блок схему? не могу придумать алгоритм. переменные не проблема, главное как план составить
Ну начинается так
Но можно так . На энкодер не смотрите.
а что код словами делает? в 3 посте. мне надо как я понимаю запомнить 2 переменные(из позиции 14,15) и раз в час записывать их в позицию 12,13. Позиция 14,15 обновляются каждый час и переложить данные из 14,15 в 12,13 надо до того как обновились данные в 14,15. В позиции 12,13 старые данные будут просто затираться вновь поступившими
Надо сначала определится, что выводить и в какой форме. Скорее вам надо выводить результат. А вот промежуточные значения и ход решения задачи не нужен. Экран вам не черновик, а чистовик в котором надо только ответы. Так что если потеряются ненужные цифры так и пусть теряются.
из куска кода выше видно что данные выводятся в позицию 14 и 15 и меняются раз в час(условно) . мне надо в момент перед тем как обновятся данные 14 и 15 положить их в позиции 12 и 13. выводить надо в том же виде как и были в позиции 14 и 15. важен конечно результат
А что указатели в ардуино отменили. Или char .
Ну и так набросок.
в посту #9 вы переписали мой код. спасибо так действительно более правильно, красиво. я перепишу свою писанину. что обозначают коментарии #1,2,3? но из поста #9 я не вижу как мне stat_davl и Raznica перенести в другую позицию на экране перед (одновременно с) когда сработает
ведь если сработает это условие переменные с stat_davl и Raznica будут перезаписаны и брать данные с них надо до того
Про #1,#2,#3. Вы конечно слышали про принцип модульности. Ну или ЛЕГО конструктор. Когда один модуль(деталь) выдернуть из одной консрукции и воткнуть в другую. Вот что-то подобное. Но так как я не хочу создавать свои классы и библиотеки. А элементарный модуль , что бы нормально работал должен быть в разных местах. Вот я и отмечаю модуль #1 модуль #2. Вот примерный шаблон.
Но есть и дальнейшее развитие этой идеи. Модуль становится элементарным вычислительным процессом.
Ну и наконец. Как я вам предлагал ранее вынести экран в один модуль процесс. И дальше не заморачиваться.
спасибо на счёт # так и подумал. а если делить на потоки... допустим переменные записываем из одного потока, а как синхронизироваться? для меня проблема в том что не знаю как взять данные stat_davl и Raznica ПЕРЕД их обновлением, ну или не взять тогда как вывести перед обновлением. потому что после обновления брать их уже поздно. и за долго до обновления тоже не то. то есть позиция 14,15 должна переноситься в 12,13 прямо перед обновлением 14,15. может я не то несу, но именно это не понимаю. может не вижу очевидного...
P.S. если использовать счётчики с разным периодом как вы выше написали то потоки пойдут с разными количествами циклов. однако потоки по времени не должны расходится не насколько. по этому стит ли делать различное количество потоков
ну с независимыми потоками вы поняли. А вот с перемеными из разных потоков. Вот вывод на экран это последний поток, так как он показывант (использует) переменные которые уже создали предыдущие потоки. Вообще-то экран это предпоследний поток. последний это Контролы. Ну это клавиатура которая командует, что надо показывать на экране.
Теперь по переменым. есть у нас
Вот там задайте пустые переменные. То есть в setup() получите первое давление. А изменение сделайте "БЕЗ ИЗМЕНЕНИЙ".РАЗНИЦА=0. И все.
а почему
char * stat_davl;
а не
char
=stat_davl;
ещё
if
(условие выполняется)
{то действие
и
if
(условие выполняется )то действие
;
в первом условии есть фигурные скобки а то что ниже без скобок. это для общего развития
вывод на экран это последний поток, так как он показывант (использует) переменные которые уже создали предыдущие потоки
ну мне хочется разобраться если первый поток крутится с периодичностью 1 час. а второй поток с периодом 6 минут(всё условно). то что мешает 2 потоку смотреть переменные из 1 потока с такой же частотой. я выложу программу. может поправите, а то у меня похоже дефицит головного мозга. спасибо за возьню со мной. но я по вашему написанному поправил свой некрасивый if
Вот перебрал ваш код под себя. Скопилировать не могу. Надо искать библиотеки.
спасибо за оператор else. но я не вижу никаких изменений. может я неправильно изъясняюсь... но мне надо(я с начала темы пишу одно и тоже). Есть данные в позиции 14,15 их видно как stat_davl и Raznica так вот их надо раз в час перекладывать в позицию 12,13 прямо перед тем как в позиции 14,15 наступит
const
long
interval = 360000;
// 1/10 часа время обновления давления. я же тему начал по этому только. я принципиальных изменений не вижу. уж извините
Ну а так?
Похоже код надо и дальше чистить. http://arduino.ua/ru/prog/LiquidCrystalCreateChar
спасибо огромное. вроде бы даже работает. давление сейчас стоит как вкопанное, пришёл антициклон. но по первичному включению когда датчик врёт не прогревшись видно что алгоритм работает. пожелание для тех кто решит воспользоваться этим кодом исправить ошибки:
BME280 mySensor;
// создать датчик давления
надо писать ниже библиотеки соответствующей.
и Davlenie_old а у вас почему то везде Davenie_old первый раз думал описка, смотрю и дальше также