roboforum.ru

Технический форум по робототехнике.

Умная вытяжка в Ванной-Санузле

Как собрать и запрограммировать робота на Arduino(Freeduino, Roboduino, Seeduino ...). Используем Wiring и Processing.

Умная вытяжка в Ванной-Санузле

Сообщение kos2an » 18 июл 2018, 20:03

Добрый день.
Хочу сделать умную вытяжку в ванной-туалете. Все собрал все. Скетч написал. Но не могу разобраться с задержкой. Нужно чтобы при любом нажатии на выключатель(неважно верх или вниз, считываем изменение сигнала на 10 пине) включалась вытяжка на определенное время (timeout). Все вроде работает но не так как я хочу. При включении ардуины сразу через timeot включается вытяжка, неважно было ли изменение на 10 пине или нет. Тоесть миллис меньше таймаута. А потом все работает как нужно, при каждом нажатие на выключатель. Как мне это обойти? Изображение
Код: Выделить всёРазвернуть
#include <stDHT.h>
DHT dv(DHT22);
#define r1 3 // Указываем что реле на 3 пине
#define r2 2 // Указываем что реле на 2 пине
#define dht 4 // Указываем что датчик влажности на 4 пине
#define k 10 //  Сигнал с принудительного включателя на 10 пине
#define pirPin 11 // Указываем что датчик движения на 11 пине
int val,flag,calibrationTime;
unsigned long int currentTime,timeout,T1,lowIn,pause;
//lowIn - Время, в которое был принят сигнал отсутствия движения(LOW)
boolean lockLow,takeLowTime;




void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600); // Скорость работы порта
pinMode(r1, OUTPUT);
pinMode(r2, OUTPUT);
pinMode(k, INPUT);
pinMode(pirPin, INPUT);
digitalWrite(pirPin, LOW);
//!ВНИМАНИЕ! При использовании n-p-n реле необходимо в след. строчке поменять HIGH на LOW
digitalWrite(r1, HIGH); // Выключаем реле - посылаем высокий сигнал
digitalWrite(r2, HIGH);   
  val=digitalRead(k);
  flag=val;
  timeout=6000;
  currentTime = millis()+timeout+1000;
  calibrationTime = 10; //Время калибровки датчика (10-60 сек. по даташиту)
  pause = 120000; //pause - Пауза, после которой движение считается оконченным
  lockLow = true; //lockLow - Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
}


void loop()
{
  T1==millis();
  if (millis()<T1)
  {
    currentTime = millis()+timeout+1000;
    }
  // put your main code here, to run repeatedly:
int h = dv.readHumidity(dht); //Измеряем влажность
  int t = dv.readTemperature(dht); //Измеряем температуру
 
  Serial.print("Hum: ");
  Serial.print(h);
  Serial.print(" %");
  Serial.print("Temp: ");
  Serial.print(t);
  Serial.println(" C ");
   if (digitalRead(pirPin) == HIGH)
  {
    Serial.println("yesssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss");
  }
  delay(500);
  if (digitalRead(pirPin) == LOW)
  {
    Serial.println("OOO");
  }
  delay(50);
 

val = digitalRead(k);  // Включаем вытяжку на 6 минут
if (val != flag)
  {
flag=val;

currentTime=millis();
  }

if (millis() - currentTime < timeout)
      {
    int xxx = millis() - currentTime;
    Serial.println(xxx);
    digitalWrite(r1, LOW);   
     }
else
{
  if (h>70)
{
    digitalWrite(r1, LOW);
} // Включаем реле - посылаем низкий уровень сигнала
else
{
    digitalWrite(r1, HIGH); // Отключаем реле - посылаем высокий уровень сигнала   
}
  }
   //Если обнаружено движение
  if(digitalRead(pirPin) == HIGH)
  {
    //Если до этого момента еще не включили реле
    if(lockLow)
    {
      lockLow = false;     
      //Включаем реле.
      //!ВНИМАНИЕ! При использовании n-p-n реле необходимо в след. строчке поменять LOW на HIGH
      digitalWrite(r2, LOW);
      delay(50);
    }       
    takeLowTime = true; //takeLowTime - Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения
  }

  //Ели движения нет
  if(digitalRead(pirPin) == LOW)
  {     
    //Если время окончания движения еще не записано
    if(takeLowTime)
    {
      lowIn = millis();          //Сохраним время окончания движения
      takeLowTime = false;       //Изменим значения флага, чтобы больше не брать время, пока не будет нового движения
    }
    //Если время без движение превышает паузу => движение окончено
    if(!lockLow && millis() - lowIn > pause)
    {
      //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения
      lockLow = true;               
      digitalWrite(r2, HIGH);
      delay(50);
    }
  }
}
kos2an
 
Сообщения: 1
Зарегистрирован: 18 июл 2018, 20:01

Вернуться в Arduino и другие Xduino

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4