Frage für nebenbei

Gast #4887576
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.
Gast #4887586
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.
Gast #4887592
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.
Gast #4887663
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.
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren