- Labornetzteil AliExpress         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: Pflanzenbesprühung /betropfung mit mega8 (avr-studio gcc)

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.05.2006
    Beiträge
    144

    Pflanzenbesprühung /betropfung mit mega8 (avr-studio gcc)

    Anzeige

    Praxistest und DIY Projekte
    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!

    Bild hier  

    so das gnaze noch mal langsam zum mitschreiben.

    1. eine mega8 grundschaltung am besten mit lcd und programmiere eine Uhr

    Bild hier  

    2. man programmiert zeiten ein in denen ein Ausgang geschalten wird.
    Code:
    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

    Bild hier  

    hier eine von insgesamt 3 Nebeldüsen

    Bild hier  

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

    Bild hier  


    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!
    Code:
    #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;
    }
    meine aktuellen Projekte
    Sternenhimmel
    http://www.roboternetz.de/phpBB2/viewtopic.php?t=31439
    BuBoter - Roboter mit Antikolision
    http://www.roboternetz.de/phpBB2/viewtopic.php?t=31632

  2. #2
    Erfahrener Benutzer Begeisterter Techniker Avatar von just4fun
    Registriert seit
    06.09.2004
    Ort
    Hannover
    Alter
    52
    Beiträge
    314
    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.
    www.robotiklabor.de - Der Podcast rund um Robotikthemen
    www.direcs.de - Meine Robotik-Seite mit Videos, Fotos, Screenshots, Source-Codes und mehr.

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    25.05.2006
    Ort
    Rheinzabern
    Alter
    33
    Beiträge
    200
    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:
    Code:
    OCR1A = 31250;
    TCCR1B |= (1<<CS12) | (1<<WGM12);
    TIMSK |= (1<<OCIE1A);

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.05.2006
    Beiträge
    144
    Zitat Zitat von homedom
    Hi,
    Kannst du mir da deine Denkweise mal erklären? vlt denk ich ja irgwas zu kompliziert oder so..
    Code:
    //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

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    25.05.2006
    Ort
    Rheinzabern
    Alter
    33
    Beiträge
    200
    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

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.05.2006
    Beiträge
    144
    Zitat Zitat von homedom
    Hi,
    Kannst du mir da deine Denkweise mal erklären? vlt denk ich ja irgwas zu kompliziert oder so..

    Code:
    //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
    meine aktuellen Projekte
    Sternenhimmel
    http://www.roboternetz.de/phpBB2/viewtopic.php?t=31439
    BuBoter - Roboter mit Antikolision
    http://www.roboternetz.de/phpBB2/viewtopic.php?t=31632

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    25.05.2006
    Ort
    Rheinzabern
    Alter
    33
    Beiträge
    200
    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

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.05.2006
    Beiträge
    144
    Zitat Zitat von homedom

    P.S.: Ich hätte das so gemacht:
    Code:
    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
    Code:
    TCNT1H = 0xE1; //s.o.
    	TCNT1L = 0x7A; //s.o.*/
    rauszunehmen und da lief er sehr falsch!

    danke mal
    meine aktuellen Projekte
    Sternenhimmel
    http://www.roboternetz.de/phpBB2/viewtopic.php?t=31439
    BuBoter - Roboter mit Antikolision
    http://www.roboternetz.de/phpBB2/viewtopic.php?t=31632

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.05.2006
    Beiträge
    144
    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
    meine aktuellen Projekte
    Sternenhimmel
    http://www.roboternetz.de/phpBB2/viewtopic.php?t=31439
    BuBoter - Roboter mit Antikolision
    http://www.roboternetz.de/phpBB2/viewtopic.php?t=31632

  10. #10
    Benutzer Stammmitglied Avatar von Socke
    Registriert seit
    04.10.2005
    Ort
    Speyer
    Beiträge
    44
    Hallo zusammen,

    günstige Magnetventile hab ich schonmal bei Westfalia gesehen. Bei den Waschmaschinenersatzteilen (z.B. http://www1.westfalia.de/shops/techn...l_180_14mm.htm oder http://www1.westfalia.de/shops/techn...le_siemens.htm)
    Das sind allerdings 230 V ~ Ventile.

    Gruß Socke

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test