Pieper löst mit aus, wenn Taster gedrückt wird - Ardublock mit Scope

Hallo zusammen,

ich habe eine kleine Schaltung mit Display, zwei Tastern, einem Mic. und einem Pieper gebaut.
Das ganze ist eine kleine Schaltung für meine Kamera und löst diese über einen Optokoppler aus.
Das Programm habe ich mit Ardublock Maxi und Scope erstellt.
Das ganze funktioniert auch, jedoch Piept der Pieper jedes mal, wenn einer der Taster gedrückt wird, um die Verzögerung einzustellen.
Ich kann mir dies einfach nicht erklären und vielleicht kann mir jemand kurz sagen warum dies so ist...

Hier das Programm:

#include <SCoop.h>
#include <LiquidCrystal.h>

bool isABEventTriggered(int trigFlag, int lastStatus, int currentStatus)
{
  switch (trigFlag)
  {
    case (0):  //LOW
    {
      return !currentStatus;
    }
    case (1):  //HIGH
    {
      return (bool)currentStatus;
    }
    case (2):  //FALLING
    {
      return (lastStatus!=currentStatus && LOW==currentStatus);
    }
    case (3):  //RISING
    {
      return (lastStatus!=currentStatus && HIGH==currentStatus);
    }
    case (4):  //CHANGE
    {
      return (lastStatus != currentStatus);
    }
  default:
    {
      return false;
    }
  }
}


int _ABVAR_1_pin_event_7 = 0;
int verzoegerung = 0 ;
int _ABVAR_3_pin_event_8 = 0;
int _ABVAR_4_pin_event_6 = 0;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup()
{
  pinMode( 6 , INPUT);
  pinMode( 13 , OUTPUT);
  mySCoop.start();
  pinMode( 9 , OUTPUT);
  pinMode( 10 , OUTPUT);
  lcd.begin(16, 2);
  pinMode( 7 , OUTPUT);
  pinMode( 8 , OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  yield();
}

defineTask(scoopTask37)
void scoopTask37::setup()
{
  pinMode(7, INPUT);
  _ABVAR_1_pin_event_7 = digitalRead(7);
}

void scoopTask37::loop()
{
  int abvarCurrentStatus = digitalRead(7);
  if (isABEventTriggered(0, _ABVAR_1_pin_event_7, abvarCurrentStatus))
  {
    verzoegerung = constrain( ( verzoegerung + 5 ) , 0 , 400 )  ;
    sleep(90);
  }
  _ABVAR_1_pin_event_7 = abvarCurrentStatus;
}

defineTask(scoopTask38)
void scoopTask38::setup()
{
  pinMode(8, INPUT);
  _ABVAR_3_pin_event_8 = digitalRead(8);
}

void scoopTask38::loop()
{
  int abvarCurrentStatus = digitalRead(8);
  if (isABEventTriggered(0, _ABVAR_3_pin_event_8, abvarCurrentStatus))
  {
    verzoegerung = constrain( ( verzoegerung - 5 ) , 0 , 400 )  ;
    sleep(90);
  }
  _ABVAR_3_pin_event_8 = abvarCurrentStatus;
}

defineTask(scoopTask39)
void scoopTask39::setup()
{
  _ABVAR_4_pin_event_6 = digitalRead(6);
}

void scoopTask39::loop()
{
  int abvarCurrentStatus = digitalRead(6);
  if (isABEventTriggered(1, _ABVAR_4_pin_event_6, abvarCurrentStatus))
  {
    sleep(verzoegerung);
    digitalWrite(9 , HIGH);
    digitalWrite(10 , HIGH);
    digitalWrite(13 , HIGH);
    sleep(70);
    digitalWrite(13 , LOW);
    digitalWrite(9 , LOW);
    digitalWrite(10 , LOW);
    sleep(200);
      lcd.setCursor(0,0);
    lcd.print( "Delay (ms):" );
    if (( ( verzoegerung ) > ( 99 ) ))
    {
    lcd.setCursor(11,0);
      lcd.print( verzoegerung );
    }
    if (( ( verzoegerung ) < ( 99 ) ))
    {
    lcd.setCursor(12,0);    
      lcd.print( verzoegerung );
    lcd.setCursor(11,0);
      lcd.print( "0" );
    }
    if (( ( verzoegerung ) < ( 9 ) ))
    {
    lcd.setCursor(13,0);
      lcd.print( verzoegerung );
    lcd.setCursor(11,0);   
      lcd.print( "00" );
    }
  }
  _ABVAR_4_pin_event_6 = abvarCurrentStatus;
}

defineTask(scoopTask40)
void scoopTask40::setup()
{
  verzoegerung = 0 ;
}

void scoopTask40::loop()
{
  digitalWrite(7 , HIGH);
  digitalWrite(8 , HIGH);
  Serial.print("message");
  Serial.print(verzoegerung);
  Serial.print(" ");
  Serial.println();
}

Pin 6 - Mic
Pin 7 - Taster
Pin 8 - Taster
Pin 9 - LED
Pin 10 - Optokoppler/Kamera
Pin 13 - Pieper

Danke und VG
Leif

Hast du den Pieper mal an einem anderen Pin probiert ?
Ich vermute, das Problem ist der Pin 13.

Ohne dieses scoop (?) könnte man evtl. was sehen ...

Pin 13 wird jedenfalls nur in deinem Task39 gesetzt.
Was ist "Mic" (Pin 6)?

MIC auf Pin 6 ist das Mikrofon.
Aber natürlich, Pin 13 ist das Problem! Die Interne LED liegt doch auch auf Pin 13, oder? Die leuchtet immer mit auf, aber warum?

Nein, grad getestet und den Pieper mit an die LED auf PIN 9 angeschlossen...
Es ist so, das die LED auch mit aufleuchtet... ich tausche mal eben den Arduino (Nano) aus und melde mich wieder.

VG
Leif

capitaenz:
MIC auf Pin 6 ist das Mikrofon.
Aber natürlich, Pin 13 ist das Problem! Die Interne LED liegt doch auch auf Pin 13, oder? Die leuchtet immer mit auf, aber warum?

Dann nimm doch mal einen anderen Pin.

Evtl. startet der Arduino ja auch neu.

Vielleicht reagiert das Mikrofon auf das Drücken des Tasters. Wenn die Taster akustisch nicht vom Mikro getrennt ist, kann es das Drücken als Geräusch auffassen. Wenn du das Ohr auf einen Tisch legst, hörst du Berührungen des Tisches auch extrem laut.

Hi

Wenn LED und Piepser am gleichen Pin angeschlossen sind, würde Es mich sogar arg wundern, wenn Piepser und LED nicht gleichzeitig Leben zeigten.

Trotzdem müsste ja irgendwer die 'Bulid_in_LED' (oder so) an/aus schalten - diese Variable ist je nach Arduino auf einen anderen Wert=Pin gesetzt, beim Nano und Uno müssten beide Mal die LED an Pin 13 sitzen (lässt sich aber nachlesen).

MfG

Hallo zusammen,

ich habe den Fehler gefunden.
Das ungewollte Piepen und aufblinken hört auf, wenn:

pinMode( 7 , OUTPUT);
pinMode( 8 , OUTPUT);

vor

mySCoop.start();

steht!?

Die Ansteuerung vom Display habe ich in einen extra Task verschoben und die LED zur Anzeige ob der Optokoppler geschaltet wird, direkt an den gleichen Pin wie den Optokoppler angeschlossen.

Das Modul vom Display im Ardublock enthält noch einen Fehler und man muss "lcd.setCursor(0,0);" per Hand im Code ergänzen.

Nun scheint alles zu laufen.

VG Leif

Hi

Danke für die Rückmeldung - verstehen muß ich Das aber nicht :wink: (ergibt nämlich nicht sonderlich viel Sinn)
Ein Austausch der benutzten Pinne brachte keinen Erfolg oder war nicht so einfach möglich?

MfG

Hallo zusammen,

also ich habe sowohl den Arduino Nano als auch den Pin getauscht, ohne Erfolg.
Erst nachdem ich per Hand die Änderungen vorgenommen habe funktionierte es.
Ardublock scheint eine große Hilfe zu sein einen Code zu erstellen, aber man muss definitiv selber Hand am Code anlegen und die ganzen Bugs beseitigen!

mySCoop.start(); wird falsch gesetzt und lcd.setCursor(XX,XX); wird nicht eingetragen und die Displayzeilen werden dann zwar angezeigt, flackern aber durch...

Hier der Code wie er bei mir funktioniert:

#include <SCoop.h>
#include <LiquidCrystal.h>

bool isABEventTriggered(int trigFlag, int lastStatus, int currentStatus)
{
  switch (trigFlag)
  {
    case (0):  //LOW
    {
      return !currentStatus;
    }
    case (1):  //HIGH
    {
      return (bool)currentStatus;
    }
    case (2):  //FALLING
    {
      return (lastStatus!=currentStatus && LOW==currentStatus);
    }
    case (3):  //RISING
    {
      return (lastStatus!=currentStatus && HIGH==currentStatus);
    }
    case (4):  //CHANGE
    {
      return (lastStatus != currentStatus);
    }
  default:
    {
      return false;
    }
  }
}


int _ABVAR_1_pin_event_6 = 0;
int verzoegerung = 0 ;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int _ABVAR_3_pin_event_7 = 0;
int _ABVAR_4_pin_event_8 = 0;

void setup()
{
  pinMode( 6 , INPUT);
  pinMode( 9 , OUTPUT);
  pinMode( 10 , OUTPUT);
  pinMode( 7 , OUTPUT);
  pinMode( 8 , OUTPUT);
  mySCoop.start();

  lcd.begin(16, 2);
}

void loop()
{
  yield();
}

defineTask(scoopTask52)
void scoopTask52::setup()
{
  _ABVAR_1_pin_event_6 = digitalRead(6);
}

void scoopTask52::loop()
{
  int abvarCurrentStatus = digitalRead(6);
  if (isABEventTriggered(3, _ABVAR_1_pin_event_6, abvarCurrentStatus))
  {
    sleep(verzoegerung);
    digitalWrite(10 , HIGH);
    digitalWrite(9 , HIGH);
    sleep(100);
    digitalWrite(9 , LOW);
    digitalWrite(10 , LOW);
    sleep(200);
  }
  _ABVAR_1_pin_event_6 = abvarCurrentStatus;
}

defineTask(scoopTask53)
void scoopTask53::setup()
{
  verzoegerung = 0 ;
  digitalWrite(7 , HIGH);
  digitalWrite(8 , HIGH);
}

void scoopTask53::loop()
{
  lcd.setCursor(0,0);
  lcd.print( "Delay (ms):" );
  if (( ( verzoegerung ) > ( 99 ) ))
  {
    lcd.setCursor(11,0);
    lcd.print( verzoegerung );
  }
  if (( ( verzoegerung ) < ( 99 ) ))
  {
        lcd.setCursor(12,0);
    lcd.print( verzoegerung );
        lcd.setCursor(22,0);
    lcd.print( "0" );
  }
  if (( ( verzoegerung ) < ( 9 ) ))
  {
        lcd.setCursor(13,0);
    lcd.print( verzoegerung );
        lcd.setCursor(11,0);
    lcd.print( "00" );
  }
}

defineTask(scoopTask54)
void scoopTask54::setup()
{
  pinMode(7, INPUT);
  _ABVAR_3_pin_event_7 = digitalRead(7);
}

void scoopTask54::loop()
{
  int abvarCurrentStatus = digitalRead(7);
  if (isABEventTriggered(2, _ABVAR_3_pin_event_7, abvarCurrentStatus))
  {
    verzoegerung = constrain( ( verzoegerung + 5 ) , 0 , 400 )  ;
    sleep(90);
  }
  _ABVAR_3_pin_event_7 = abvarCurrentStatus;
}

defineTask(scoopTask55)
void scoopTask55::setup()
{
  pinMode(8, INPUT);
  _ABVAR_4_pin_event_8 = digitalRead(8);
}

void scoopTask55::loop()
{
  int abvarCurrentStatus = digitalRead(8);
  if (isABEventTriggered(2, _ABVAR_4_pin_event_8, abvarCurrentStatus))
  {
    verzoegerung = constrain( ( verzoegerung - 5 ) , 0 , 400 )  ;
    sleep(90);
  }
  _ABVAR_4_pin_event_8 = abvarCurrentStatus;
}

VG
Leif

capitaenz:
Ardublock scheint eine große Hilfe zu sein einen Code zu erstellen, aber man muss definitiv selber Hand am Code anlegen und die ganzen Bugs beseitigen!

Mir gefällt Ironie auch besser, wenn man keine Smileys setzt.

Hi

Wie jetzt ... Gegenteil-Tag?

Pöh ... dann halt KEIN MfG :wink: (oha, ein Smiley)

Ironie... ja so halb...
Ich bin mit den Hobbys relativ breit aufgestellt: Fotografie, Sport, Videospiele, Elektronik, ...
Und Ardublock hilft mir insofern, dass ich einen Anfang finde etwas umzusetzen.

VG
Leif