влажность и вытяжка на кухне
- Войдите на сайт для отправки комментариев
Чт, 30/03/2017 - 10:43
[code]
#define DEBUG 1
#include <Average.h>
#include "SparkFunBME280.h"
#include "Wire.h"
Average<float> ave(10); // Для усреднения последних значений с датчика создаём массив на 10 шт. float
unsigned long runInterval = 600000; // Если включаем вентилятор, то не меньше, чем на 5 минут (5 * 60 * 1'000 миллисекунд = 300'000)
unsigned long idleInterval = 12000; // Какая бы ни была влажность, после выключения даём мотору 2 минуты передышки
const long interval = 2000; // Опрашиваем датчик
BME280 mySensor;
void setup() {
mySensor.settings.commInterface = I2C_MODE;
mySensor.settings.I2CAddress = 0x76;
mySensor.settings.runMode = 3; //Normal mode
mySensor.settings.tStandby = 0;
mySensor.settings.filter = 4;
mySensor.settings.tempOverSample = 5;
mySensor.settings.pressOverSample = 5;
mySensor.settings.humidOverSample = 5;
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
if (DEBUG == 1) {
Serial.begin(9600);
Serial.print("Starting, humidity treshold set to: ");
// Serial.print(treshold);
Serial.println("%.");
}
mySensor.begin();
}
void loop() {
float t = mySensor.readTempC();
float h = mySensor.readFloatHumidity();
if (isnan(h) || isnan(t)) {
Serial.println("Sensor error!");
delay(interval);
return;
} else {
ave.push(h); // Кладём результат измерения влажности в массив. В массиве помещается 10 измерений, новоприбывшее выталкивает самое старое.
if (DEBUG == 1) {
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %");
Serial.print("Humidity running average: ");
Serial.print(ave.mean());
Serial.print(" %");
Serial.print("Temp.: ");
Serial.print(t);
Serial.println("C");
}
float b = ave.mean()+1;
Serial.print(h);
Serial.print(b);
if (h >= b || t >34 || h >76 ) {
digitalWrite(LED_BUILTIN, HIGH);
if (DEBUG == 1) {
Serial.println("Fan started.");
}
delay(runInterval);
digitalWrite(LED_BUILTIN, LOW);
if (DEBUG == 1) {
Serial.println("Fan will cool down.");
}
flushData(); // После того, как мы остудили мотор, надо "прочистить" массив с замерами влажности актуальными замерами. Иначе мотор будет врубаться снова и снова.
delay(idleInterval);
}
}
delay(interval);
}
void flushData() {
int k = 0;
if (DEBUG == 1) {
Serial.println("Flushing sensor readings.");
}
while (k < 10) {
float t = mySensor.readTempC();
float h = mySensor.readFloatHumidity();
if (isnan(h) || isnan(t)) {
Serial.println("Sensor error!");
delay(interval);
return;
} else {
ave.push(h); // Кладём результат измерения влажности в массив. В массиве помещается 10 измерений, новоприбывшее выталкивает самое старое.
}
k++;
delay(100);
}
}
[/code]
не нашёл подобной реализации.
датчик ВМЕ280 следит за увеличение влажности на 1 %(найдено практически). строка 50, 53. модель работает. если на кухне ничего не происходит то колебания измерений не превышают 1%. проблема в том как сделать теперь выключаться вытяжке. сейчас строки 6, 58 задают строгий интервал на выключение. хотелось бы чтобы это как то увязать с приготовлением пищи
сделай еще пин на кнопку включил значит идет готовка. соответственно в теле лупа проверку и ставь другой интервал при этом условии
Ну тогда ардуино вообще не надо. Так и было до этого, кнопкой включил выключил. Надо что-то подобное как включение только наоборот, чтобы с высокого уровня влажности происходило падение и это было сигналом выключения
[code] #include "Wire.h" #include "Sodaq_SHT2x.h" #include <Average.h> #include <Adafruit_ST7735.h> #include <SPI.h> Average<float> ave(10); const long interval = 12000; float temp; #define sclk 13 #define sda 11 #define lcd_cs 10 #define dc 8 #define rst 9 Adafruit_ST7735 tft = Adafruit_ST7735(lcd_cs, dc, rst); #define COLOR1 ST7735_WHITE #define COLOR2 ST7735_BLACK void setup() { Wire.begin(); Serial.begin(9600); pinMode(12, OUTPUT); digitalWrite(12, LOW); tft.initR(INITR_BLACKTAB); tft.setTextWrap(false); // Allow text to run off right edge tft.setRotation(2); } void loop() { Serial.println(temp); int text_color; float t = SHT2x.GetTemperature(); float h = SHT2x.GetHumidity(); ave.push(h); tft.fillScreen(COLOR1); tft.setCursor(1, 1); tft.setTextColor(ST7735_RED); tft.setTextSize(2); tft.println("h="); tft.setCursor(26, 1); tft.setTextColor(COLOR1, COLOR2); tft.setTextSize(2); tft.setTextColor(text_color, COLOR2); tft.print(h); tft.setCursor(1, 20); tft.setTextColor(ST7735_RED); tft.setTextSize(2); tft.println("b="); tft.setCursor(26, 20); tft.setTextColor(COLOR1, COLOR2); tft.setTextSize(2); tft.setTextColor(text_color, COLOR2); tft.print(ave.mean()); tft.setCursor(1, 60); tft.setTextColor(ST7735_RED); tft.setTextSize(2); tft.println("v="); tft.setCursor(26, 60); tft.setTextColor(COLOR1, COLOR2); tft.setTextSize(2); tft.setTextColor(text_color, COLOR2); tft.print(temp); float b = ave.mean() + 0.5; if (h >= b || t > 34 || h > 76 ) { temp = h; Serial.println(temp); tft.setCursor(1, 40); tft.setTextColor(ST7735_RED); tft.setTextSize(2); tft.println("v="); tft.setCursor(26, 40); tft.setTextColor(COLOR1, COLOR2); tft.setTextSize(2); tft.setTextColor(text_color, COLOR2); tft.print(temp); digitalWrite(12, HIGH); delay(interval); } if (temp > h) { digitalWrite(12, LOW); } flushData(); } void flushData() { int k = 0; while (k < 10) { float h = SHT2x.GetHumidity(); ave.push(h); k++; delay(100); } } [/code]сделал новую версию программы. у старой была большая проблема что програма отслеживала не нормальный рост влажности на кухне, что практически всегда совпадает с приготовлением пищи, однако вентилятор крутился строго заданный перид времени и выключался.
новая версия также смотрит чтобы влажность повысилась за пределы погрешности, фиксирует значение влажности в этот момент и дальше период работы вентилятора, потом смотрим если влажность выше зафиксированной влажности в момент включения вентилятора то продолжаем крутить его. если влажность меньше то выключаем вентилятор и снова ждём когда влажность выйдет за усреднённый предел.
прошу прощения за код я не програмист. просто ИНОГДА есть время свободное и мне интересно это.
было бы здорово замечания по коду