PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Pflanzenbesprühung /betropfung mit mega8 (avr-studio gcc)



lowtzow
03.02.2009, 16:12
Hallo

habe im winter immer ein problem mit meinen pflanzen, sie gehn ein. wahrscheindlich wollen sie nicht die heizungsluft! ist auch eine tatsache, welche bestätigt wurde.

Abhilfe?

besprühung, ja!!!!!

methode 1:
man befülle so eine sprühfalsche und besprühe, vergisst man sicher 5mal in der woche

methode2:
man hole sich ne quariumpumpe ein paar gardena nebeldüsen, schläuche adapter & einen mega8 programmiere disen. fertig!

http://666kb.com/i/b63wtoo8dxav6l6yh.jpg

so das gnaze noch mal langsam zum mitschreiben.
1. eine mega8 grundschaltung am besten mit lcd und programmiere eine Uhr

http://666kb.com/i/b63wq1k8absnj673t.jpg

2. man programmiert zeiten ein in denen ein Ausgang geschalten wird.

if (sek<=4&&min==1&&hour==7 ) { //um 7h1min für 4sek
PORTB|=(1<<PB0);
}

3. man verbinde den gewählten Ausgang mit einem Relais und schalte die aquariumpumpe

http://666kb.com/i/b63wt7rofa8ogihdl.jpg

hier eine von insgesamt 3 Nebeldüsen

http://666kb.com/i/b63ww7jfj8nvr4nsp.jpg

hier die betropfung kann man einstellen zwischen 0-20l/h

http://666kb.com/i/b63wwf4btwun4him1.jpg


und kann dann entweder benebeln oder betropfen.
derzeit funktioniert nur eines von beiden, denn ich habe nur einen Kreis.
ich bin jetzt am überlegen ob ich eine zweite pumpe hole oder eine magnetventildose um die pumpe wahlweise im benebelkreis oder im betropfungskreis arbeiten zu lassen.

aja, benebeln sollte man nicht zu lange sonst wirds nass, wenn man zB alle 3stunden mal 4sek benebelt ist vollkommen ok

mit dem betropfen muss ich noch erfahrungswerte sammeln, da die pflanzen gerade im winter weniger wasser brauchen.


welche updates kommen noch.
eine bessere uhr, derzeit geht meine uhr pro tag um 10sek faslch (entweder ich otimiere die uhr, oder ich steig auf funkuhr um)

eine zweite pumpe oder eine magnetventildose, hier brauche ich euren rat!

und eine schönes gehäuse mit eingabemöglichkeiten

ja derzeit fallt ma nix ein, ich werde jedoch updaten bei news.

eventuell lesen da profis mit die sich mit diesen quariumpumpen auskennen, ich hab bedenken wenn ich die pumpe gegen einen zu großen widerstand pumpen lasse, kann die kaputt gehen?
nur zur veranschalichung, die pumpe macht 3000l/h
eine betrofungsdüse macht ca 2l/h x6 =12l/h

die nebeldüsen machen mehr l/h gefühlsmäßig, werte stehen leider keine drauf, jedoch wird benebelt max 4sek und betropft wahrscheindlich so 1-2min

mfg & danke fürs mitlesen ;-)
low

ps.
aja programmiert habe ich in avrstudio mit gcc
bin von bascom umgestiegen und kann es nur empfehlen, ist zwar schwieriger aber auch interessanter!

hier der code der main, leider noch nicht ganz kommentiert bzw noch falsch bin halt noch faul von bascom!
#include <avr/io.h>
#include "lcd-routines.h"

#include <util/delay.h>
#include <stdlib.h>

#include <avr/signal.h>

uint8_t sek=0;
uint8_t min=0;
uint8_t hour=7;
uint8_t day=0;
uint8_t var;




void int2lcd(int,int,int,int);
inline uint8_t debounce(volatile uint8_t *port, uint8_t pin);


int main(void)
{


DDRB = (1<<DDB0); //PinB0 als Ausgang
DDRB &= ~(1<<DDB1); //PinB2 als Eingang
PORTB = (0<<PB0)| (1<<PB1); // PibB1 auf 0 & PINB2 PullUp auf vcc



// LCD initialisierung anfang****************************************
lcd_init();
set_cursor(0,1);
lcd_string("Bewaesserung ");
set_cursor(0,2);
lcd_string("initalisierung***");
lcd_clear();
// LCD initialisierung ende****************************************



//Timer1 config anfang******************************************** ***
TCCR1B = (1<<CS12)|(1<<CS10);//cpu teiler= takt /1024

TCNT1H = 0xE1; //-> 8MHZ/1024=7812,5 => 1/11718 =128µsek
TCNT1L = 0x7A; //->1/128µsek=7812,5 => 2^16(65535)-7812,5=57722 = 0xE7A1

TIMSK = (1<<TOIE1); // bei Überlauf wird ein Interrupt ausgelöst

sei (); //Globale Interrupts freigeben
//Timer1 config ende********************************************** *****


while(1)
{
//lcd_init();
//lcd_clear();
//
int2lcd(day,hour,min,sek);

// Aufrufen des Unterprogrammes mit dem der int wert in ein acii umgewandelt wird und am lcd angezeigt wird


//Tastenabfrage anfang******************************************** ***
if (PINB & (1<<PINB1)) {
PORTB&= ~(1<<PB0);
}
else{
PORTB|=(1<<PB0);
}
//Tastenabfrage ende********************************************** *


//Zeitabfrage anfang******************************************** ***
if (sek<=4&&min==1&&hour==7 ) { //um 7h1min für 4sek
PORTB|=(1<<PB0);
}

if (sek<=4&&min==10&&hour==8 ) { //wenn sek =60
PORTB|=(1<<PB0);
}

if (sek<=4&&min==0&&hour==9 ) { //wenn sek =60
PORTB|=(1<<PB0);
}

if (sek<=4&&min==0&&hour==12 ) { //wenn sek =60
PORTB|=(1<<PB0);
}

if (sek<=4&&min==0&&hour==13 ) { //wenn sek =60
PORTB|=(1<<PB0);
}

if (sek<=4&&min==0&&hour==18 ) { //wenn sek =60
PORTB|=(1<<PB0);
}

//Zeitabfrage anfang******************************************** ***
}
}



ISR(TIMER1_OVF_vect){


sek++;
if (sek>=60) { //wenn sek =60
sek=0;
min++;
}
if (min>=60) { //wenn sek =60
min=0;
hour++;
}
if (hour>=24) { //wenn sek =60
hour=0;
day++;
}

TCNT1H = 0xE1; //s.o.
TCNT1L = 0x7A; //s.o.

}


void int2lcd(int temp1,int temp2,int temp3,int temp4)
{
lcd_data(temp1);
lcd_data(temp2);
lcd_data(temp3);
lcd_data(temp4);

set_cursor(0,2);

// Ausgabe der Variable als Text in dezimaler Schreibweise
{
// ... umwandeln siehe FAQ Artikel bei www.mikrocontroller.net
// WinAVR hat eine itoa()-Funktion, das erfordert obiges #include <stdlib.h>
char Buffer1[20]; // in diesem {} lokal

itoa( temp1, Buffer1, 10 );


// ... ausgeben
lcd_string( Buffer1 );
}
set_cursor(2,2);
lcd_data(':');
//***************************************
set_cursor(3,2);

// Ausgabe der Variable als Text in dezimaler Schreibweise
{
// ... umwandeln siehe FAQ Artikel bei www.mikrocontroller.net
// WinAVR hat eine itoa()-Funktion, das erfordert obiges #include <stdlib.h>
char Buffer2[20]; // in diesem {} lokal

itoa( temp2, Buffer2, 10 );


// ... ausgeben
lcd_string( Buffer2 );
}
//*****************************************
set_cursor(5,2);
lcd_data(':');
//***************************************
set_cursor(6,2);

// Ausgabe der Variable als Text in dezimaler Schreibweise
{
// ... umwandeln siehe FAQ Artikel bei www.mikrocontroller.net
// WinAVR hat eine itoa()-Funktion, das erfordert obiges #include <stdlib.h>
char Buffer3[20]; // in diesem {} lokal

itoa( temp3, Buffer3, 10 );


// ... ausgeben
lcd_string( Buffer3 );
}
//***************************************
set_cursor(8,2);
lcd_data(':');
//***************************************
set_cursor(9,2);

// Ausgabe der Variable als Text in dezimaler Schreibweise
{
// ... umwandeln siehe FAQ Artikel bei www.mikrocontroller.net
// WinAVR hat eine itoa()-Funktion, das erfordert obiges #include <stdlib.h>
char Buffer4[20]; // in diesem {} lokal

itoa( temp4, Buffer4, 10 );


// ... ausgeben
lcd_string( Buffer4 );
}
}


inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
{
if ( ! (*port & (1 << pin)) )
{
/* Pin wurde auf Masse gezogen, 100ms warten */
_delay_ms(50); // max. 262.1 ms / F_CPU in MHz
_delay_ms(50);
if ( *port & (1 << pin) )
{
/* Anwender Zeit zum Loslassen des Tasters geben */
_delay_ms(50);
_delay_ms(50);
return 1;
}
}
return 0;
}

just4fun
03.02.2009, 17:49
DAS finde ich mal eine richtig praktisch Anwendung!
Ich habe auch schon immer darüber nachgedacht... Einzig der geringe "womans-acceptance-factor" hielt (hält) mich noch davon ab... Denn optisch ist das natürlich nicht so richtig hübsch...

Wenngleich preislich kaum schlagbar, denke ich.

homedom
03.02.2009, 20:19
Hi,
Interessantes Projekt! Gefällt mir gut, wollte sowas mal für draußen machen.
Wegen deiner Uhr: wieso nimmst du nich 256 als Vorteiler? Dann muss der Overflow bei 31250 erfolgen und du hast genau 1s. Deine Berechnung und Konfiguration von Timer1 versteh ich irgwie auch nich ganz, kann auch sein des ich des nich soo gut kenn. Wieso benutzt du nicht den CTC Modus? DAnn erfolgt der Interrupt soch immer genau bei dem Wert der im OCR1A steht. Kannst du mir da deine Denkweise mal erklären? vlt denk ich ja irgwas zu kompliziert oder so..
gruß, homedom

P.S.: Ich hätte das so gemacht:


OCR1A = 31250;
TCCR1B |= (1<<CS12) | (1<<WGM12);
TIMSK |= (1<<OCIE1A);

lowtzow
03.02.2009, 20:33
Hi,
Kannst du mir da deine Denkweise mal erklären? vlt denk ich ja irgwas zu kompliziert oder so..




//Timer1 config anfang******************************************** ***
TCCR1B = (1<<CS12)|(1<<CS10);//cpu teiler= takt /1024

TCNT1H = 0xE1; //-> 8MHZ/1024=7812,5 => 1/11718 =128µsek
TCNT1L = 0x7A; //->1/128µsek=7812,5 => 2^16(65535)-7812,5=57722 = 0xE7A1

TIMSK = (1<<TOIE1); // bei Überlauf wird ein Interrupt ausgelöst

sei (); //Globale Interrupts freigeben
//Timer1 config ende********************************************** *****



sorry hab vorher anstatt auf vorschau auf absenden gedrückt :-$

homedom
03.02.2009, 20:37
Ok, mittlerweile hab ich sie verstanden.. Aber ich glaub der CTC Modus ist da etwas genauer, da solltest du keine 10s / Tag verlieren. Warum hast du den nicht genommen?
gruß, homedom

lowtzow
03.02.2009, 20:42
Hi,
Kannst du mir da deine Denkweise mal erklären? vlt denk ich ja irgwas zu kompliziert oder so..





//Timer1 config anfang******************************************** ***
TCCR1B = (1<<CS12)|(1<<CS10);//cpu teiler= takt /1024

TCNT1H = 0xE1; //-> 8MHZ/1024=7812,5 => 1/11718 =128µsek
TCNT1L = 0x7A; //->1/128µsek=7812,5 => 2^16(65535)-7812,5=57722 = 0xE7A1

TIMSK = (1<<TOIE1); // bei Überlauf wird ein Interrupt ausgelöst

sei (); //Globale Interrupts freigeben
//Timer1 config ende********************************************** *****


also die idee mit dem ctc muss ich mir mal anschaeun.
hab jetzt ohne nachdenken mal die uhr schnell programmiert, sollte mal laufen verbessern kann man dann immer noch.

kommt vieleicht daher, weil ich letztens einfach ein blinkllicht mit timer gemacht habe

zur berechnung:

TCNT1H = 0xE1; //-> 8MHZ/1024=7812,5 => 1/11718 =128µsek
TCNT1L = 0x7A; //->1/128µsek=7812,5 => 2^16(65535)-7812,5=57722 = 0xE7A1

1. also mal die fixen 8MHz durch den Teiler
2. das ergebnis ist nur ein 7812,5 von 1sek daher der wert den ich abziehen will
3. der timer läuft von 65535 runter bis zum copare wert der ja eine sek entsprechen soll d.h. ich muss 65535-7812,5 rechnen damit der richtige wert rauskommt.

ups da seh ich gras eine zahl mit einem komma, das kann ja gar nicht genau sein!

danke mal für die idee, werd ich mir morgen genau anschauen!

mfg
low

homedom
03.02.2009, 20:55
Also deine Idee hab ich verstanden, klingt auch gar nicht so dumm, aber wie du eben bemerkt hast, ist die Kommazahl ein entscheidender Faktor ;-)
Allerdings muss ich dir im Punkt 3 widersprechen:
Der Timer läuft vom angegebenen Wert (65535-7812,5) bis zum Maximalwert (65535).Du setzt durch TCNT1 die aktuelle "Position" des Timers.
Zu dem Thema mit dem Magnetventil oder 2. Pumpe: Wenn es denn bei den 2 Kreisen bleiben soll, würde ich das evtl von den Kosten/Aufwand abhängig machen. Bei einem Magnetventil musst du 3 Relais ansteuern (Pumpe, Ventil1, Ventil2), bei einer 2. Pumpe nur 2. Bei der Frage mit der Belastbarkeit der Pumpe kann ich dir leider nicht helfen, aber wenn diese nur für 4sek angeschaltet wird kann ich mir nicht vorstellen, dass da allzuviel passiert. Bin dann schonmal auf das Gehäuse gespannt..
Gruß, homedom

lowtzow
05.02.2009, 14:58
P.S.: Ich hätte das so gemacht:


OCR1A = 31250;
TCCR1B |= (1<<CS12) | (1<<WGM12);
TIMSK |= (1<<OCIE1A);


hallo

hab heut den ctc mode probiert, nach ein bisschen hin und her funkt jetzt!

mach mal den langtest zum vergleich.

ps. hab zuerst nur den code ausgebessert und vergessen in der isr
TCNT1H = 0xE1; //s.o.
TCNT1L = 0x7A; //s.o.*/ rauszunehmen und da lief er sehr falsch!

danke mal ;-)

lowtzow
07.02.2009, 09:03
update

im ctc-mode hab ich pro tag grad mal eine sekunde differenz! danke ;-)

hab mich umgeschaut wegen magnetventilen im www, schaut schlecht aus
die meisten brauchen min0,2bar (vorgesteuert)meine pumpe schafft 3meter höhe d.h. 0,3bar aber ob sich das ausgeht
magnetventile für meinen anschluss 3/4" als zwangsgesteuert oder direktgesteuert (brauchen keinen min druck) gibts ganz wenige und dann sehr teuer, leider

irgendwie hätt ich lieber magnetventile gehabt als ne zweite pumpe [-(
naja vielleicht find ich noch was.

mfg
low

Socke
09.02.2009, 11:26
Hallo zusammen,

günstige Magnetventile hab ich schonmal bei Westfalia gesehen. Bei den Waschmaschinenersatzteilen (z.B. http://www1.westfalia.de/shops/technica/ersatzteile/waschmaschinen_herde_kuehlschraenke/ventile/2633-1_fach_ventil_180_14mm.htm oder http://www1.westfalia.de/shops/technica/ersatzteile/waschmaschinen_herde_kuehlschraenke/ventile/314439-3_fach_ventil_90_14_mm_passend_f_r_waschmaschine_m iele_siemens.htm)
Das sind allerdings 230 V ~ Ventile.

Gruß Socke

Lordcyber
11.03.2009, 22:59
Hallo,
was ist das für eine Relassteckdose??
Ist die selber gebautoder gekauft wenn ja wo.
Danke

lowtzow
12.03.2009, 14:00
was ist das für eine Relassteckdose??
Ist die selber gebautoder gekauft wenn ja wo.
Danke

ja die ist selbst gebaut
ist so ne dose wo eigentlich ein schalter drinnen ist, den hab ich hinaus und ein relai hinein getan, funkt super!

die schaltsteckdose hab ich beim großen c geholt, 2örschna oder so hats gekostet.

mfg

raoul4
12.03.2009, 19:47
Gute idee, das so umzubauen.

Conrad
Bst. Nr.: 622292 - LN
2,99 Örschna ;-)