Arduino kontrollerade rum värmesystem (3 / 7 steg)
Steg 3: Koden
Koden använder följande bibliotek (och allt tack vare författarna till dessa bibliotek):
- OneButton: http://www.mathertel.de/Arduino/OneButtonLibrary.a...
- DHT11: http://playground.arduino.cc/main/DHT11Lib
- Timer: https://github.com/JChristensen/Timer
- EEPROM & LiquidCrystal: både en del av Arduino IDE
#include "OneButton.h"
#include "EEPROM.h"
#include "Timer.h"
#define RELAY1 A1 / / Anslut luftfuktare till Relay1
#define RELAY2 A2 / / Anslut aggregatet till Relay2
#define TEMP_SET 25 / / start temperatur
#define MAX_TEMP 30 / / Max temperatur
#define HUM_SET 40 / / tröskel luftfuktighet
#define HUM_SET2 60
#define SWITCH_PIN A5 / / Anslut omkopplaren mellan stift A5 och marken
#define cykla 10 //Time i minuter för varje cykel
#include "LiquidCrystal.h"
#define LCD_RS 11 / / * LCD-RS pin till digital stift 12 - grön
#define LCD_EN 12 / / * LCD-aktivera stift till digital stift 11 - gul
#define LCD_D4 5 / / * LCD-D4 stift till digital stift 5 - blå
#define LCD_D5 6 / / * LCD-D5 stift till digital stift 6 - blå
#define LCD_D6 7 / / * LCD-D6 stift till digital stift 7 - blå
#define LCD_D7 8 / / * LCD-D7 stift till digital stift 8 - blå
#include "dht11.h"
#define DHT11PIN 13
dht11 DHT11;
LiquidCrystal lcd (LCD_RS, LCD_EN, LCD_D4, LCD_D5, LCD_D6, LCD_D7);
int temp_set;
Timer t;
OneButton button1(SWITCH_PIN, true);
void setup() {
pinMode (DHT11PIN, indata);
pinMode (LCD_RS, OUTPUT);
pinMode (LCD_EN, OUTPUT);
pinMode (LCD_D4, OUTPUT);
pinMode (LCD_D5, OUTPUT);
pinMode (LCD_D6, OUTPUT);
pinMode (LCD_D7, OUTPUT);
pinMode (RELAY1, OUTPUT);
pinMode (RELAY2, OUTPUT);
LCD.BEGIN (16, 2);
Serial.BEGIN(9600);
IF(EEPROM.Read(0) > = MAX_TEMP + 1) {
EEPROM.write(0,TEMP_SET);
temp_set = TEMP_SET;
}
annat {temp_set=EEPROM.read(0);}
LCD.Print ("Setpoint:");
LCD.Print(temp_set); Visning av setpoint temperatur för 2 sek
Delay(2000);
checkTemp(0);
t.every(60000*Cycle,checkTemp,(void*)0);
button1.attachClick(tempPlus);
button1.attachPress(tempMinus);
}
void loop() {
sätta din huvudsakliga kod här, för att köra flera gånger:
button1.Tick();
t.Update();
}
void tempPlus() {
Serial.println("plus");
temp_set ++;
om (temp_set > MAX_TEMP) temp_set = TEMP_SET; Cykla mellan TEMP_SET och MAX_TEMP
LCD.Clear();
LCD.Print ("Setpoint:");
LCD.Print(temp_set);
EEPROM.write(0,temp_set);
Delay(1000);
checkTemp(0);
}
void tempMinus() {
Serial.println("minus");
temp_set--;
om (temp_set < TEMP_SET) temp_set = MAX_TEMP; Cykla mellan TEMP_SET och MAX_TEMP
LCD.Clear();
LCD.Print ("Setpoint:");
LCD.Print(temp_set);
EEPROM.write(0,temp_set);
Delay(2000);
checkTemp(0);
}
void checkTemp (void * sammanhang)
{
int chk = DHT11.read(DHT11PIN);
Serial.Print ("Läs sensor:");
/ * switch (chk)
{
fall DHTLIB_OK:
Serial.println("OK");
bryta;
fall DHTLIB_ERROR_CHECKSUM:
Serial.println ("Checksum error");
bryta;
fall DHTLIB_ERROR_TIMEOUT:
Serial.println ("Time out fel");
bryta;
standard:
LCD.println ("okänt fel");
bryta;
}*/
lcd.setCursor (0, 0);
Serial.println(DHT11.humidity);
LCD.Print ("luftfuktighet:");
LCD.Print ((float) DHT11.humidity, 2);
lcd.setCursor (0, 1);
LCD.Print ("Temp:");
LCD.Print ((float) DHT11.temperature, 2);
Serial.println(DHT11.temperature);
IF(DHT11.humidity < HUM_SET2) {
digitalWrite (RELAY1, hög);
Serial.println("H1");
}
om (DHT11.humidity > HUM_SET) {
digitalWrite(RELAY1,LOW);
Serial.println("H0");
}
IF(DHT11.temperature < temp_set) {
digitalWrite (RELAY2, hög);
Serial.println("T1");
}
om (DHT11.temperature > temp_set) {
digitalWrite(RELAY2,LOW);
Serial.println("t0");
}
}