Forum: Mikrocontroller und Digitale Elektronik Frage für nebenbei


von heike (Gast)


Lesenswert?

Hallo alle zusammen.
Ich wollte auch probieren Lichter einfach per klatschen einzuschalten 
(Arduino).
Da aber bei den vielen Tutorials die dazu gegebenen Codes bei mir nicht 
funktionieren wollten, habe ich mich an einen eigenen versucht.
Letztendlich ist meiner Meinung nach nicht schlechtes raus gekommen :


const int sounds =2;
unsigned long starttime;
unsigned int pasttime;
 int var;
 boolean statusi =false;
void setup() {
pinMode(sounds,INPUT);
pinMode(5,OUTPUT);
}
void loop() {
if ( digitalRead(sounds)==HIGH ){
starttime= millis();
var=1;
}
if  (digitalRead(sounds)==LOW ){
  pasttime=millis()-starttime;

  delay(1);

if ( digitalRead(sounds)==HIGH&&var==1&&pasttime>=200 && pasttime<=300){
      if (!statusi){
      digitalWrite(5,HIGH);
      var=2;
      statusi=true;
      }
      else if (statusi){
        statusi=false;
        Serial.println("LED OFF");
        digitalWrite (5,LOW);
        }
    }
  else if  (digitalRead(sounds)==HIGH&&var==1&&pasttime<200){
    var=2;
    }}}

Wenn ich bei diesem Code das obere delay(1) auskommentiere, dann 
funktioniert der sketch nur noch halb.
Die if Abfrage funktioniert nicht mehr gut.
Weshalb ich auf delay(1) komme: Davor habe ich dort eine Serielle 
ausgabe von pasttime eingesetzt.
Als ich diese raus nahm, geschah wie schon oben beschrieben.
Meine Frage ist also, wieso das Programm von diesem einen delay abhängig 
ist?

LG heike.

von Baendiger (Gast)


Lesenswert?

heike schrieb:
> if  (digitalRead(sounds)==LOW ){
>   pasttime=millis()-starttime;
>    delay(1);
>
> if ( digitalRead(sounds)==HIGH&&var==1&&pasttime>=200 && pasttime<=300){

Ich kann mir vorstellen, dass der Code ohne das delay zu schnell 
durchläuft. Also der Eingang nicht von low auf high wechseln kann. Du 
solltest noch was zu deinem Hardwareaufbau schreiben, um genaueres zu 
sagen.

von feierabend (Gast)


Lesenswert?

heike schrieb:
> Letztendlich ist meiner Meinung nach nicht schlechtes raus gekommen :

>  dann
> funktioniert der sketch nur noch halb.

> Die if Abfrage funktioniert nicht mehr gut.

> Als ich diese raus nahm, geschah wie schon oben beschrieben.

> Meine Frage ist also, wieso das Programm von diesem einen delay abhängig
> ist?

Mann oh Mann. Nimm noch mal einen Anlauf. Beschreibe exakt, was wann 
geht und wann nicht. Kommentare im Code helfen dem geneigten Helfer 
ungemein.

"Halb" und "nicht mehr gut" testen die Phantasie des Lesers und dessen 
Glaskugel und führen zu den alseits "beliebten" Diskussionen im µC net.

Auch falls der Fehler offensichtlich sein sollte, mag ich da gar nicht 
näher hinsehen.

von Stefan F. (Gast)


Angehängte Dateien:

Lesenswert?

Was mich an deinem Code verwirrt: Du liest den Eingang 2 digital ein. 
Was hast du denn für einen Sensor angeschlossen? Müsstest du nicht einen 
ADC nutzen?

So würde ich das ohne Arduino mit einem ATtiny13 machen:
1
#include <avr/io.h>
2
#include <util/delay.h>
3
int main() 
4
{
5
    DDRB  = 0b00000001; 
6
    PORTB = 0b00011000; 
7
    ADMUX = 2; 
8
    ADCSRA = (1<<ADEN)+(1<<ADSC)+(1<<ADATE)+(1<<ADPS2); 
9
    _delay_ms(1000);
10
    while (1) 
11
    {
12
        while ((ADCSRA & (1<<ADIF))==0);
13
        if (ADC<1014) 
14
        {
15
            PORTB |= 0b00000001; 
16
            _delay_ms(1000);
17
        }
18
        ADCSRA |= (1<<ADIF);
19
    }
20
}

PB1 = Leuchdiode mit Vorwiderstand
PB3 und PB4 = Piezo-Schallwandler

Weitere Bauteile: Batterie (3-5V) und ein 100nF Kondensator an VCC+GND.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.