Вытяжка по влажности

Всем привет.
Проблемка такая. нужно включать вытяжку по двум условиям.

  1. принудительно кнопкой по времени у меня это 10 минут.
  2. По датчику влажности порог 60 %.
    Так вот в чем проблема отдельно по 1 пункту и отдельно по 2, работает как часы. Но мне нужно что бы два условия работали вместе,
    но получается что по первому условию, работает а по второму нет. Тут я понимаю то что в 1 и 2 условиях есть да или нет и дно условие блокирует другое.
    как это победить?
#include <SPI.h>
#include "Adafruit_GFX.h"                 //  подключаем графическую библиотеку
#include <Adafruit_ST7789.h>
#include <Arduino_ST7789_Fast.h>
#include "OneWire.h"
#include "DallasTemperature.h"
#include <SparkFun_Qwiic_Humidity_AHT20.h>
AHT20 humiditySensor;
#define CS          10      
#define DC          8      
#define RST          9 
 #define MISO 12           // Пин подключения вывода дисплея SDO(MISO)
#define MOSI 11           // Пин подключения вывода дисплея SDI(MOSI)
#define CLK 13            // Пин подключения вывода дисплея SCK 
Adafruit_ST7789 tft = Adafruit_ST7789(CS, DC, RST);

#define button A1    // кнопка включения вентилятора 
#define fan A3 //       Выход на вытяжку
int maxHum = 60;   //    максимальная влажность
int time_fan=6000;   //60000 миллисекунд=600 секунд= 10 минут включение вытяжки от кнопки

 OneWire oneWire(2);  // порт подключения датчика 18b20
DallasTemperature ds(&oneWire);
DallasTemperature sensors(&oneWire); // Передача ссылки на нашу библиотеку oneWire библиотеке датчика температуры Dallas Temperature
int flag=0;
unsigned long time;

void setup() { 
 time=millis();
 pinMode(button, INPUT);  //  Порт Кнопки как вход
digitalWrite(button, HIGH);   // Порт кнопки высокий уровень  
 pinMode(fan,  OUTPUT);        //Выход на вытяжку
 
 ds.begin();                 // инициализация датчика ds18b20
  Serial.begin(9600);
    Wire.begin(); // инициализации шины I2C
  if (humiditySensor.begin() == false){                // инициализация и проверка подключения
    Serial.println("AHT20 not detected");               // если датчик не обнаружен, вводим программу в бесконечный цикл
    while (1);
  }
 tft.cp437(true); // Необходимо чтоб все буквы выводились корректно
  tft.init(240, 320); //  разрешение экрана
tft.invertDisplay(false);  //инверсия цветов
 tft.setRotation(3);         //< Переворачиваем дисплей.Возможны два варианта 1 и 3
 tft.fillScreen(ST77XX_BLACK); 
 tft.cp437(true); // Необходимо чтоб все буквы выводились корректно
  }
  void loop() { 
                          if(digitalRead(button)==LOW&&flag==0)   // Кнопка включения вытяжки
                         {    flag=1;
                          time=millis();     }
                          if(digitalRead(button)==HIGH&&flag==1&&((millis()-time)>time_fan))  {
                           flag=0;   }
                            digitalWrite(fan,flag);
       ds.requestTemperatures(); 
       // если от датчика получены свежие данные, выводим их
  if (humiditySensor.available() == true)
  {
    float temperature = humiditySensor.getTemperature(); // получаем температуру
    float humidity = humiditySensor.getHumidity(); // получаем относительную влажность
  
  tft.setTextColor(WHITE,BLACK);
   tft.setTextSize(2);
    tft.setCursor(40, 1);
 tft.print(utf8rus("Темп."));
  tft.setCursor(112, 1);
 tft.print(temperature, 1);

 tft.setTextColor(CYAN,BLACK);
  tft.setTextSize(2);
  tft.setCursor(40, 20);
  tft.print(utf8rus("Влаж."));
  tft.setCursor(112, 20);
  tft.print(humidity, 1);   //   Выводим влажность

  tft.setCursor(170, 20);
  tft.setTextColor(RED,BLACK);
   tft.print(utf8rus("Уст."));
    tft.setCursor(225, 20);
   tft.print(maxHum);

  tft.setTextColor(YELLOW,BLACK);
  tft.setTextSize(2);
  tft.setCursor(40, 40);
  tft.print(utf8rus("Темп."));
  tft.setCursor(112, 40);
tft.print(ds.getTempCByIndex ( 0),1);   // выводим температуру

if(humidity > maxHum ) {             // Если превысилась  влаж.
      digitalWrite(fan, HIGH );              //ТО включаем высокий уровень на выводе №3
   } else {
     digitalWrite(fan, LOW);                 //если не превысилась то низкий уровень
  }   
  }
  }

Ух тыж, дайте две!
Попробуйте выложить код через символ </> , а заодно и вопрос зададите.

Зачем Вам вопрос? И так всё понятно, ещё после первой темы TC.

Оперативно

Работает только по первому условию

Что “Работает только по первому условию”?

Выход на вытяжку работает от нажатия кнопки, от датчика влажности не хотит

Начните с того, чтобы отформатировать код по человечески. В Ардуино Иде нажмите Ctrl-T, потом код выдели е и вставьте в форум

Сдается мне вы обманываете.
А влажность при этом на экран выводится? И сколько там?

``#include <SPI.h>
#include “Adafruit_GFX.h” // подключаем графическую библиотеку
#include <Adafruit_ST7789.h>
#include <Arduino_ST7789_Fast.h>
#include “OneWire.h”
#include “DallasTemperature.h”
#include <SparkFun_Qwiic_Humidity_AHT20.h>
AHT20 humiditySensor;
#define CS 10
#define DC 8
#define RST 9
#define MISO 12 // Пин подключения вывода дисплея SDO(MISO)
#define MOSI 11 // Пин подключения вывода дисплея SDI(MOSI)
#define CLK 13 // Пин подключения вывода дисплея SCK
Adafruit_ST7789 tft = Adafruit_ST7789(CS, DC, RST);

#define button A1 // кнопка включения вентилятора
#define fan A3 // Выход на вытяжку
int maxHum = 60; // максимальная влажность
int time_fan = 6000; //60000 миллисекунд=600 секунд= 10 минут включение вытяжки от кнопки

OneWire oneWire(2); // порт подключения датчика 18b20
DallasTemperature ds(&oneWire);
DallasTemperature sensors(&oneWire); // Передача ссылки на нашу библиотеку oneWire библиотеке датчика температуры Dallas Temperature
int flag = 0;
unsigned long time;

void setup() {
time = millis();
pinMode(button, INPUT); // Порт Кнопки как вход
digitalWrite(button, HIGH); // Порт кнопки высокий уровень
pinMode(fan, OUTPUT); //Выход на вытяжку

ds.begin(); // инициализация датчика ds18b20
Serial.begin(9600);
Wire.begin(); // инициализации шины I2C
if (humiditySensor.begin() == false) { // инициализация и проверка подключения
Serial.println(“AHT20 not detected”); // если датчик не обнаружен, вводим программу в бесконечный цикл
while (1)
;
}
tft.cp437(true); // Необходимо чтоб все буквы выводились корректно
tft.init(240, 320); // разрешение экрана
tft.invertDisplay(false); //инверсия цветов
tft.setRotation(3); //< Переворачиваем дисплей.Возможны два варианта 1 и 3
tft.fillScreen(ST77XX_BLACK);
tft.cp437(true); // Необходимо чтоб все буквы выводились корректно
}
void loop() {
if (digitalRead(button) == LOW && flag == 0) // Кнопка включения вытяжки
{
flag = 1;
time = millis();
}
if (digitalRead(button) == HIGH && flag == 1 && ((millis() - time) > time_fan)) {
flag = 0;
}
digitalWrite(fan, flag);
ds.requestTemperatures();
// если от датчика получены свежие данные, выводим их
if (humiditySensor.available() == true) {
float temperature = humiditySensor.getTemperature(); // получаем температуру
float humidity = humiditySensor.getHumidity(); // получаем относительную влажность

tft.setTextColor(WHITE, BLACK);
tft.setTextSize(2);
tft.setCursor(40, 1);
tft.print(utf8rus("Темп."));
tft.setCursor(112, 1);
tft.print(temperature, 1);

tft.setTextColor(CYAN, BLACK);
tft.setTextSize(2);
tft.setCursor(40, 20);
tft.print(utf8rus("Влаж."));
tft.setCursor(112, 20);
tft.print(humidity, 1);  //   Выводим влажность

tft.setCursor(170, 20);
tft.setTextColor(RED, BLACK);
tft.print(utf8rus("Уст."));
tft.setCursor(225, 20);
tft.print(maxHum);

tft.setTextColor(YELLOW, BLACK);
tft.setTextSize(2);
tft.setCursor(40, 40);
tft.print(utf8rus("Темп."));
tft.setCursor(112, 40);
tft.print(ds.getTempCByIndex(0), 1);  // выводим температуру

if (humidity > maxHum) {    // Если превысилась  влаж.
  digitalWrite(fan, HIGH);  //ТО включаем высокий уровень на выводе №3
} else {
  digitalWrite(fan, LOW);  //если не превысилась то низкий уровень
}

}
}
`

На экран все выводится, как и положено, но по превышению влажности 60 % на выходе fan высокого нет.

Он работает, но сразу же , после включения выключается стр 54))

1 лайк

Так вот я и говорю, как подружить эти два условия?

Логической операцией ИЛИ

2 лайка

Нет, вы этого не говорили!

1 лайк

Вам ответили в посте #14

В этом маленьком юмористическом спектакле(в скетче, то бишь) я не вижу обработки кнопки. Это раз.
Если влажность меньше, то вентилятор выключается независимо от других условий. Это два.
Пы.сы.: увидел обработку кнопки, она далеко за экраном. Сказали же отформатировать!

В блоке обработки кнопок вы устанавливаете flag. Там же пытаетесь управлять вентилятором - уберите оттуда код вентилятора.
В блоке проверки влажности сделайте аналогичную установку второй такой же переменной flag1. А управление вентилятором тоже уберите.

А после всего сделайте третий блок, в котором проверяйте если хоть одна из flag, flag1 взведена (вот условие ИЛИ), то только тогда включайте вентилятор. Иначе выключайте.


Ого как сложно.

#include <SPI.h>
#include "Adafruit_GFX.h"  //  подключаем графическую библиотеку
#include <Adafruit_ST7789.h>
#include <Arduino_ST7789_Fast.h>
#include "OneWire.h"
#include "DallasTemperature.h"
#include <SparkFun_Qwiic_Humidity_AHT20.h>
AHT20 humiditySensor;
#define CS 10
#define DC 8
#define RST 9
#define MISO 12  // Пин подключения вывода дисплея SDO(MISO)
#define MOSI 11  // Пин подключения вывода дисплея SDI(MOSI)
#define CLK 13   // Пин подключения вывода дисплея SCK
Adafruit_ST7789 tft = Adafruit_ST7789(CS, DC, RST);

#define button A1     // кнопка включения вентилятора
#define fan A3        //       Выход на вытяжку
int maxHum = 60;      //    максимальная влажность
int time_fan = 6000;  //60000 миллисекунд=600 секунд= 10 минут включение вытяжки от кнопки

OneWire oneWire(2);  // порт подключения датчика 18b20
DallasTemperature ds(&oneWire);
DallasTemperature sensors(&oneWire);  // Передача ссылки на нашу библиотеку oneWire библиотеке датчика температуры Dallas Temperature
int flag = 0;
unsigned long time;

void setup() {
  time = millis();
  pinMode(button, INPUT);      //  Порт Кнопки как вход
  digitalWrite(button, HIGH);  // Порт кнопки высокий уровень
  pinMode(fan, OUTPUT);        //Выход на вытяжку

  ds.begin();  // инициализация датчика ds18b20
  Serial.begin(9600);
  Wire.begin();                            // инициализации шины I2C
  if (humiditySensor.begin() == false) {   // инициализация и проверка подключения
    Serial.println("AHT20 not detected");  // если датчик не обнаружен, вводим программу в бесконечный цикл
    while (1)
      ;
  }
  tft.cp437(true);           // Необходимо чтоб все буквы выводились корректно
  tft.init(240, 320);        //  разрешение экрана
  tft.invertDisplay(false);  //инверсия цветов
  tft.setRotation(3);        //< Переворачиваем дисплей.Возможны два варианта 1 и 3
  tft.fillScreen(ST77XX_BLACK);
  tft.cp437(true);  // Необходимо чтоб все буквы выводились корректно
}
void loop() {
  if (digitalRead(button) == LOW && flag == 0)  // Кнопка включения вытяжки
  {
    flag = 1;
    time = millis();
  }
  if (digitalRead(button) == HIGH && flag == 1 && ((millis() - time) > time_fan)) {
    flag = 0;
  }
  digitalWrite(fan, flag);
  ds.requestTemperatures();
  // если от датчика получены свежие данные, выводим их
  if (humiditySensor.available() == true) {
    float temperature = humiditySensor.getTemperature();  // получаем температуру
    float humidity = humiditySensor.getHumidity();        // получаем относительную влажность

    tft.setTextColor(WHITE, BLACK);
    tft.setTextSize(2);
    tft.setCursor(40, 1);
    tft.print(utf8rus("Темп."));
    tft.setCursor(112, 1);
    tft.print(temperature, 1);

    tft.setTextColor(CYAN, BLACK);
    tft.setTextSize(2);
    tft.setCursor(40, 20);
    tft.print(utf8rus("Влаж."));
    tft.setCursor(112, 20);
    tft.print(humidity, 1);  //   Выводим влажность

    tft.setCursor(170, 20);
    tft.setTextColor(RED, BLACK);
    tft.print(utf8rus("Уст."));
    tft.setCursor(225, 20);
    tft.print(maxHum);

    tft.setTextColor(YELLOW, BLACK);
    tft.setTextSize(2);
    tft.setCursor(40, 40);
    tft.print(utf8rus("Темп."));
    tft.setCursor(112, 40);
    tft.print(ds.getTempCByIndex(0), 1);  // выводим температуру

    if (humidity > maxHum) {    // Если превысилась  влаж.
      digitalWrite(fan, HIGH);  //ТО включаем высокий уровень на выводе №3
    } else {
      digitalWrite(fan, LOW);  //если не превысилась то низкий уровень
    }
  }
}