Arduino är väl det samma som en liten PLS, bara mycket mer flexibel. Eller har jag fel?
Det finnas nog dom som vill ha PLS för allt vad det är värd, men jag håller på lite med Arduino för att implementera i min stuga. Jag har skrivit lite om detta i min egen blogg här på byggahus i fritidshus tråden. (taklyft +++)
Jag kommer slänga in en god del mer saker än dom jag har i dag, och det är ju bara att utöka med fler små fina billiga kort om det skall bli för lite.
Jag har i dagsläget ett Arduino Mega kort som kommer kontrollera det mesta i min stuga,
Temperatur sensorer i varje rum (one wire koppling av dallas 18B20 kretser) inkluderat ute sensor och ingångsluft på FTX'n som jag bygger.
Dom här styr igen (eller kommer göra) ventiler som stänger ned golvvärme slingor när det är varmt nog i rummet, snösmältning på mina solpanel, (om det är kallt och nederbörd) utebelysning (via SSD relä), Belysning i hela huset (med rörelse sensorer), och slutligen inkoppling av inverter om strömmen från nätet faller (inte implementerat än i programmet än)
Jag har aldrig programmerat i C+ innan och jag satt mig ned och försökte och har kopierat och limmat mycket (från www.arduino.cc) för att få allt så långt att gå ihop, men det har inte tagit så många kvällar innan programmet blev klart så långt.
Sakerna har jag köpt från ebay (eller via tradera när jag har haft tidsbrist.) och har inte kostat så himla mycket. Tror jag har kommit upp i runt 450 kronor, med alla relä och allt.
Skall himla många PLS'r till för att komma upp i den mängden med ut/in gångar jag har på ett litet arduino kort, och då med följd att det blir mycket kostbart.


Det är nog säkert mycket med programmet som är löjligt, men jag kopierar in det här så ni får se (och gärna komma med förslag till förbättringar.



//Temperaturstyrning av golvvärmeslingor.
//Alla rum övervakas av Dallas18B20, inkl ute temp.
//Alla tempsensorer går på onewire systemet på Pin digital 7
//Utgångs räle står ut på 22,24,26,28,30,32,34,36,38
//Sensorer måste kopplas in och ges namn sedan,
//sedan denna kofiguration inte ger någon speciell tur
//ordning sensorerna kommer i.
//går kanske efter första Hex nummer följd.

//Programmet har också fått inbyggt en ljus sensor (A0) för
//styrning av 230v uteljus när det blir mörkt (relepin 52)
//styrning av 12/24v uteljus när det blir mörkt (relepin 53)
//Regn sensor ingång A1
//Funkar nu med regnsensor på utgång 49 - 151023
//Funkar med alla relä 151102
//Rörelse sensor på Pin 11 + från pin 53

//Program skrivet av Cato Limås

//Dallas bibliotek
#include <OneWire.h>

#include <DallasTemperature.h>


OneWire oneWire(7); // Koppla dallas sensorer till pin 7

DallasTemperature sensors(&oneWire);
//Utgångar och till vad
int rele22Pin = 22;//onewire FTX in temp
int rele24Pin = 24;//onewire Entrance
int rele26Pin = 26;//onewire Dining Room
int rele28Pin = 28;//onewire
int rele30Pin = 30;//onewire
int rele32Pin = 32;//onewire
int rele34Pin = 34;//onewire
int rele36Pin = 36;//onewire
int rele38Pin = 38;//onewire
int photocellPin = 0;//ljus sensor A0
int photocellReading;//ljus sensor
int rele52Pin = 52;//ljus sensor SSD räle 230v
int movesens53Pin = 53;//ljus sensor 5v arduino räle
int rele45Pin = 45;//plus till rörelse sensor uteljus
int movesens11Pin = 11;// ingång från rörelse sensor


//Variabler till Regnsensor
const int sensor1Pin = A1;// ingång för regn sensor A1
const int rele49Pin = 49;// Utgång for regnsensor 49
int sensor1Value = 0;//vatn på sensorn
int sensor1Min = 850;//torr över detta värdet
int sensor1Max = 0;

void setup() {
// Setup som skall köras en gång
sensors.begin();
Serial.begin(9600);
//Rälenamn utgtångar, och vad dom är till
pinMode(rele22Pin, OUTPUT);//onewire FTX in temp
pinMode(rele24Pin, OUTPUT);//onewire Entrance
pinMode(rele26Pin, OUTPUT);//onewire Dining room
pinMode(rele28Pin, OUTPUT);//onewire
pinMode(rele30Pin, OUTPUT);//onewire
pinMode(rele32Pin, OUTPUT);//onewire
pinMode(rele34Pin, OUTPUT);//onewire
pinMode(rele36Pin, OUTPUT);//onewire
pinMode(rele38Pin, OUTPUT);//onewire
pinMode(rele52Pin, OUTPUT);//ljus sensor ssd
pinMode(movesens53Pin, OUTPUT);//ljus sensor 5v slår på rörelse sensor
pinMode(rele49Pin, OUTPUT);//regnsensor
pinMode(rele45Pin, OUTPUT);//rörelse sensor på uteljus
pinMode(movesens11Pin, INPUT);//ingång rörelsesensor

//setup av regnsensor
//måste in på 5v, annars så blir det fel bit upplösning och
//min och max "value" måste göras om.

digitalWrite(rele49Pin, HIGH);//regnsensor

while (millis() < 5000) {
sensor1Value = analogRead(sensor1Pin);

if (sensor1Value > sensor1Max) {
sensor1Max = sensor1Value;
}
if (sensor1Value < sensor1Min) {
sensor1Min = sensor1Value;
}
}
// Slutt på setup av regnsensor

}

void loop() {
// Skriv in dom som skall repeteras här
sensors.requestTemperatures();
float currentTemp0;
currentTemp0 = sensors.getTempCByIndex(0);
//temp under 22 ger räle hög utgång
if (currentTemp0 >22)digitalWrite(rele22Pin, HIGH);
//temp över 22 ger räle låg utgång
if (currentTemp0 <=21)digitalWrite(rele22Pin, LOW);

float currentTemp1;
currentTemp1 = sensors.getTempCByIndex(1);
if (currentTemp1 >22)digitalWrite(rele24Pin, HIGH);
if (currentTemp1 <=21)digitalWrite(rele24Pin, LOW);

float currentTemp2;
currentTemp2 = sensors.getTempCByIndex(2);
if (currentTemp2 >22)digitalWrite(rele26Pin, HIGH);
if (currentTemp2 <=21)digitalWrite(rele26Pin, LOW);

float currentTemp3;
currentTemp3 = sensors.getTempCByIndex(3);
if (currentTemp3 >22)digitalWrite(rele28Pin, HIGH);
if (currentTemp3 <=21)digitalWrite(rele28Pin, LOW);

float currentTemp4;
currentTemp4 = sensors.getTempCByIndex(4);
if (currentTemp4 >22)digitalWrite(rele30Pin, HIGH);
if (currentTemp4 <=21)digitalWrite(rele30Pin, LOW);

float currentTemp5;
currentTemp5 = sensors.getTempCByIndex(5);
if (currentTemp5 >22)digitalWrite(rele32Pin, HIGH);
if (currentTemp5 <=21)digitalWrite(rele32Pin, LOW);

float currentTemp6;
currentTemp6 = sensors.getTempCByIndex(6);
if (currentTemp6 >22)digitalWrite(rele34Pin, HIGH);
if (currentTemp6 <=21)digitalWrite(rele34Pin, LOW);

float currentTemp7;
//normalt till Badet, måste köras på SSDräle
currentTemp7 = sensors.getTempCByIndex(7);
if (currentTemp7 >24)digitalWrite(rele36Pin, HIGH);
if (currentTemp7 <=23)digitalWrite(rele36Pin, LOW);

float currentTemp8;
currentTemp8 = sensors.getTempCByIndex(8);
if (currentTemp8 >22)digitalWrite(rele38Pin, HIGH);
if (currentTemp8 <=21)digitalWrite(rele38Pin, LOW);

//Skriver temperaturer ut til seriell monitor

Serial.print(" FTX in Temp = ");
Serial.print(currentTemp0);

Serial.print(" Entrance = ");
Serial.print(currentTemp1);

Serial.print(" Dining room = ");
Serial.print(currentTemp2);

Serial.print(" sov = ");
Serial.print(currentTemp3);

Serial.print(" spis = ");
Serial.print(currentTemp4);

Serial.print(" entre = ");
Serial.print(currentTemp5);

Serial.print(" kok2 = ");
Serial.print(currentTemp6);

Serial.print(" bad = ");// måste vara till SSD räle för element
Serial.print(currentTemp7);

Serial.print("vent = ");
Serial.print(currentTemp8);

//Ljus sensor setup för uteljus
photocellReading = analogRead(photocellPin);
Serial.print("Analog reading = ");
Serial.println(photocellReading);

if (photocellReading < 249) {
Serial.println(" - Bright - Relay off");
} else if (photocellReading > 250) {
Serial.println(" - Dark - Relay on");
}

{
//Mycket ljus slår av räle
if (photocellReading > 249)digitalWrite(rele52Pin, HIGH);//SSD
if (photocellReading < 250)digitalWrite(rele52Pin, LOW);//SSD
if (photocellReading < 250)digitalWrite(movesens53Pin, HIGH);//5v
if (photocellReading > 249)digitalWrite(movesens53Pin, LOW);//5v

}//Slut på ljus sensor loop
{
//rörelse sensor loop start
if (movesens11Pin = HIGH)digitalWrite(rele45Pin, HIGH);
if (movesens11Pin = LOW)digitalWrite(rele45Pin, LOW);
}
}


//Loop av regnsensor
int sensor1Value = analogRead(A1);
Serial.print(" - fuktvarde = ");
Serial.print(sensor1Value)
{
delay(1000);
sensor1Value = analogRead(sensor1Pin);
}
sensor1Value = map(sensor1Value, sensor1Min, sensor1Max, 0, 1024);
//Hur mycket fukt som skall till för att räleutgången skall
//lägga in, ställs in i setup i början. 850 värkar rätt nu.

analogWrite(rele49Pin, sensor1Value);


//Loop av regnsensor slut

delay(1000);
}


Såg nu att jag har några andra moment som jag behöver implementera också. Start och stopp av cirkulations pumpen om alla rum är värma nog. :)
Men kom med meningar eller förslag på bättringar i program eller bruk..
 
Så länge det funkar som du har tänkt dig så kan du känna dig nöjd.
Jag är ingen programmerare men här är några förslag att ha i åtanke och kanske implementera/förbättra i framtiden:

1. Det blir en väldigt långsam Main loop.
Gör funktioner som anropas med lagom tidsintervall.
2. En medelvärdesbildning så sensoravläsningarna.
3. En debounce funktion på skymningsrelä hade nog varit trevligt.
Dvs. skymmer någon sensorn en sekund eller två så tänds inte ljuset.
4. Har du tänkt att aktivera reservkraften med din Arduino?
Använd i så fall en interrupt-pinne och och skippa alla delay-funktioner, då har du en chans att få reservkraften inkopplad utan så mycket som ett flimmer.
5. Ska du styra värmen så glöm inte att tillämpa hysteres för till- och frånslag av värmen.
För optimal komfort så hade jag implementerat en P-reglering av värmesystemet.

Hur/vad har du tänkt dig att försörja reservkraften ifrån?
Själv har jag införskaffat två saker, En gammal UPS som jag kopplat externa bilbatterier till och en gammal bensindriven generator. När strömmen går kopplas utvald elektronik över till UPSen och under tiden startar generatorn för att sen ta över strömförsörjningen.

Lycka till med vidareutvecklingen! :)
 
Redigerat:
  • Gilla
tommib
  • Laddar…
tommib
Många kloka synpunkter från coccon, speciellt de som gäller hysteres/medelvärdesbildning mm. Du bör nog studera reglerteknik lite innan du kopplar något för att styra värme/el.
 
Där ser man. Många goda tips. :) tackar.
Jag glömde väl att säga att som laddning til mina batterier så har jag båda solpanel och vindgenerator. Som en extra backup till att ha på vintern så har jag batteri laddare.
 
Vi vill skicka notiser för ämnen du bevakar och händelser som berör dig.