Guten Tag,
schonmal vielen Dank für das lesen meines Beitrags!
Ich möchte gerne eine kleine Hühnerstalltür öffnen wenn es hell wird und
schließen wenn es dunkel wird.
Ich habe dazu einen Standard Servo, einen Atmega8 und einen
Fotowiderstand von dem ich aber leider nicht die Typenbezeichnung haben.
Die Anssteuerung des Servos ist zwar schlampig geschrieben funktioniert
aber soweit.
Nur komme ich nicht mit der AD Wandlung klar, würde gerne bei erreichen
eines bestimmten Werts sagen Servo fahr Tür hoch und umgekehrt.
Ich habe den Fotowiderstand so verbunden:
PortC1 -> Fotowiderstand -> Batterie(Akku,1,2V ) -> GND
Ich weiss das eigentlich Kondensatoren dazu gehören, aber ich hab
gelesen das es man es zum testen auch ohne versuchen kann.
Habe das hier zusammengeschrieben:
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
int main (void)
{
DDRB = (1<<PB1);
int i;
int x;
DDRC=0b00000000;
i=0;
while(1)
{
ADCSR=0b11000101;
while (bit_is_set(ADCSR,6));
x=ADCW;
if(x>200)
{
while(i<1000 ) {
PORTB |= (1<<PB1);
_delay_us( 1500 );
PORTB &= ~(1<<PB1);
_delay_ms( 18 );
i++;
}
i = 0;
}
if(x<200)
{
while(i<480 ) {
PORTB |= (1<<PB1);
_delay_us( 20000 );
PORTB &= ~(1<<PB1);
_delay_ms( 18 );
i++;
}
}
}
return 0;
}
Wie ich bereits sagte, ist der Code sehr schlampig geschrieben, aber
glaube trotzdem lesbar.
Vielen Dank schonmal!
Liebe Grüsse
Benjamin
Benjamin Kehl schrieb:> PortC1 -> Fotowiderstand -> Batterie(Akku,1,2V ) -> GND
das ist schon Mal falsch!
Steht sicher irgendwo wie man's macht,
vermutlich im Tutorial
ah ok, also mach ich
GND -> Widerstand (10k ) -> Fotowiderstand -> Akku1,2V-> PortC1
Danke!
Kann mir jemand sagen wie die Daten dann im ADCR gespeichert werden?
Würde er bei 1,2 Volt dann 120 reinschreiben? Denke wohl nicht, wäre
nett wenn mir noch jemand die Umrechnungsmethode verraten könnte!
In deinem Programm ist die Schaltschwelle <200 oder >200. Damit hast du
eine Hysterese von einem Wert (=200). Der Motor an der Tür wird sich den
Wolf machen und genau dann wenn die Türaktion läuft zwischen Aufmachen
und Zumachen zappeln!
> glaube trotzdem lesbar.
C Beautifier sind längst erfunden.
ADC beim Atmega8 in C
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#ADC_.28Analog_Digital_Converter.29
Ich würde aber noch einen Endtaster/Schalter vorsehen damit im Programm
unnötiges Öffnen bzw. Schliessen der Tür vermieden wird.
Man könnte zwar den Zustand der Tür im Programm protokollieren (Variable
nach dem Öffnen/Schliessen setzen). Aber ein manuelles Betätigen der Tür
könnte das System aus dem Tritt bringen, wenn man danach nicht manuell
den Zustand herstellt den das Programm protokolliert hat. Wenn man
bereit ist das zu tun, könnte man den Zustand z.B. mit einer LED
anzeigen.
Wow vielen Dank, habe es jetzt folgendermaßen:
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
// Schaltung soll bei 1,2V+-10% an ADC1 schalten
// AVref = Vcc = 5V
#define SCHWELLWERT ((1024*1200)/5000)
#define HYSTERESE (SCHWELLWERT/10)
void adc_init(void) {
uint16_t result;
// ADMUX = (0<<REFS1) | (1<<REFS0); // AVcc als Referenz benutzen
ADMUX = (1<<REFS1) | (1<<REFS0); // interne Referenzspannung
nutzen
// Bit ADFR ("free running") in ADCSRA steht beim Einschalten
// schon auf 0, also single conversion
ADCSRA = (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler
ADCSRA |= (1<<ADEN); // ADC aktivieren
/* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man
liest
also einen Wert und verwirft diesen, um den ADC "warmlaufen zu
lassen" */
ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
while (ADCSRA & (1<<ADSC) ) {} // auf Abschluss der
Konvertierung warten
/* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
Wandlung nicht übernommen. */
result = ADCW;
}
uint16_t adc_read( uint8_t channel )
{
// Kanal waehlen, ohne andere Bits zu beeinflußen
ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
while (ADCSRA & (1<<ADSC) ) {} // auf Abschluss der Konvertierung
warten
return ADCW; // ADC auslesen und zurückgeben
}
int main(void)
{
DDRB = (1 << PB1); // PB1 Ausgang für Motor
DDRC = 0b00000000;
adc_init();
while (1)
{
uint16_t adcwert;
adcwert = adc_read(1);
if ( adcwert > SCHWELLWERT+HYSTERESE )
{
// Tür öffnen
for(int servopulse = 0; servopulse < 1000; servopulse++)
{
PORTB |= (1 << PB1);
_delay_us(1500);
PORTB &= ~(1 << PB1);
_delay_ms(18);
}
}
else if ( adcwert < SCHWELLWERT-HYSTERESE )
{
// Tür schliessen
for(int servopulse = 0; servopulse < 480; servopulse++)
{
PORTB |= (1 << PB1);
_delay_us(20000);
PORTB &= ~(1 << PB1);
_delay_ms(18);
}
}
}
return(0);
}
Wenn ich jetzt nichts an PortC1 anlege dreht sich der Motor in eine
Richtung ohne zu stoppen.
Wenn ich jetzt 1,2 V an PortC1 anlege passiert auch nichts anderes...
Lese jetzt das Tutorial, falls wer noch nen Tip hätte würd ich mich
freuen!
Vielen vielen Dank schonmal für die tolle Hilfe!
Liebe Grüsse
Benny
Dann vereinfache das Problem.
Der Schlüssel für dich ist zu wissen, wie groß der adcwert bei deiner
angelegten externen Spannung ist damit du 1) weisst ob dein ADC im
Programm funktioniert und 2) du die SCHALTSCHWELLE einstellen kannst.
Optimal wäre es, wenn du den adcwert z.B. über UART direkt ausgeben
könntest. Das macht aber ein Faß auf mit UART Programmierung und UART
Hardware und RS232 Verbindung zum PC...
Wenn du genug freie Portpins hast, kannst du auch den adcwert auf die
freien Portpins geben und dort mit dem Multimeter messen welcher Pegel
anliegt und daraus den Wert berechnen. Statt Multimeter gehen auch LEDs,
ist aber mehr Aufwand.
Angenommen du hast PORTD komplett frei dann kannst du 8-Bit ausgeben
z.B. die unteren 8-Bits des 10-Bit wertes adcwert
1
DDRD=0xFF;
2
PORTD=adcwert;
Du misst dann mit dem Multimeter die Pins von PORTD gegen GND. Bei LOW
Pegel (um 0V) setze eine 0 für den PDx in folgende Formel ein, bei HIGH
Pegel (>3V geschätzt) eine 1...
So wunderbar alles funktioniert, habe den Code noch etwas verändert, nur
ein einziges Problem besteht :((
Ich habe eine Batterie anstelle eines Akkus eingesetzt ( 1,53 Volt ),
wenn die Spannung über 1,2 Volt ist ist offen, wenn die Spannung unter
0,76 Volt fällt ist zu, aber wenn es dazwischen ist ( also unter 1,2 und
über 0,76 )gehts immer aufzuaufzuaufzu.
Bitte bitte helft mir noch bei diesem kleinen Denkfehler den ich da wohl
habe :(
Vielen Dank für eure Zeit! Echt super die Leute hier im Forum! Danke!
setzt eine bestimmte Hardwareschaltung am Atmega8 voraus.
AVcc und AGND müssen angeschlossen sein. AVREF ist frei bzw. über einen
100nF Kondensator mit AGND verbunden. Wenn da Unklarheiten sind, zeige
den Aufbau deiner Schaltung.
> Wenn ich jetzt nichts an PortC1 anlege dreht sich der Motor in eine> Richtung ohne zu stoppen.> Wenn ich jetzt 1,2 V an PortC1 anlege passiert auch nichts anderes...
Nichts anlegen ist nicht gut. Du solltest die garantierten Grenzwerte
testen, dann sollten auf jeden Fall zwei Schaltzustände zu sehen sein.
D.h. entweder 5V oder 0V anlegen. 0V heisst nicht nichts, sondern eine
Verbindung zu GND. Um Kurzschlüsse zu vermeiden würde ich aber alle
Spannungen über einen 1K Widerstand in Serie (als Strombegrenzer) an den
Pin anlegen. Wenn keine zwei Schaltzustände zu sehen sind, muss die
Schaltung und/oder das Programm entwanzt werden.
> aber wenn es dazwischen ist ( also unter 1,2 und> über 0,76 )gehts immer aufzuaufzuaufzu.
Da komme ich mit dem gezeigten Code nicht auf die Ursache.
Beeinflusst die Tür den Lichteinfall auf den Fotowiderstand?
Was macht der Servo bei ausbleibenden Impulsen, denn im Bereich 102 <=
adcwert <= 300 schickst du dem Servo ja nichts.
Der Code mit dem goto ist nicht schön. Ich würde so arbeiten:
Hallo!
Ok also ich hab mal alles rausgeschrieben:
Der Servo bekommt eigentlich nichts zugeschickt wenn die "mittelwerte"
als Spannung anliegen, dachte das past schon so.
Also bisher steckt noch alles im Stk500, die Verdrahtung ist
folgendermaßen:
Externe Stromquellen: 4,5 Volt Netzteil
1,5 Volt Batterie
Servo Data -> PB1
Servo + -> 4,5 Volt +
Servo - -> 4,5 Volt -
PORTC GND -> 4,5 Volt -
1,5 Volt -> Fotowiderstand -> Multimeter + -> Multimeter - -> 1,5 Volt
-
Alles ist auf ein Breadboard gesteckt, in der 5er Reihe zwischen
Fotowiderstand und Multimeter + habe ich das Kabel zum PORTC1.
In der 5er Reihe zwischen Multimeter - und 1,5 Volt - hab ich einen 10k
widerstand nach 4,5 Volt -.
Danke schonmal!
Ach und die Tür beeinflusst den Lichteinfall nicht weil ja alles noch
probeweise auf dem Breadboard gesteckt ist und noch nichts montiert ist.
Habe auch noch folgendes Problem, wenn ich das Multimeter rausnehme geht
nichts mehr...
Ich glaub ich hab da ein Anschluss Problem....
Benjamin schrieb:> Ich glaub ich hab da ein Anschluss Problem....
Es hat auch keiner gesagt, dass du das Multimeter mit verschalten
sollst.
Krapao hat doch aufgemalt, wie die Schaltung aussehen muß.
Ja aber dadurch konnte ich ablesen wie hoch die Spannung ist zum
testen... Dachte ja nicht das es zu Problemen führen könnte wenn ich es
danach rausnehme...
> Bin gerne auch bereit ein paar Euros zu überweisen für die viele Zeit> die du hier für mich opferst Krapao...
Überhaupt nicht nötig, iss einfach ein Ei für mich mit :-)
Oder bei 1,2V Versorgung des Fotowiderstands aus der Batterie.
Das ist aber nicht notwendig sondern verkompliziert die Schaltung und
beim Entleeren der Batterie ändert sich die Spannung am PC1 Abgriff des
Spannungsteilers, d.h. deine Schaltung funktioniert nicht mehr wie am
Anfang!
Ich habe dabei angenommen, dass du den µC mit 5V vom Steckbrett/STK500
versorgst.
Ist das später auch so vorgesehen oder willst du eine gemeinsame
Spannungsquelle für µC, Sensor und Servo haben (fände ich praktisch)?
Der ADC Wert ist natürlich stark davon abhängig wie du den
Fotowiderstand versorgst. Je nachVariante müssen die Werte in der
if-Bedingung angepasst werden. Weil die Spannung der Batterie beim
Entleeren sinkt, ist das bei externer Batterieversorgung des Sensors
auch ein Problem. Man müsste dann vor der Auswertung auch noch die
Batteriespannung messen und adcwert entsprechend korrigieren.
Warum denn eine hell/dunkel-Schaltung??? Dann geht die Klappe auch
tagsüber zu, wenn es gewittert oder eine Sonnenfinsternis gibt. Und wenn
es nachts gewittert und blitzt, geht die Klappe auf und der Fuchs holt
Deine Hühner.
Mach das lieber nach der Uhrzeit, Du kannst ja nach Tabellen fahren (im
Dezember wird es später hell und früher dunkel und im Juni ist es
bekanntermassen anders).
Dazu zwei Lichtschranken, die zählen, ob auch alle Hühner drin sind und
erst dann zumacht. Alarm, wenn z.B. um 23 Uhr immer noch ein Huhn fehlt.
Yeah yeah also die Batterie Variante funktioniert schonmal, muss kurz
weg und dann versuch ich die mit der gleichen Stromversorgung, ist wohl
wirklich praktischer! Vielen vielen Dank für all die ganze Hilfe!
Also ich freu mich echt riesig!
Klappt nun alles wunderbar, schon alles auf ne Lochrasterplatine
gelötet, morgen wirds montiert. Falls du mal n paar Eier abhaben willst
schreib mir ne Nachricht ;) "bbennyk83@yahoo.de"
Danke danke danke freu
Liebe grüsse und einen schönen Abend
Benny
Ach ja, habs jetzt über ein 5 Volt netzteil alles laufen, dann gibts
keine Ungenauigkeiten mit dem ADC Wert bei sinkender Batterie.
Falls mal ne Sonnenfinsternis ist überlebens die auch drausen n paar
Minuten, wenns Abend wird sind sie brav drin, schon bevors richtig
dunkel ist.
Wenns wirklich bei nem Blitz aufgeht wird wohl net der Fuchs da
rumrennen, da hoff ich einfach mal auf mein Glück und das der Fuchs auch
Angst hat wenns Donnert ;)
Die Lichtschranken sind bissl blöd falls die Katzen durchs Tor laufen,
ich werd das jetzt mal so die nächsten Wochen testen und dann bescheid
sagen wenns doch unerwartete Probleme gibt ;)
Hallo,
habe ein Problem entdeckt!
Wenn es zu einem Strom ausfall kommt würde ich gerne auf "Notstrom"
umschalten.
Habe überlegt ob das mit 4 * 1,5 V Batterien und einem Spannungsregler
möglich wäre. Weiss nur nicht wie ich das vernünftig realisieren kann.
Hätte vielleicht jemand die Lösung?
Mit freundlichen Grüssen
Benny
Benjamin schrieb:> Hallo,> habe ein Problem entdeckt!> Wenn es zu einem Strom ausfall kommt würde ich gerne auf "Notstrom"> umschalten.> Habe überlegt ob das mit 4 * 1,5 V Batterien und einem Spannungsregler> möglich wäre. Weiss nur nicht wie ich das vernünftig realisieren kann.> Hätte vielleicht jemand die Lösung?
Erstmal zu "Professioneller": was soll das dumme Geschwätz, noch dazu
als Gast? Wir haben alle mal klein angefangen. Und Benjamin hat sein
System wohl zum Laufen bekommen.
Benjamin: ist Notstrom wirklich ein Thema? Wenn bei Dir öfter der Strom
ausfällt, stelle doch eine Autobatterie hin, die Du alle Vierteljahr
nachlädst.
Ansonsten die primitivste aller Möglichkeiten: die beiden
Spannungsquellen über Dioden (am besten Zenerdioden) kombinieren. So
lange das Netzteil mehr Spannung liefert als die Batterie, ist die
Batterie quasi abgehängt.
Zenerdioden
.----------------------->|---------------
| |
| | --------
| .---->|---------------' zur Schaltung
| |
| |
| |
| / \ Netzteil
--- Batterie (_/_) 5V
- 4,5V \_/
| |
| |
'
GND GND
(created by AACircuit v1.28.6 beta 04/19/05 www.tech-chat.de)
Gruß,
Max
AR (.- .-.) schrieb:> Zenerdioden
Danke für den freundlichen und ausführlichen Hinweis einschließlich
Korrektur.
Es hätte natürlich Schottkydioden heißen sollen.
Max
> Kann mir jemand sagen wie die Daten dann im ADCR gespeichert werden?> Würde er bei 1,2 Volt dann 120 reinschreiben? Denke wohl nicht, wäre> nett wenn mir noch jemand die Umrechnungsmethode verraten könnte!
Das Datenblatt tut dies sehr gerne.