Выполнение команды один раз

xDee
Offline
Зарегистрирован: 27.11.2017

Добрый день ! Прошу Вашей помощи , создал скетч для автоматического включения и выключения кондиционера по датчику температуры, все работает НО есть одно но ! Помещение большое и датчик не успевает охладиться до выполнения второго условия , соответственно команда выполняется два раза, не критично , но хочется понять как выполнить команду только один раз . Выставлял опрос датчика на 2 минуты, не помогает , 3 минуты не хочется. Посоветуйте как сделать правильно , пожалуйста.

//IRsend pin 3
//Libraries
#include <DHT.h>
#include <Wire.h> 
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include <IRremote.h>

//Constants
#define DHTPIN 7     // what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302)
DHT dht(DHTPIN, DHTTYPE); //// Initialize DHT sensor for normal 16mhz Arduino

//ALWAYS USE THIS WITH LCD I2C and Addres 0x3F
#define I2C_ADDR 0x3F
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

//Variables
int chk;
int khz = 38;
float hum;  //Stores humidity value
float temp; //Stores temperature value
IRsend irsend;

void setup()
{
  Serial.begin(9600);
  dht.begin();
  lcd.begin(16,2);
  lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
  lcd.setBacklight(HIGH);
}

void loop()
{
  
  //Read data and store it to variables hum and temp
  hum = dht.readHumidity();
  temp = dht.readTemperature();
     
 // lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Temp: ");
  lcd.print(temp);
  lcd.print(" ");
  lcd.print((char)223);
  lcd.print("C");
  lcd.setCursor(0,1);
  lcd.print("Hum:  ");
  lcd.print(hum);
  lcd.print(" %");

 //-------------------OFF----------------------------------
  //Condishen OFF
  if (temp < 22.5) {
  unsigned int irSignal[] = {8900,4350, 600,1600, 600,1600, 600,500, 600,500, 600,500, 600,500, 550,1650, 600,1600, 600,1600, 600,1600, 600,1650, 550,1650, 550,1650, 600,500, 550,1650, 600,500, 550,500, 600,500, 600,500, 600,500, 600,500, 550,1650, 600,1600, 600,1600, 600,500, 600,500, 600,500, 550,500, 600,500, 600,500, 600,500, 600,500, 550,550, 550,500, 600,500, 600,500, 600,500, 600,1600, 600,500, 550,1650, 600,500, 550,550, 550,500, 600,500, 600,500, 600,500, 600,500, 550,500, 600,500, 600,500, 600,500, 600,500, 550,500, 600,1650, 550,500, 600,500, 600,500, 600,500, 600,500, 550,500, 600,500, 600,500, 600,500, 600,500, 600,500, 550,500, 600,500, 600,500, 600,500, 600,500, 550,500, 600,500, 600,500, 600,500, 600,500, 550,500, 600,500, 600,500, 600,500, 600,500, 600,500, 550,500, 600,500, 600,500, 600,500, 600,500, 550,500, 600,500, 600,1600, 600,500, 600,1600, 600,500, 600,500, 600,500, 600,500, 600,450, 600,1650, 600,1600, 600,1600, 600,500, 600,500, 550,500, 650,1600, 550,1650, 600};
  irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), khz);
  }
  else (temp > 22.4); {
  }
  //------------------ON-------------------------------------
  //Condishen ON
  if (temp > 26.1) {
  unsigned int irSignal[] = {8900,4400, 600,1600, 600,1600, 600,500, 600,500, 600,500, 550,500, 600,1650, 550,1650, 600,1600, 600,1600, 600,1600, 600,1600, 600,1650, 550,500, 600,1650, 550,500, 600,500, 600,500, 600,500, 600,500, 550,550, 550,1650, 550,1650, 600,1600, 600,500, 600,500, 550,500, 600,500, 600,500, 600,500, 600,500, 550,550, 550,500, 600,500, 600,500, 600,500, 600,500, 550,1650, 600,500, 550,1650, 600,500, 550,500, 600,500, 600,500, 600,500, 600,500, 550,500, 600,500, 600,500, 600,500, 600,500, 550,550, 550,500, 600,1650, 550,500, 600,500, 600,500, 600,500, 600,500, 550,500, 600,500, 600,500, 600,500, 600,500, 550,500, 600,500, 600,500, 600,500, 600,500, 600,500, 550,500, 600,500, 600,500, 600,500, 600,500, 550,500, 600,500, 600,1600, 600,500, 600,500, 600,500, 600,500, 550,500, 600,500, 600,500, 600,500, 600,500, 600,500, 550,1650, 600,500, 550,1650, 600,500, 550,500, 600,500, 600,500, 600,500, 600,1600, 600,1600, 600,1600, 600,500, 600,500, 600,1600, 600,1600, 600,1600, 600};
  irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), khz);
  } 
  else (temp < 26.0); {
  }
  //------------------------------------------------------
  
  delay(120000); //Delay 2 мин.

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

инерционность охлаждения большого помещения наверное очень большая, я бы вообще минут на 10 поставил

ven-til
Offline
Зарегистрирован: 13.02.2018

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

 

xDee
Offline
Зарегистрирован: 27.11.2017

ven-til пишет:

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

А будьте добры какой нибудь примерчик как это сделать, если Вам не трудно, не хватает пока навыков програмирования .

ven-til
Offline
Зарегистрирован: 13.02.2018

static boolean alreadyON = false;

if (temp < 22.5 && alreadyON) {

alreadyON = !alreadyON;

бла бла бла

}

if (temp > 26.1 && !alreadyON) {

alreadyON = !alreadyON;

бла бла бла

}

b707
Offline
Зарегистрирован: 26.05.2017

не по сути вопроса - массивы команд для ИК-пульта уберите в PROGMEM.  Вы, вроде уже приходили с этим скетчем и жаловались. что на 3 команды не хватает памяти. Вам уже тогда сказали. что делать ...

Сейчас вы одну команду убрали и, вроде, работает - но это ненадежно. Чуть-чуть скетч измените и все снова заглючит.