влажность и вытяжка на кухне

gulin176
Offline
Зарегистрирован: 03.09.2016
[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 задают строгий интервал на выключение. хотелось бы чтобы это как то увязать с приготовлением пищи

arDubino
Offline
Зарегистрирован: 12.01.2017

сделай еще пин на кнопку включил значит идет готовка. соответственно в теле лупа проверку и ставь другой интервал при этом условии

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

Ну тогда ардуино вообще не надо. Так и было до этого, кнопкой включил выключил. Надо что-то подобное как включение только наоборот, чтобы с высокого уровня влажности происходило падение и это было сигналом выключения

gulin176
Offline
Зарегистрирован: 03.09.2016
[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]

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

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

прошу прощения за код я не програмист. просто ИНОГДА есть время свободное и мне интересно это.

было бы здорово замечания по коду