Помогите оптимизировать
- Войдите на сайт для отправки комментариев
Сб, 07/11/2020 - 14:11
Вообщем всем на суд первая программа в жизни поэтому прошу не судить строго.
Это чудище модуль управления теплицей. Все вроде получилось как задумано и работает только убивает глюк что все замирает при чтении данных с датчиков. Поставил таймер теперь все зависает раз в 5 секунд. Помогите разоьраться что бы не тупить в будущем. Ну и вообще любые предложения п оптимизации готов выслушать а если еще и покажете как это сделать будет совсем приятно.
#include <LiquidCrystal.h> // экран const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2; LiquidCrystal lcd(rs, en, d4, d5, d6, d7); #include "GyverTimer.h" GTimer myTimer(MS); // создать миллисекундный таймер #include <Wire.h> #include <SPI.h> #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> #define BME_SCK 13 #define BME_MISO 12 #define BME_MOSI 11 #define BME_CS 10 #define SEALEVELPRESSURE_HPA (1013.25) Adafruit_BME280 bme; // для работы c кнопкой #include "GyverEncoder.h" #define CLK A0 #define DT A2 #define SW A1 Encoder enc1(CLK, DT, SW); int page = 0; float tempval = 18.0; float humval = 35.0; int soilval = -10; int co2val = 1000; const int dry = 691; const int wet = 304; int csoil = 0; float chum = 0; float ctemp; void setup() { Serial.begin(9600); // экран lcd.begin(16, 2); bme.begin();// инициализация датчика BME280 enc1.setType(TYPE2); // инициализация энкодера lcd.setCursor(4, 0); lcd.print("Infected"); lcd.setCursor(4, 1); lcd.print("Mushrooms"); delay(4000); lcd.clear(); pinMode(6 , OUTPUT); pinMode(7 , OUTPUT); pinMode(8 , OUTPUT); //pinMode(9 , OUTPUT); myTimer.setInterval(5000); readSensors () ; } void loop() { if (myTimer.isReady()) readSensors () ; encoderOp(); printMenu(); //soilSensor(); relay(); } void printMenu () { switch (page) { case 0: lcd.setCursor(0, 0); lcd.print("Now: "); lcd.setCursor(7, 0); lcd.print("Temp:"); lcd.print(ctemp, 1); lcd.setCursor(0, 1); lcd.print("Set: "); lcd.setCursor(7, 1); lcd.print("Temp:"); lcd.print(tempval); break; case 1: lcd.setCursor(0, 0); lcd.print("Now: "); lcd.setCursor(8, 0); lcd.print("Hum:"); lcd.print(chum, 1); lcd.setCursor(0, 1); lcd.print("Set: "); lcd.setCursor(8, 1); lcd.print("Hum:"); lcd.print(humval); break; case 2: lcd.setCursor(0, 0); lcd.print("Now: "); lcd.setCursor(9, 0); lcd.print("Soil:"); csoil = soilSensor(); lcd.print(csoil); lcd.setCursor(0, 1); lcd.print("Set: "); lcd.setCursor(9, 1); lcd.print("Soil:"); lcd.print(soilval); break; case 3: lcd.setCursor(0, 0); lcd.print("Now: "); lcd.setCursor(8, 0); lcd.print("CO2:"); lcd.print("0000"); lcd.setCursor(0, 1); lcd.print("Set: "); lcd.setCursor(8, 1); lcd.print("CO2:"); lcd.print(co2val); break; } } void encoderOp() { enc1.tick(); if (enc1.isTurn()) { // при любом повороте lcd.clear(); // очищаем дисплей if (enc1.isRight()) { page++; if (page >= 4) page = 3; // ограничиваем позицию курсора } if (enc1.isLeft()) { page--; if (page < 0) page = 0; // ограничиваем позицию курсора } // при нажатом повороте меняем переменные ++ if (enc1.isRightH()) { switch (page) { case 0: tempval++; break; case 1: humval++; break; case 2: soilval++; break; case 3: co2val++; break; } } // при нажатом повороте меняем переменные -- if (enc1.isLeftH()) { switch (page) { case 0: tempval--; break; case 1: humval--; break; case 2: soilval--; break; case 3: co2val--; break; } } } } void relay () { if (tempval > ctemp) digitalWrite(6, LOW); if (tempval < ctemp) digitalWrite(6, HIGH); if (humval > chum) digitalWrite(7, LOW); if (humval < chum) digitalWrite(7, HIGH); if (soilval > csoil) digitalWrite( 8 , LOW); if (soilval < csoil) digitalWrite( 8 , HIGH); //if ( > bme.readHumidity()) digitalWrite(8, LOW); //if (co2val > bme.readHumidity()) digitalWrite(9, LOW); } int soilSensor() { int sensorVal = analogRead (A7); //Serial.println(sensorVal); int soilperc = map (sensorVal, wet, dry, 99, 0); //Serial.println(soilperc); return soilperc; } void readSensors () { csoil = soilSensor(); chum = bme.readHumidity() ; ctemp = bme.readTemperature(); }
Вы наверное думаете, что сейчас у всех возникнет жгучее желание поискать что же за датчики там у этого начинающего огородника зависают и 50 человек с форума всю ночь просидят оптимизируя скетч - потому что чем ещё заняться то?
Научитесь действовать правильно: закомментируйте все, что не относится к проблеме - зависанию при чтении сенсора и, если проблема сохранится, поинтересуйтесь - отчего в этом маленьком скетче, на строке N могут возникать задержки?
А если проблема не сохранится - ищите ее в закомментированных фрагментах.
Да вроде была акая тема в проектах. И довели ее до ума. Вроде...
А так - да, побежали оптимизировать.
Простите, насколько Вы понимаете написанные коды и насколько свободно можете их изменять? (это к тому, как именно Вам объяснять проблему)
Все сам написал , так что могу все поменять изменять ) если не трудно обьясни в каком направлении двигаться
Для начала, посмотрите в библиотеку на функцию Adafruit_BME280::readHumidity, Вы увидите, что первое, что она делает - это вызывает readTemperature. Т.е. Вы в своём коде вызываете readTemperature дважды, а зачем? Первое, что я бы попробовал - это дописал бы в библиотеку функцию, которая один раз это делает, а возвращает и температуру, и влажность. Этим Вы сократите время вдвое. Если и это не устроит, тогда поговорим дальше.
Вообщем всем на суд первая программа в жизни поэтому прошу не судить строго.
Это чудище модуль управления теплицей. Все вроде получилось как задумано и работает только убивает глюк что все замирает при чтении данных с датчиков.
Ничего там не замирает - просто без таймера (костыль) датчики в основном цикле вообще не читаются.