Выполнение команды один раз
- Войдите на сайт для отправки комментариев
Чт, 12/04/2018 - 12:13
Добрый день ! Прошу Вашей помощи , создал скетч для автоматического включения и выключения кондиционера по датчику температуры, все работает НО есть одно но ! Помещение большое и датчик не успевает охладиться до выполнения второго условия , соответственно команда выполняется два раза, не критично , но хочется понять как выполнить команду только один раз . Выставлял опрос датчика на 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 мин.
инерционность охлаждения большого помещения наверное очень большая, я бы вообще минут на 10 поставил
добавьте переменную с текущим режимом - если кондишн включен и пока всё ещё жарко, то включать его опять не надо и наоборот.
добавьте переменную с текущим режимом - если кондишн включен и пока всё ещё жарко, то включать его опять не надо и наоборот.
А будьте добры какой нибудь примерчик как это сделать, если Вам не трудно, не хватает пока навыков програмирования .
static boolean alreadyON = false;
if (temp < 22.5 && alreadyON) {
alreadyON = !alreadyON;
бла бла бла
}
if (temp > 26.1 && !alreadyON) {
alreadyON = !alreadyON;
бла бла бла
}
не по сути вопроса - массивы команд для ИК-пульта уберите в PROGMEM. Вы, вроде уже приходили с этим скетчем и жаловались. что на 3 команды не хватает памяти. Вам уже тогда сказали. что делать ...
Сейчас вы одну команду убрали и, вроде, работает - но это ненадежно. Чуть-чуть скетч измените и все снова заглючит.