Automatiseren terrarium

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 3
Geregistreerd: 24 Jan 2021, 10:01

Automatiseren terrarium

Berichtdoor BertusBeunhaas » 24 Jan 2021, 15:49

Goede middag allen,

Mijn naam is Bertus en ben nieuw op het forum, maar ook in de wereld van Arduino!
Ik ben een hobby kweker van hagedissen en sinds kort heb ik bedacht om deze hobby naar een hoger niveau te tillen.
Door middel van Arduino wil ik mijn terrariums verder gaan automatiseren en alles aansluiten op 1 systeem.
Het is reeds geautomatiseerd, maar dit zijn allemaal losstaande systeems, die niet met elkaar samenwerken.
Daarnaast ben ik van plan om dit vanaf afstand te kunnen monitoren.

Ik heb inmiddels al van alles en nog wat aangeschaft om een beetje te gaan spelen, maar kwam al gauw tot de ontdekking dat het allemaal zo makkelijk niet is!
Wel ik ben gemotiveerd genoeg om dit te gaan leren en uiteindelijk voor elkaar te krijgen!
Maar daarbij is het wel eens fijn om een zetje in de juiste richting te krijgen :) !
Vandaar dat ik me hier heb aangemeld.

Wat ik wil, is niet anders als wat ik al heb, maar dan dus met een Arduino om te schakelen en een Raspberry om te monitoren.
Het gaat om het volgende:

Controleren van de temperatuur en deze temperatuurmeting gebruiken om een ventilator of verwarming te schakelen, dus wanneer de temp. te hoog wordt, ventilator sneller laten draaien en anders op een rustig pitje en wanneer het te koud wordt de verwarming aan te schakelen.
Verder wordt er een luchtvochtigheid gemeten dus nagenoeg dezelfde handeling moet verrichten, namelijk bij een te lage RV bevochtigen en bij een te hoge, ontvochtigen of fan harder laten draaien.
Ook voor het waterbasin (gebruik ik ook voor "regen" effect) heb ik een temperatuurmeting die een verwarmingselement schakelt en voor "regen" wordt er op vast geprogrammeerde tijden een pomp geschakeld.
Vanzelfsprekend wordt dit ook met het licht gedaan, dus op vaste tijden gaan deze aan en uit!
Via een lichtsensor wordt bevestigd dat het licht werkelijk aanstaat en in welke stand (dimbare leddriver).
Het relais kan wel schakelen, maar de leddriver kan wel stuk zijn...

Als extra heb ik ook een CO2 meter en PH meter gekocht, die de kwaliteit van de lucht en het water moeten monitoren, maar verder (nog) geen schakeling hoeven te activeren.
Ook wil ik graag een camera laten meekijken via de Raspberry Pi en het geheel in een dashboard via een webserver op de Raspberry weergeven.

Ik heb 2 terrariums staan, 1 voor klein gebroed en eitjes en 1 voor grotere hagedissen.
Dus beide moeten worden verbonden met hetzelfde systeem.

Ik heb hiervoor het volgende gekocht:
1x Arduino Uno R3 (die wordt gekoppeld aan de Raspberry dmv een usb-kabel)
1x Arduino baseshield
1x Raspberry Pi 3b+
1x Strompi 3 UPS shield
1x 3000mAh battery
1x 7"LCD display (voor de Raspberry)
16 kanaals relais bord
2x Grove temperature&humidity sensor high accuracy&mini
1x Grove temperatuur sensor
2x Onewire temperature sensor
2x Lightsensor v1.2
2x Grove serial camerakit

Inmiddels ben ik al zo "ver" dat ik alle sensoren in 1 sketch heb kunnen zetten en deze periodiek kan laten uitlezen.
Mijn volgende stap is dit, dmv een webserver, in een mooi jasje te steken.
Hierover is genoeg te lezen en te vinden dus dat zal me vast wel lukken.

Ook ben ik al eventjes met het relaisbordje aan het spelen geweest en heb deze wel al wat dingetjes kunnen laten doen.
Maar hier loop ik nu even vast...
Ik heb niet zoveel zin om met ledjes en kits te gaan spelen, aangezien ik het maar eenmalig gaan doen en dat dus zonde van mijn geld vind.
Mijn mening is echter, dat wat met een ledje of kit kan, ook direct met de gekochte onderdelen gedaan kan worden...?!
Waar ik naar op zoek ben (nee niet iemand die de sketch voor mij schrijft ;) ) is een manier om op tijd en om via de sensoren te gaan sturen.
Er is veel te vinden, maar net niet altijd helemaal zoals het zou moeten, er wordt net een ander type sensor gebruikt of gebruik gemaakt van een RTC module.

Voor dat stukje op tijd schakelen, zou ik graag de real time clock van de Raspberry gebruiken, aangezien deze aal in de UPS zit ingebouwd.
Vraag me alleen af of dit wel mogelijk is, of dat ik een RTC voor de Arduino zal moeten aanschaffen?
Voor dat stukje om op sensor te schakelen, vraag ik me af, hoe ik de juiste sensoren moet invoegen in de sketch.

Overigens schakelen op temperatuur is me wel al gelukt, maar niet via de genoemde sensor.
Deze wordt via pin 0 gemeten, terwijl mijn sensor op poort I2C zit aangesloten.
Exact hoe dit werkt, weet ik niet, maar vermoedelijk, meet die een potentiaal verschil tussen 2 contacten?
Hiervoor heb ik de volgende sketch gebruikt (van internet gehaald):

int temperaturePin = 0;
int FanHard = 13;

void setup()
{
Serial.begin(9600);
pinMode (FanHard, OUTPUT);
pinMode (temperaturePin, INPUT);
}

void loop()
{
float temperature = getVoltage(temperaturePin);
temperature = (temperature - .5) * 10;

Serial.println(temperature);

static unsigned char state;
if (temperature > 22)
state = LOW; //AAN
else if (temperature <= 20)
state = HIGH; //UIT

digitalWrite (FanHard, state);

}

float getVoltage(int pin){
analogRead(pin);
delay(1000);
return (analogRead(pin) * .0048828125);
}

Ik zou hier dus mijn eigen sensor in willen plakken en heb al het e.e.a. geprobeerd (aan de hand van de sketch welke ik gebruik voor het monitoren met deze sensoren) maar dit geef geen goed resultaat!

Ik heb overigens enige achtergrond in zowel ICT als elektronica, maar dit is beperkt!
Ben dus geen computerprogrammeur of elektronica specialist.
Dat is het mooie van Arduino en Raspberry zeiden ze, dat is toegankelijk en relatief eenvoudig... :?

Mochten jullie tips voor mij hebben, hoor ik dat graag!
Mijn dank is alvast groot, voor de genomen moeite!!!!! 8-)

Owja, ik heb een proefopzetje gemaakt, met een klein tentje en was losse componenten, zoals een kacheltje, afzuiger en pompje om te testen.
Dit doe ik liever (nog) niet op mijn terrariums! :P

Groeten Bertus

Advertisement

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Automatiseren terrarium

Berichtdoor shooter » 25 Jan 2021, 15:32

zorg eerst voor een juiste voeding layout, ofwel voed elk ding apart want de arduino kan niet voldoende stroom leveren voor het relaisbord.
kijk ook even naar #define AAN LOW en #define UIT HIGH
bedenk ook of het allemaal op een UNO kan zoals onewire en I2C en USB, en de Serial.
En rustig aan, want je wilt wel erg veel tegelijk.
paul deelen
shooter@home.nl

Berichten: 3
Geregistreerd: 24 Jan 2021, 10:01

Re: Automatiseren terrarium

Berichtdoor BertusBeunhaas » 26 Jan 2021, 12:23

Hallo Shooter,

Dank voor je reactie!

Je hebt gelijk, ik wil erg veel!
Maar, ik heb de tijd en ga alles op mijn gemakkie uitvogelen.

Ik heb een labvoeding, waarmee ik het relaisbordje apart kan voeden, dus daar had ik al aan gedacht.
Maar of ik alles wat ik wil met de Uno kan bereiken, weet ik niet.
Ik ga sowieso eerst eens proberen om 1 terrarium up en running te krijgen en daarna eens kijken of er nog verdere mogelijkheden zijn met de Uno.
Wellicht moet ik als nog over op een Mega...

Zoals aangegeven ben ik geen expert op het gebied van elektronica en programmeren, maar het is ook zeker geen onbekend terrein!
Inmiddels heb ik al aardig wat sensoren aan de praat weten te krijgen en met hun functie het relais kunnen laten schakelen.
Voor alles begin ik met een enkel script, waarna ik deze samenvoeg als het eenmaal werkt en zo bouw ik het "master"script verder op!

#include <math.h> //Temperatuur & luchtvochtigheid
#include <TH02_dev.h>
#include "Arduino.h"

#include <OneWire.h> //watertemperatuur
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

#define LIGHT_SENSOR A0 //Lichtsensor
float Rsensor;

int Ventilator = 13;
int Kachel = 12;
int Bevochtigen = 11;
int Ontvochtigen = 10;
int Verwarmingselement = 9;

void setup()
{
Serial.begin(9600);

TH02.begin();
delay(100);

sensors.begin();

pinMode (Ventilator, OUTPUT);
pinMode (Kachel, OUTPUT);
pinMode (Bevochtigen, OUTPUT);
pinMode (Ontvochtigen, OUTPUT);
pinMode (Verwarmingselement, OUTPUT);
}

void loop()
{
int sensorValue = analogRead(LIGHT_SENSOR); //Lichtsensor
Rsensor = (float)(1023 - sensorValue) * 10 / sensorValue;
/* Serial.println("Lichtsterkte:");
Serial.print(sensorValue);
Serial.println("Lx");*/

if (sensorValue > 350)
Serial.println("Licht aan\r\n");
else if (sensorValue < 350)
Serial.println("Licht uit\r\n");

sensors.requestTemperatures(); //Watertemperatuur schakeling
Serial.println("Watertemperatuur:");
Serial.print(sensors.getTempCByIndex(0));
Serial.println("°C");

Serial.print("Verwamingselement: "); //Weergave verwarmingselement aan/uit
if (sensors.getTempCByIndex(0) < 22)
Serial.println("aan\r\n");
else if (sensors.getTempCByIndex(0) > 22)
Serial.println("uit\r\n");

static unsigned char state;
if (sensors.getTempCByIndex(0) < 22)
state = LOW; //AAN
else if (sensors.getTempCByIndex(0) > 22)
state = HIGH; //UIT

digitalWrite (Verwarmingselement, state);


float Temperatuur = TH02.ReadTemperature(); //Temperatuur schakeling
Serial.println("Temperatuur: ");
Serial.print(Temperatuur);
Serial.println("°C");

Serial.print("Ventilator: "); //Weergave ventilator aan/uit
if (Temperatuur > 27)
Serial.println("aan");
else if (Temperatuur <= 27)
Serial.println("uit");

Serial.print("Kachel: "); //Weergave kachel aan/uit
if (Temperatuur < 23)
Serial.println("aan\r\n");
else if (Temperatuur >= 23)
Serial.println("uit\r\n");

if (Temperatuur > 27) //Ventilator schakeling
state = LOW; //AAN
else if (Temperatuur <= 27)
state = HIGH; //UIT

digitalWrite (Ventilator, state);

if (Temperatuur < 23) //Kachel schakeling
state = LOW; //AAN
else if (Temperatuur >= 23)
state = HIGH; //UIT

digitalWrite (Kachel, state);

float Luchtvochtigheid = TH02.ReadHumidity(); //Luchtvochtigheid schakeling
Serial.println("Luchtvochtigheid: ");
Serial.print(Luchtvochtigheid);
Serial.println("%\r\n");

if (Luchtvochtigheid > 60)
state = LOW; //AAN
else if (Luchtvochtigheid <= 60)
state = HIGH; //UIT

digitalWrite (Ontvochtigen, state);

if (Luchtvochtigheid < 55)
state = LOW; //AAN
else if (Luchtvochtigheid >= 55)
state = HIGH; //UIT

digitalWrite (Bevochtigen, state);

delay(1000);

}

Zoals gezegd, stap voor stap!

Wat betreft de definitie van de term LOW en HIGH, lijkt het mij niet echt uit te maken welke ik voor aan en uit gebruik, als ik maar de juiste poort (NC of NO) gebruik.
Ik weet niet of het in programmeertaal wel uitmaakt, maar de werking zoals deze nu is omschreven, werkt en dat moet toch voldoende zijn?

Ik ben in ieder geval van de straat en lekker aan het keutelen en het lijkt er voor nu op dat het me aardig lukt! 8-)
Gister heb ik geprobeerd om de tijd van mijn PC nog te syncen, maar dit wat toch een lastig klusje, daar doet mijn (nu nog beperkte) ervaring te kort.
Toch maar even kijken voor een RTC, ik heb al leuke sketches gezien, waarmee ik de tijdschakelingen wel kan toepassen (met wat aanpassingen hier en daar).
Maar daar kom ik wel uit!

Om je een idee te geven, heb ik een paar foto's toegevoegd van mijn werkplek/plaats.
Lekker bezig dus!

Groeten
Bijlagen
IMG_4969-2.png
IMG_4969-2.png (219.46 KiB) 2909 keer bekeken
IMG_4968-2.png
IMG_4968-2.png (237.66 KiB) 2909 keer bekeken

Berichten: 3
Geregistreerd: 24 Jan 2021, 10:01

Re: Automatiseren terrarium

Berichtdoor BertusBeunhaas » 27 Jan 2021, 10:01

Hallo Shooter,

Je hebt gelijk, het is veel!
Maar zeker niet onmogelijk, ben ik inmiddels achter...
Zoals aangegeven heb ik wel enige kennis van elektronica en programmeren, dus lukken zal het zeker!
Het zal alleen wat tijd kosten en stap voor stap moeten.
Ik maak een sketch van een component en als het werkt, voeg ik het samen in een master sketch.
Zo bouw ik deze op tot het uiteindelijke doel.
Ik heb de tijd, dus rustig aan.

Betreft de voeding, heb ik een labvoeding staan om de relais afzonderlijk mee te voeden.
Ik heb al veel gelezen en geprobeerd en heb inmiddels al een goed werkende sketch, waarmee ik 5 relais kan laten functioneren met de sensoren die ik heb.

#include <math.h> //Temperatuur & luchtvochtigheid
#include <TH02_dev.h>
#include "Arduino.h"

#include <OneWire.h> //watertemperatuur
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

#define LIGHT_SENSOR A0 //Lichtsensor
float Rsensor;

int Ventilator = 13;
int Kachel = 12;
int Bevochtigen = 11;
int Ontvochtigen = 10;
int Verwarmingselement = 9;

void setup()
{
Serial.begin(9600);

TH02.begin();
delay(100);

sensors.begin();

pinMode (Ventilator, OUTPUT);
pinMode (Kachel, OUTPUT);
pinMode (Bevochtigen, OUTPUT);
pinMode (Ontvochtigen, OUTPUT);
pinMode (Verwarmingselement, OUTPUT);
}

void loop()
{
int sensorValue = analogRead(LIGHT_SENSOR); //Lichtsensor
Rsensor = (float)(1023 - sensorValue) * 10 / sensorValue;
/* Serial.println("Lichtsterkte:");
Serial.print(sensorValue);
Serial.println("Lx");*/

if (sensorValue > 350)
Serial.println("Licht aan\r\n");
else if (sensorValue < 350)
Serial.println("Licht uit\r\n");

sensors.requestTemperatures(); //Watertemperatuur schakeling
Serial.println("Watertemperatuur:");
Serial.print(sensors.getTempCByIndex(0));
Serial.println("°C");

Serial.print("Verwamingselement: "); //Weergave verwarmingselement aan/uit
if (sensors.getTempCByIndex(0) < 22)
Serial.println("aan\r\n");
else if (sensors.getTempCByIndex(0) > 22)
Serial.println("uit\r\n");

static unsigned char state;
if (sensors.getTempCByIndex(0) < 22)
state = LOW; //AAN
else if (sensors.getTempCByIndex(0) > 22)
state = HIGH; //UIT

digitalWrite (Verwarmingselement, state);


float Temperatuur = TH02.ReadTemperature(); //Temperatuur schakeling
Serial.println("Temperatuur: ");
Serial.print(Temperatuur);
Serial.println("°C");

Serial.print("Ventilator: "); //Weergave ventilator aan/uit
if (Temperatuur > 27)
Serial.println("aan");
else if (Temperatuur <= 27)
Serial.println("uit");

Serial.print("Kachel: "); //Weergave kachel aan/uit
if (Temperatuur < 23)
Serial.println("aan\r\n");
else if (Temperatuur >= 23)
Serial.println("uit\r\n");

if (Temperatuur > 27) //Ventilator schakeling
state = LOW; //AAN
else if (Temperatuur <= 27)
state = HIGH; //UIT

digitalWrite (Ventilator, state);

if (Temperatuur < 23) //Kachel schakeling
state = LOW; //AAN
else if (Temperatuur >= 23)
state = HIGH; //UIT

digitalWrite (Kachel, state);

float Luchtvochtigheid = TH02.ReadHumidity(); //Luchtvochtigheid schakeling
Serial.println("Luchtvochtigheid: ");
Serial.print(Luchtvochtigheid);
Serial.println("%\r\n");

if (Luchtvochtigheid > 60)
state = LOW; //AAN
else if (Luchtvochtigheid <= 60)
state = HIGH; //UIT

digitalWrite (Ontvochtigen, state);

if (Luchtvochtigheid < 55)
state = LOW; //AAN
else if (Luchtvochtigheid >= 55)
state = HIGH; //UIT

digitalWrite (Bevochtigen, state);

delay(1000);

}

Volgende stap is het invoegen van tijdschakelingen.
Hiervoor heb ik maar een RTC aangeschaft.
Ik heb geprobeerd dit dmv syncen met de pc, maar kreeg ik helaas niet voor elkaar.
Dan is mijn kennis qua programmeren (nog) te beperkt!

Of alles op de Uno mogelijk is, weet ik ook niet.
Ik heb de Uno gekocht om wat mee te proberen.
Sowieso ben ik van plan, om eerst eens 1 terrarium te automatiseren.
Ik ben van mening dat dit absoluut mogelijk is.
Wellicht moet ik later inderdaad aan een Mega geloven...

Wat betreft de definitie van LOW en HIGH, lijkt mij dit relatief.
Hangt in mijn ogen volledig af welke contacten van het relais je hiervoor gebruikt (NO of NC)
Ik weet niet of hier in het programmeren een vaste manier voor is, maar voor de werking maakt het in ieder geval geen verschil.

Bijgevoegd een paar foto's van mijn hobby hok!

Groeten,

IMG_4968.jpg
IMG_4968.jpg (121.73 KiB) 2808 keer bekeken
IMG_4969.jpg
IMG_4969.jpg (148.99 KiB) 2808 keer bekeken

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Google [Bot] en 13 gasten