INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
HC-SR04 Alarmsketch läuft nicht richtig auf Digispark
29.12.2020, 22:55
Beitrag #1
HC-SR04 Alarmsketch läuft nicht richtig auf Digispark
Liebe Leute
Ich habe ein Problem mit meinem Alarmsketch auf dem Digispark ATTINY85 (Clone).
Auf einem Nano läuft das Programm einwandfrei, sobald ich dieses aber auf den Digispark lade, funktioniert die Funktion "Buzzer_Hauptalarm" nicht richtig, d.h. der Buzzer wird nur ganz kurz aktiv geschaltet und nicht wie programmiert die volle "DELAYTIME".
Das Programm läuft eigentlich auf dem Digispark ok., aber eben ohne die Buzzerfunktion in case 4.
Vielleich kann mir ein ATTINY-Spezialist weiterhelfen?

Hier kurz die Beschreibung des Programms:
Ich habe alle wesentlichen Anweisungen in Funktionen ausgelagert.
Mit einem HC-SR04 wird mittels der library NewPing.h die Distanz gemessen und der Messwert wird mit der Funktion "Messwerte_glaetten" etwas geglättet, damit eine schnelle Änderung das Messresultat nicht verfälscht (z.B. Vogelflug).
Der Poti dient zum Einstellen des Alarm-Schwellwerts.
Die eigentliche Alarmauswertung erfolgt einerseits durch if-Statements und switch / case Anweisungen.
case 1 Betrieb ok kein Alarm = kurzes Blinken alle 4 Sekunden
case 2 LED Voralarm = Blinken alle 1/2 Sekunde
case 3 Hauptalarm 1 = schnelles Blinken und Buzzer kurz intermittierend
case 4 Hauptalarm 2 = schnelles Blinken und Buzzer Dauerton für eingestellte Zeit

Schon jetzt vielen Dank für eure Hilfe!

Code:
// ---------------------------------------------------------------------------
// HC-SR04 mit NewPing library (für Nano und Digispark ATTINY85
// ---------------------------------------------------------------------------

#include <NewPing.h>

#define TRIGGER_PIN  3
#define ECHO_PIN     4
const int PotiPin = A1;           //für Digispark Pin 2 (analogInPin1)/ Nano A0
const int LED = 0;                //für Digispark Pin 0 / bei Nano Pin 12
const int Buzzer = 1;             //für Digispark Pin 1 / bei Nano Pin 11
#define MAX_DISTANCE 200          //Maximum distance (in centimeters)[/php]
int Distanz;
int state = 1;                    //default Switch Case Status
int PotiWert ;
int PotiWert_von = 40;            //einstellen der Alarmschwelle
int PotiWert_bis = 60;            //von / bis
int ALARM;
bool einmal = false ;             //Hilfsvariable Hauptalarm 1x
const int FIFO_Anzahl = 10;       // Anzahl der FIFO-Speicherplätze
int FIFO[FIFO_Anzahl];            // Array definieren
int Analogwert = 0;               // gemittelten Analogwert

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);   // NewPing setup of pins and maximum distance.

void setup() {                                        // <=====================void setup
  //  Serial.begin(9600);
  pinMode (LED, OUTPUT);
  pinMode (Buzzer, OUTPUT);
  digitalWrite(LED, HIGH); delay (200);               //Einschaltkontrolle
  digitalWrite(LED, LOW);  delay (200);               //Einschaltkontrolle
  digitalWrite(Buzzer, HIGH); delay (200);            //Einschaltkontrolle
  digitalWrite(Buzzer, LOW);  delay (1000);           //Einschaltkontrolle
}

void Poti_einlesen () {                                     // <=====================void Poti_einlesen
  PotiWert = analogRead(PotiPin);
  ALARM = map(PotiWert, 0, 1023, PotiWert_von, PotiWert_bis);
  //  Serial.print (" AlarmPoti = "); Serial.print (ALARM);
  //  Serial.print("   ");
}

void Messung () {                                          // <=====================void Messung
  Distanz = sonar.ping_cm();
}

void Messwerte_glaetten () {                               // <=====================void Messwerte_glaetten (smoothing FIFO)
  for (int i = FIFO_Anzahl - 1; i > 0; i--) {
    FIFO[i] = FIFO[i - 1];
  }
  FIFO[0] = Distanz;                                      // Analogwert an erste Stelle des FIFO schreiben
  Analogwert = 0;                                         // gemittelten Analogwert auf 0 setzen
  for (int i = 0; i <  FIFO_Anzahl; i = i + 1) {          // FIFO-Puffer Inhalte addieren
    //    Serial.print(FIFO[i]);
    //    Serial.print(" ");
    Analogwert = Analogwert + FIFO[i];
  }
  Analogwert = Analogwert / FIFO_Anzahl;                  // gemittelten Analogwert errechnen
  //  Serial.print("   ");
  //  Serial.print(Analogwert);
  //  Serial.println();
  delay(1);
}

void blinkLED(int zeit1 , int zeit2 , int zeit3) {        //<=====================void blinkLED (LED Blinkdauer)
  digitalWrite(LED, (millis() % ( zeit1 +  zeit2)) <  zeit3);
}

void Buzzer_Alarm (int zeit1 , int zeit2 , int zeit3) {   //<=====================void Buzzer_Alarm (Buzzer Alarm kurz)
  digitalWrite(Buzzer, (millis() % ( zeit1 +  zeit2)) <  zeit3);
}

void Buzzer_Hauptalarm() {                                //<=====================void Buzzer_Hauptalarm (Buzzer Alarm lang)
  int DELAYTIME = 2000 ;                                  // Dauer Hauptalarm Buzzer
  unsigned long TimeMoment;
  if (einmal == false )  {
    TimeMoment = millis();
    digitalWrite(Buzzer, HIGH);
    einmal = true;
  }
  if (millis() - TimeMoment >= DELAYTIME)  {
    digitalWrite(Buzzer, LOW);
  }
}

void loop() {                                           // <=====================void loop
  if (millis() % 200 == 0) {
    Messung () ;
    Poti_einlesen ();
    Messwerte_glaetten ();
    //    Serial.print (" Distanz = ");  Serial.print (Distanz);
    //    Serial.print (" ");

    if (Analogwert > ALARM)
      state = 1;
    if ((Analogwert) <= ALARM  && (Analogwert) > (ALARM - 5) )
      state = 2;
    if ((Analogwert) <= (ALARM - 5) && (Analogwert) > (ALARM - 10 ))
      state = 3;
    if ((Analogwert) <= (ALARM - 10) && (Analogwert) > 0)
      state = 4;
  }

  switch (state) {

    case 1:
      blinkLED(30, 4000, 40);                         // case 1 Betrieb ok kein Alarm
      digitalWrite(Buzzer, LOW);
      einmal = false;
      break;
    case 2:
      blinkLED(30, 500, 50);                          // case 2 LED Voralarm
      digitalWrite(Buzzer, LOW);
      einmal = false;
      break;
    case 3:
      blinkLED(50, 100, 50);                          // case 3 LED Hauptalarm + Buzzer kurz
      Buzzer_Alarm(2000, 1000, 2000);                 // case 3 LED Hauptalarm + Buzzer kurz
      break;
    case 4:
      blinkLED(50, 100, 50);                          // case 4 LED Hauptalarm
      Buzzer_Hauptalarm();                            // case 4  Buzzer lang
      break;
    default:
      blinkLED(30, 4000, 40);                         // case default Betrieb ok.
      break;

  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.12.2020, 23:10
Beitrag #2
RE: HC-SR04 Alarmsketch läuft nicht richtig auf Digispark
Was ist das für ein Buzzer ?

Ich vermute einer mit Spule.
Dann braucht dieser eine Freilaufdiode oder wenn nicht, dann reicht der Strom nicht für den Betrieb des Buzzers.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.12.2020, 23:25
Beitrag #3
RE: HC-SR04 Alarmsketch läuft nicht richtig auf Digispark
(29.12.2020 23:10)hotsystems schrieb:  Was ist das für ein Buzzer ?

Ich vermute einer mit Spule.
Dann braucht dieser eine Freilaufdiode oder wenn nicht, dann reicht der Strom nicht für den Betrieb des Buzzers.

Hallo Dieter
Für meinen Versuchsaufbau habe ich erstmal eine LED benutzt. (Das ewige tröten nervt!) Vorgesehen für meinen definitiven Endausbau ist ein 5V Active Buzzer wie dieser:
https://www.ebay.de/itm/10PCS-5V-Active-...SwAGlZyF6T
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.12.2020, 23:38
Beitrag #4
RE: HC-SR04 Alarmsketch läuft nicht richtig auf Digispark
(29.12.2020 23:25)tapsi schrieb:  Für meinen Versuchsaufbau habe ich erstmal eine LED benutzt. (Das ewige tröten nervt!) Vorgesehen für meinen definitiven Endausbau ist ein 5V Active Buzzer wie dieser:
https://www.ebay.de/itm/10PCS-5V-Active-...SwAGlZyF6T
Hast du für die Led einen Vorwiderstand eingesetzt.

Der ist mit Spule, da brauchst du zwingend eine Freilaufdiode.

Achtung die ATtiny können nur 10mA am Pin liefern!

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.12.2020, 13:30
Beitrag #5
RE: HC-SR04 Alarmsketch läuft nicht richtig auf Digispark
Hallo Dieter,

(29.12.2020 23:38)hotsystems schrieb:  Achtung die ATtiny können nur 10mA am Pin liefern!

Ich weiß nicht für welche ATtinys das gilt, aber für die Serie ATtiny25/45/85 gilt das gleiche wie für die ATmega328 Dinger.

Gruß André
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.12.2020, 14:38
Beitrag #6
RE: HC-SR04 Alarmsketch läuft nicht richtig auf Digispark
(30.12.2020 13:30)SpaghettiCode schrieb:  Ich weiß nicht für welche ATtinys das gilt, aber für die Serie ATtiny25/45/85 gilt das gleiche wie für die ATmega328 Dinger.

André,
stimmt natürlich....sollte auch 20mA heißen. Nur kurzzeitig max. 40mA.
War wohl doch zu spät. Wink

Danke für die Berichtigung.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.12.2020, 17:33
Beitrag #7
RE: HC-SR04 Alarmsketch läuft nicht richtig auf Digispark
(29.12.2020 23:38)hotsystems schrieb:  
(29.12.2020 23:25)tapsi schrieb:  Für meinen Versuchsaufbau habe ich erstmal eine LED benutzt. (Das ewige tröten nervt!) Vorgesehen für meinen definitiven Endausbau ist ein 5V Active Buzzer wie dieser:
https://www.ebay.de/itm/10PCS-5V-Active-...SwAGlZyF6T
Hast du für die Led einen Vorwiderstand eingesetzt.

Der ist mit Spule, da brauchst du zwingend eine Freilaufdiode.

Achtung die ATtiny können nur 10mA am Pin liefern!

Hallo Dieter
Am Strom kann's nicht liegen, habe für die LED-Vorwiderstände je 330 Ohm gewählt, der Poti ist 10k.
Wie gesagt: am Nano läuft das Ganze mit gleicher Konfiguration.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.12.2020, 17:46
Beitrag #8
RE: HC-SR04 Alarmsketch läuft nicht richtig auf Digispark
Da es vermutlich nicht der Sketch ist, wäre mein letzter Tipp die Taktfrequenz des ATtiny85. Wie ist der ATtiny85 vom Bootloader her geflasht und mit welchem Takt flashst du den Sketch ?

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Nano. Sketch kann nicht hochgeladen werden 4heiner 4 249 02.04.2021 17:21
Letzter Beitrag: 4heiner
  Programm startet bei Neustart nicht Moritzzz 18 561 02.04.2021 14:06
Letzter Beitrag: Tommy56
  Arduino Ampelschaltung Taster funktioniert nicht fatihakan36 9 657 13.03.2021 22:06
Letzter Beitrag: N1d45
  Library Ethernet: Nicht zu compilieren GuaAck 5 426 22.02.2021 17:31
Letzter Beitrag: Tommy56
  von delay auf millis umgestellt, klappt nur nicht. Servo Geschwindigkeit einstellen. gutschy 8 667 21.02.2021 15:22
Letzter Beitrag: gutschy
  MMega2560-Clone läßt sich nicht programmieren kpc 8 586 08.02.2021 09:50
Letzter Beitrag: hotsystems
  If-Schleife wird nicht mehr durchlaufen LK2567 2 376 05.02.2021 21:20
Letzter Beitrag: LK2567
  Tasterabfrage funktioniert nicht Moehn 4 515 05.02.2021 15:23
Letzter Beitrag: Moehn
  Kompiler beschwert sich nicht, LC-Display macht aber nicht, was es soll. generic_user492 3 402 26.01.2021 14:11
Letzter Beitrag: MicroBahner
  Arduino Uno+ Ethernetshield W5100 wird in Fritz Box nicht erkannt Justus S. 14 825 23.01.2021 13:39
Letzter Beitrag: Justus S.

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste