Forum: Mikrocontroller und Digitale Elektronik ESP8266 D1 Mini zeigt immer HIGH an obwohl nix angeschlossen ist


von One M. (one_m)


Angehängte Dateien:

Lesenswert?

Hallo liebe Leute, bin von meinem Arduino auf den ESP8266 umgestiegen 
und kenn mich schon ein bisschen aus.

Benutze das Arduino IDE.
Der ESP zeigt immer HIGH an im Serial Monitor.
hab kein Pullup Wiederstand im INPUT, hab aber ein Pulldown wiederstand 
versucht,leider erfolglos.

Ja die Pins kenn ich, und welche man für was benutzt.

Kann mir jemand helfen?Gibt es eine Einstellung die ich übersehen habe?
liegt es daran dass alle PINS PWM haben?Kann man was dagegen machen?

Danke im vorraus?

von Helmut -. (dc3yc)


Lesenswert?

One M. schrieb:
> Kann man was dagegen machen?

Ja klar! Man kann das Programm richtig schreiben. Beispielsweise, indem 
man in Zeile 42 die Ausgabe von "High" in "Low" ändert. Oder auch 
umgekehrt. Oder auch gar nichts ausgibt.

Und wenn du einen WiEderstand benutzt, kann das nichts werden! Nimm 
einen Widerstand.

: Bearbeitet durch User
von One M. (one_m)


Lesenswert?

Helmut -. schrieb:
> One M. schrieb:
>> Kann man was dagegen machen?
>
> Ja klar! Man kann das Programm richtig schreiben. Beispielsweise, indem
> man in Zeile 42 die Ausgabe von "High" in "Low" ändert. Oder auch
> umgekehrt. Oder auch gar nichts ausgibt.
>
> Und wenn du einen WiEderstand benutzt, kann das nichts werden! Nimm
> einen Widerstand.

Danke schonmal für die Antwort auch wenn sie mehr Fragen aufwirbelt.

Welche Zeile 42?

Das Problem ist dass auch wenn ich garkeinen Code habe dass die Pins 
trotzdem immer ein HIGH ausgeben

von Joachim B. (jar)


Lesenswert?

One M. schrieb:
> Das Problem ist dass auch wenn ich garkeinen Code habe dass die Pins
> trotzdem immer ein HIGH ausgeben

witzig, wie machen die das ohne Code?
Schicken sie Rauchzeichen H-I-G-H?

von EAF (Gast)


Lesenswert?

One M. schrieb:
> Das Problem ist dass auch wenn ich garkeinen Code habe dass die Pins
> trotzdem immer ein HIGH ausgeben

Wieso ist das ein Problem?
Wie machst du da kein Programm drauf?

von One M. (one_m)


Lesenswert?

danke dass die community einem hilft, auch wenn man sich verspricht oder 
sonst an einer behinderung leidet

von One M. (one_m)


Lesenswert?

Joachim B. schrieb:
> One M. schrieb:
>> Das Problem ist dass auch wenn ich garkeinen Code habe dass die Pins
>> trotzdem immer ein HIGH ausgeben
>
> witzig, wie machen die das ohne Code?
> Schicken sie Rauchzeichen H-I-G-H?

nein mit einem multimeter

von Two w/o T (Gast)


Lesenswert?

One M. schrieb:
> Welche Zeile 42?

Es kann nur eine Zeile 42 geben.

von EAF (Gast)


Lesenswert?

One M. schrieb:
> nein mit einem multimeter

Ich frage es einfach nochmal:
Wie stellst du es an da KEIN Programm drauf zu machen?

von One M. (one_m)


Lesenswert?

hab ich schon geschrieben dass ich mich vertippt habe aber du liest nur 
die hälfte und hilfst nicht weil du dich null mit der materie auskennst.

von piffpoff (Gast)


Lesenswert?

Naja, wenn die Behinderung ist, dass du denkst dass wir alle hellsehen 
können, dann ist das natürlich etwas doof wenn du von uns hilfe 
möchtest...

So muss auch ich sagen, dass ich denke, dass wahrscheinlich Zeile 42 so 
nicht korrekt ist.

von Andre (Gast)


Lesenswert?

Welcher Pin?
Welches Programm?

von Two w/o T (Gast)


Lesenswert?

One M. schrieb:
> nein mit einem multimeter

Und wie kommt die Ausgabe vom Multimeter zum Seriellen Monitor?

von Stephan (Gast)


Lesenswert?

Hallo One M.

Die Kollegen hier versuchen dir zu erklären,
daß ohne Programm hier keine Fehlerdiagnose erstellt werden kann.

Spaßvogel  Helmut -. (dc3yc) hat es mit dem Hinweis auf deine 
Programmzeile 42 versucht.

Stell das Programm hier ein, und die Kollegen können die Glaskugel 
beiseite legen.

Gruß Stephan

von Brain 2.0 (Gast)


Lesenswert?

One M. schrieb:
> hab ich schon geschrieben dass ich mich vertippt habe aber du
> liest nur
> die hälfte und hilfst nicht weil du dich null mit der materie auskennst.

Ich vermute mal, der D1 mini ist für dich zu kompliziert, bleibe lieber 
beim Arduino.

von EAF (Gast)


Lesenswert?

One M. schrieb:
> hab ich schon geschrieben dass ich mich vertippt habe aber du liest nur
> die hälfte und hilfst nicht weil du dich null mit der materie auskennst.


Du hast übrigens mit keinem Wort erwähnet, wo du dich vertippt hast!
Das darf ich mir also aussuchen.
Auch das Programm darf ich mit aussuchen.

Dann frage ich mich doch....
(....)

Alles klar!
Keine Fragen mehr!

Ich sehe schon: Mein Hilfe hier ist nicht erwünscht.
Werde mich also deiner, mir weit überlegenen Kompetenz, und damit auch 
deinem mehr als gerechtem Urteil beugen.

von One M. (one_m)


Lesenswert?

das Programm ist

byte seven_seg_digits[10] = { B11111100,  // = 0
                              B01100000,  // = 1
                              B11011010,  // = 2
                              B11110010,  // = 3
                              B01100110,  // = 4
                              B10110110,  // = 5
                              B10111110,  // = 6
                              B11100000,  // = 7
                              B11111110,  // = 8
                              B11100110   // = 9
                             };

int latchPin = 12;
int clockPin = 4;
int dataPin = 14;

#define puls 2

void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(puls, INPUT);
  Serial.begin(9600);
}

void sevenSegWrite(byte digit) {
  digitalWrite(latchPin, LOW);

  shiftOut(dataPin, clockPin, LSBFIRST, seven_seg_digits[digit]);

  digitalWrite(latchPin, HIGH);
}

void loop() {
  for (byte digit = 10; digit > 0; --digit) {
    if(digitalRead(puls) == HIGH){
      Serial.println("HIGH");
    sevenSegWrite(digit - 1);
    delay(500);
      if(digitalRead(puls) == LOW){
      Serial.println("LOW");}
}
    }
  }

Gruss Milian

von Stephan (Gast)


Lesenswert?

Hallo Milian


if(digitalRead(puls) == HIGH){ // start: wird ausgeführt, bei HIGH

      Serial.println("HIGH");

      sevenSegWrite(digit - 1);

      delay(500);

      if(digitalRead(puls) == LOW) // wird ausgeführt, wenn bis nach 
500ms

      {                            // auf Low gewechset wird sonst nie

      Serial.println("LOW");

      }
}//ende: wird ausgeführt, bei HIGH

du Testest auf HIGH.

Wenn der if-HIGH Code ausgführt wird, wird IN diesem Programmabschnitt
auf LOW getestet, sonst nie.

Ist dies so gewollt?

Gruß Stefan

von One M. (one_m)


Lesenswert?

Stephan schrieb:

> Ist dies so gewollt?
>

Hallo Stefan,erstmal danke dass du dir die Mühe machst mir zu helfen, 
hoffe dir passiert viel gutes im Leben!!

Wenn ich das richtig verstanden habe, ist das nicht so gewollt, hoiffe 
ich hab das richtig verstanden, es soll den input D7 also 14 auf LOw 
testen nicht den Programmabschnitt...

von Stephan (Gast)


Lesenswert?

Hallo Milian,

du Testest Pin2 == puls nicht Pin14

Du Testest "puls" auf LOW  Innerhalb "puls == HIGH"
wenn puls immer LOW ist, dann wird nie auf "puls == LOW" getestet

Du solltest die geschweiften Klammern anderst setzen.

z.B.:

void loop() {

  for (byte digit = 10; digit > 0; --digit) {

       if(digitalRead(puls) == HIGH){
            Serial.println("HIGH");
       }


       if(digitalRead(puls) == LOW){
           Serial.println("LOW");
       }

       sevenSegWrite(digit - 1);
       delay(500);
  }

}

Gruß Stephan

von One M. (one_m)


Lesenswert?

hab jetzt das delay ein paar zeilen nach unten gelegt und jetzt 
funktioniert es anscheinen aber malfunktioniert ab und zu, dersuche mal 
pullup und pulldown

von Stephan (Gast)


Lesenswert?

Hallo Milian,

wie sieht " void loop{ ... "
bei dir jetzt aus?

Gruß Stephan

von One M. (one_m)


Angehängte Dateien:

Lesenswert?

Stephan schrieb:
> wie sieht " void loop{ ... "
> bei dir jetzt aus?

dank dir funktioniert es jetzt ein bisschen, du bist der beste!!!
Bitteschön, hab einen Momentary tactile switch der 2 inputs hat, die 
Astabile Kippstufe und einen monostabilen kippstufen Schalter der genau 
1,37000000000002 Sekunden an ist, so kann ich zwischen automatisch und 
manuell switchen.

von Stephan (Gast)


Lesenswert?

Hallo Milian,

da fehlt eine } nach Serial.println("LOW");

oder du hast nach Zeile 59 noch ne }. die wäre aber falsch gesetzt

Gruß Stephan

von One M. (one_m)


Lesenswert?

Stephan schrieb:
> Hallo Milian,
>
> da fehlt eine } nach Serial.println("LOW");
>
> oder du hast nach Zeile 59 noch ne }. die wäre aber falsch gesetzt
>
> Gruß Stephan

Ja danach kommen noch 2 Zeilen mit }, korrigiere das eben

von Wolfgang (Gast)


Lesenswert?

One M. schrieb:
> if(digitalRead(puls) == HIGH){
> ...
> if(digitalRead(puls) == LOW){

Hoffentlich sind HIGH und LOW irgendwo passend definiert - in dem 
gezeigten Code jedenfalls nicht.

von PittyJ (Gast)


Lesenswert?

Manchmal wäre es praktischer ein 'else' zu benutzen.
Die Erklärung dazu steht in jedem guten C Buch.

von Martin H. (horo)


Lesenswert?

2 Vorschläge zur Güte:

1.) Die Arduino-IDE hat eine "Autoformat"-Funktion (STRG+T), dann siehst 
Du  an der Einrückung besser, was der Prozessor macht und nicht das, was 
Du möchtest.

2.) Wenn Du Dein Programm hier zeigst, dann verwende doch bitte die 
C-Code-Tags (siehe "Formatierung" über dem Eingabefeld, wenn Du einen 
Beitrag schreibst). Das ist besser als ein Screenshot.

: Bearbeitet durch User
von Stephan (Gast)


Lesenswert?

Hallo Wolfgang
er verwendet die Arduino IDE, da gibt es einige Threads dazu über Sinn 
und Unsinn.

Hallo PittyJ
wir sind hier am Anfang und kämpfen mit den {}.
Wir brauchen jetzt erst mal einen Erfolg zur Motivation.
Schönen Code gibts später.

Hallo Martin H
die C-Code-Tags. wie geht das?
1
C-Code
Zeilenweise oder Absatzweise oder sonstwie?
Sonstwie konnte ich nicht testen.

Hallo Milian,
wie sieht " void loop{ ... "
bei dir jetzt aus?

Gruß Stephan

von One M. (one_m)


Lesenswert?

Wolfgang schrieb:
> Hoffentlich sind HIGH und LOW irgendwo passend definiert - in dem
> gezeigten Code jedenfalls nicht.

Inwiefern definiert?
Ich hab nur den Puls definiert.

Danke schonmal für deine Antwort

von One M. (one_m)


Lesenswert?

Stephan schrieb:
> Hallo Milian,
> wie sieht " void loop{ ... "
> bei dir jetzt aus?

void loop() {
  // count from 9 to 0
  for (byte digit = 10; digit > 0; --digit) {
    if (digitalRead(puls) == HIGH) {
      Serial.println("HIGH");
    }
    sevenSegWrite(digit - 1);
    if (digitalRead(puls) == LOW) {
      Serial.println("LOW");
    }
      delay(500);
    }
  }

Woran ich arbeite dass die Astabile Kippstufe immer wenn die LED angeht 
dass der Countdown -1 geht, aber bisher läuft sie gefühlt asynchron, 
oder ich bilde mir das ein und es funktioniert, habe keine super Augen..

Viele Grüße, Milian!!

von Stephan (Gast)


Lesenswert?

Hallo Milian,

>Woran ich arbeite dass die Astabile Kippstufe immer wenn die LED angeht

Welche LED?

>dass der Countdown -1 geht, aber bisher läuft sie gefühlt asynchron,
 7-Segment Anzeige?

>oder ich bilde mir das ein und es funktioniert
kommt darauf an was dein Programm tun soll.

Bisher macht es Folgendes:

Allumfassend die For Schleife

in der Schleife abfrage von Pin2 auf High: ja? -> serielle ausgabe

in der Schleife ausgabe auf 7-Segmentanzeige

in der Schleife abfrage von Pin2 auf Low: ja? -> serielle ausgabe

in der Schleife warte 500ms

ende For Schleife

und wieder zur For Schleife

mehr nicht!

Dein Programm läuft in einer Endlosschleife durch und schaut sich Pin2 
an
und zählt immer von 9 bis 0 mit ausgabe auf 7-Segmentanzeige.
hin und wieder gibt es je nach Pin2 im Serial Monitor HIGH oder LOW aus.

Soll Pin2 den Ablauf steuern?
Wie
Pin2 == High dann Countdown auf 7-Segmentanzeige
Pin2 == Low  kein Countdown auf 7-Segmentanzeige
oder ähnlich?

Gruß Stephan

von One M. (one_m)


Angehängte Dateien:

Lesenswert?

Stephan schrieb:

> Soll Pin2 den Ablauf steuern?
> Wie
> Pin2 == High dann Countdown auf 7-Segmentanzeige
> Pin2 == Low  kein Countdown auf 7-Segmentanzeige
> oder ähnlich?

Haargenau so!!
ich zeige mal ein Foto von meinem Setup aber muss dich warnen es ist ein 
bisschen unordentlich und unübersichtlich.

Die Blaue LED ist mit einer Astabilen Kippstufe verbunden.
Das signal geht auch in einem tactilen switch zusammen mit eine 
Monostabilen Kippstufe dass ich immer switchen automatischem high low, 
zu einem manuellen High wechseln kann

Die Siebensegment Anzeige mit einem 74HC595.

von PittyJ (Gast)


Lesenswert?

Stephan schrieb:
> Hallo PittyJ
> wir sind hier am Anfang und kämpfen mit den {}.
> Wir brauchen jetzt erst mal einen Erfolg zur Motivation.
> Schönen Code gibts später.
>
Das ist kein schöner Code, sondern hätte das Problem sofort lösen 
können:

if(digitalRead(puls) == HIGH)
{
      Serial.println("HIGH");
}
else
{
      Serial.println("LOW");
}

von One M. (one_m)


Lesenswert?

Hab den Void loop geändert und jetzt klappt alles wie es soll!!!


void loop() {
  // count from 9 to 0
  for (byte digit = 10; digit > 0; --digit) {
    if (digitalRead(puls) == HIGH) {
      Serial.println("HIGH");
    sevenSegWrite(digit - 1);
    }
    if (digitalRead(puls) == LOW) {
      Serial.println("LOW");
    }
      delay(500);
    }

von Martin (Gast)


Lesenswert?

Wurde dir oben schon mal gesagt aber hier :

https://de.wikipedia.org/wiki/Einr%C3%BCckungsstil

von Stephan (Gast)


Lesenswert?

Hallo PittyJ
>Die Erklärung dazu steht in jedem guten C Buch
liest er erst, wenn er programmieren geil findet.
Den Weg dorthin tret ich erstmal aus.

Hallo Milian,

du mußt dein Programm umbauen!

1. Abfrage Pin2 == High? ja -> serielle Ausgabe UND For-Schleife mit 
7-Segmentausgabe
2. Abfrage Pin2 == Low? ja ( alternativ else ) -> serielle Ausgabe
3. warte 500ms

schreibs um und zeigs her.

Gruß Stephan

von Wolfgang (Gast)


Lesenswert?

One M. schrieb:
> Hab den Void loop geändert und jetzt klappt alles wie es soll!!!

Nein, der - zugegeben seltene - Fehler, dass bei einem 
Schleifendurchlauf zwei Ausgaben erfolgen (erst "HIGH" und direkt danach 
"LOW"), wenn der Pin2 genau zwischen den beiden Abfragen seinen Pegel 
ändert, ist dir nur noch nicht aufgefallen ;-)

von Stephan (Gast)


Lesenswert?

Hallo Wolfgang,

das kann er nur mit if .. else beheben.

dann hat PittyJ mit seinem Vorschlag 2 Fliegen mit einer Klappe 
erschlagen:
-Syntaxfehler vorbeugen
-Ablauffehler beheben

Gruß Stephan

von One M. (one_m)


Lesenswert?

Stephan schrieb:

> 1. Abfrage Pin2 == High? ja -> serielle Ausgabe UND For-Schleife mit
> 7-Segmentausgabe
> 2. Abfrage Pin2 == Low? ja ( alternativ else ) -> serielle Ausgabe
> 3. warte 500ms
>
> schreibs um und zeigs her.

Jetzt kommt kein Countdown mehr
void loop() {
  // count from 9 to 0
  if (digitalRead(puls) == HIGH) {
    Serial.println("HIGH");
    for (byte digit = 10; digit > 0; --digit) {
      sevenSegWrite(digit - 1);
    }}
    if (digitalRead(puls) == LOW) {
      Serial.println("LOW");
    }
    delay(500);
  }

weißt du woran es liegt?

von Martin (Gast)


Lesenswert?


von Martin (Gast)


Lesenswert?

Ist das jetzt try and error Programmierung?

von Martin (Gast)


Lesenswert?

Hast du mal im Gedanken durchgespielt wann deine FOR Schleife ausgeführt 
wird?

von One M. (one_m)


Lesenswert?

Martin schrieb:
> Hast du mal im Gedanken durchgespielt wann deine FOR Schleife ausgeführt
> wird?

wenn der puls auf high liegt

von Xerxes (Gast)


Lesenswert?

One M. schrieb:
> Martin schrieb:
>> Hast du mal im Gedanken durchgespielt wann deine FOR Schleife ausgeführt
>> wird?
>
> wenn der puls auf high liegt

Ja, korrekt, aber mit welcher Geschwindigkeit wird die Schleife 
durchlaufen ?

von One M. (one_m)


Lesenswert?

Xerxes schrieb:
> Ja, korrekt, aber mit welcher Geschwindigkeit wird die Schleife
> durchlaufen ?
 Jetzt seh ich es!! Warscheinlich so schnell dass George Lucas ein 
Science Fiction Film drüber drehen kann.

: Bearbeitet durch User
von Stephan (Gast)


Lesenswert?

Hallo Milian,

leider warst du mit deinem Post schneller als ich.

Ich hab dich ausversehen aufs Glatteis geschikt:(

der Countdown wird in wenigen Millisekunden durchlaufen, da kann man 
nichts beim 7-Segment erkennen.
Da sollte das delay(500) hin.
Wenn das delay jedoch in der For-Schleife sitzt dauert die Abarbeitung
10 mal 500ms sind 5 Sekunden. Solange reagiert das Programm jedoch auf 
keine Eingaben. ( sehr schlecht )

Wir nehmen das da
>Hab den Void loop geändert und jetzt klappt alles wie es soll!!!

>void loop() {
>    // count from 9 to 0
>  for (byte digit = 10; digit > 0; --digit) {
>      if (digitalRead(puls) == HIGH) {
>         Serial.println("HIGH");
>         sevenSegWrite(digit - 1);
>      }
>      if (digitalRead(puls) == LOW) {
>      Serial.println("LOW");
>      }
>      delay(500);
>    }

und machen das:
dein Ansatz mit else

void loop() {
    // count from 9 to 0
  for (byte digit = 10; digit > 0; --digit) {
      if (digitalRead(puls) == HIGH) {
         Serial.println("HIGH");
         sevenSegWrite(digit - 1);
      }
      else {
      Serial.println("LOW");
      }
      delay(500);
    }

Pinabfrage alle 500ms

Gruß Stephan

von Martin (Gast)


Lesenswert?

1
void loop() {
2
    // count from 9 to 0
3
  for (byte digit = 10; digit > 0; --digit) {
4
      if (digitalRead(puls) == HIGH) {
5
         Serial.println("HIGH");
6
         sevenSegWrite(digit - 1);
7
      }
8
      else {
9
      Serial.println("LOW");
10
      }
11
      delay(500);
12
    }

Euer Code könne auch so aussehen. Außerdem gibt ist 4 x { aber nur 3 x 
}. Gebt euch doch mal ein bissl Mühe.

Beitrag #7075020 wurde vom Autor gelöscht.
von One M. (one_m)


Angehängte Dateien:

Lesenswert?

Stephan schrieb:
> void loop() {
>     // count from 9 to 0
>   for (byte digit = 10; digit > 0; --digit) {
>       if (digitalRead(puls) == HIGH) {
>          Serial.println("HIGH");
>          sevenSegWrite(digit - 1);
>       }
>       else {
>       Serial.println("LOW");
>       }
>       delay(500);
>     }

Wir haben es fast geschafft!
Das einzige Problem was noch ist dass es manchmal stehen bleibt und 
nurnoch Low ausgibt

von Stephan (Gast)


Lesenswert?

Hallo Martin H

Stephan schrieb:

>Hallo Martin H
>die C-Code-Tags. wie geht das?

>C-Code

>Zeilenweise oder Absatzweise oder sonstwie?
>Sonstwie konnte ich nicht testen.

ich frag nochmal: Wie geht das?
wo setzt du das "c in Ekigen Klammern" und wo das "/c in Eckigen 
Klammern"?
Ich kriegs nicht gebacken!

Gruß Stephan

von Martin H. (horo)


Angehängte Dateien:

Lesenswert?

Stephan schrieb:
> ich frag nochmal: Wie geht das?
> wo setzt du das "c in Ekigen Klammern" und wo das "/c in Eckigen
> Klammern"?
> Ich kriegs nicht gebacken!

Die Formatierung wie im Screenshot oben führt zu diesem Ergebnis:
1
void loop() {
2
  // count from 9 to 0
3
  for ( byte digit = 10; digit > 0; --digit ) {
4
    if ( digitalRead( puls ) == HIGH) {
5
      Serial.println( "HIGH" );
6
      sevenSegWrite( digit - 1 );
7
    } else {
8
      Serial.println( "LOW" );
9
    }
10
    delay( 500 );
11
  }
12
}

EDIT: Der rechte Screenshot ist der richtige.

: Bearbeitet durch User
von Lötlackl *. (pappnase) Benutzerseite


Lesenswert?

Soll ggf. alle 500ms bzw. runtergezählt werden, wenn der Pin dauernd 
High ist?
Was soll passieren, wenn runtergezählt wurde?

Variante ohne for-Schleife:
1
...
2
// count from 9 to 0
3
byte digit = 9;
4
...
5
6
void setup() {
7
...
8
}
9
10
void loop() {
11
  if (digitalRead(puls) == HIGH) {
12
    Serial.println("HIGH");
13
    sevenSegWrite(digit);
14
    if (digit > 0) {
15
      digit--;
16
//  falls erneut runtergezählt werden soll
17
/*  } else {
18
      digit = 9;
19
*/  }
20
  } else {
21
    Serial.println("LOW");
22
  }
23
  delay(500);
24
...
25
}

Apropos C-Tags:
https://www.mikrocontroller.net/articles/Formatierung_im_Forum

von Stephan (Gast)


Lesenswert?

Hallo Milian,

Wenn die äußere Beschaltung passt
KÖNNTE delay(500); das Problem sein

die 500ms sind EVENTUELL zu lange für die im Hintergrund laufende 
Firmware des ESP8266.

ein anderer Ansatz wäre dann sowas:
https://docs.arduino.cc/built-in-examples/digital/BlinkWithoutDelay

Gruß Stephan

von Stephan (Gast)


Lesenswert?

Danke Martin,

jetzt habe ich es kapiert

Gruß Stephan

von One M. (one_m)


Lesenswert?

Stephan schrieb:

> Wenn die äußere Beschaltung passt
> KÖNNTE delay(500); das Problem sein
> die 500ms sind EVENTUELL zu lange für die im Hintergrund laufende
> Firmware des ESP8266.
> ein anderer Ansatz wäre dann sowas:
> https://docs.arduino.cc/built-in-examples/digital/BlinkWithoutDelay
 Hallo Stephan

mit delay(250); wird es etwas weniger :)

versuche jetzt millis

von One M. (one_m)


Lesenswert?

Stephan schrieb:
> Gruß Stephan

Hallo Stephan nochmal,

versuche es mit den millis
hinzubekommen hab:

       unsigned long zeit;

und im void loop:

      zeit= millis(500);
      zeit;

: Bearbeitet durch User
von piffpoff (Gast)


Lesenswert?

1
#include <stdint.h>
2
#include <assert.h>
3
#include <stdlib.h>
4
5
const uint16_t latchPin = 12U;
6
const uint16_t clockPin = 4U;
7
const uint16_t dataPin = 14U;
8
const uint16_t puls = 2U;
9
10
void setup() {
11
    pinMode(latchPin, OUTPUT);
12
    pinMode(clockPin, OUTPUT);
13
    pinMode(dataPin, OUTPUT);
14
    pinMode(puls, INPUT);
15
    Serial.begin(9600);
16
}
17
18
void sevenSegWrite(const uint8_t digit) {
19
    const uint8_t seven_seg_digits[] = {  
20
        0b11111100,  // = 0
21
        0b01100000,  // = 1
22
        0b11011010,  // = 2
23
        0b11110010,  // = 3
24
        0b01100110,  // = 4
25
        0b10110110,  // = 5
26
        0b10111110,  // = 6
27
        0b11100000,  // = 7
28
        0b11111110,  // = 8
29
        0b11100110   // = 9
30
    };
31
    
32
//    assert(digit < 10);
33
34
    const size_t ENTRY_COUNT = sizeof(seven_seg_digits)/sizeof(seven_seg_digits[0]);
35
    if(digit >= ENTRY_COUNT) {
36
        Serial.println("sevenSegWrite, argument out of range!");
37
        return;
38
    }
39
40
    digitalWrite(latchPin, LOW);
41
42
    shiftOut(dataPin, clockPin, LSBFIRST, seven_seg_digits[digit]);
43
44
    digitalWrite(latchPin, HIGH);
45
}
46
47
void subProgram_countdown()
48
{
49
    const uint32_t COUNTDOWN_INTERVAL_MS = 500;
50
    static uint32_t startTime = millis();
51
52
    if(millis() - startTime > COUNTDOWN_INTERVAL_MS) {
53
        startTime = millis();
54
        
55
        const bool buttonIsPressed = (digitalRead(puls) == HIGH);
56
57
        if(buttonIsPressed){
58
            Serial.println("Pressed");
59
            
60
            static uint8_t currentNumber = 9;
61
            sevenSegWrite(currentNumber);
62
            
63
            if(currentNumber == 0) {
64
                currentNumber = 9;
65
            } else {
66
                currentNumber--;
67
            }
68
        } else {
69
            Serial.println("Not Pressed");
70
        }
71
    }
72
}
73
74
void loop() {
75
    subProgram_countdown();
76
}

von One M. (one_m)


Lesenswert?

Danke PiffPoff, Weihnachten kam früh dieses Jahr

von piffpoff (Gast)


Lesenswert?

Nur wenn es auch so funktioniert wie es soll,
sonst war das ja jetzt nicht so hilfreich... :/

Hoffe das tut auch so wie du das haben möchtest...

von Wolfgang (Gast)


Lesenswert?

Stephan schrieb:
> Wenn das delay jedoch in der For-Schleife sitzt dauert die Abarbeitung
> 10 mal 500ms sind 5 Sekunden. Solange reagiert das Programm jedoch auf
> keine Eingaben. ( sehr schlecht )

Da hilft häufiger mal ein yield()

von Stefan F. (Gast)


Lesenswert?

Wolfgang schrieb:
> Da hilft häufiger mal ein yield()

Wohl kaum, schau mal was im Quelltext von Delay steht:
1
void delay(unsigned long ms)
2
{
3
    uint32_t start = micros();
4
    while (ms > 0) {
5
        yield();
6
        while ( ms > 0 && (micros() - start) >= 1000) {
7
            ms--;
8
            start += 1000;
9
        }
10
    }
11
}

von Stephan (Gast)


Lesenswert?

Hallo Milian,

läuft das Programm mit der millis() Variante besser als die delay() 
Vaiante?

Gruß Stephan

von One M. (one_m)


Lesenswert?

Stephan schrieb:
> Hallo Milian,
>
> läuft das Programm mit der millis() Variante besser als die delay()
> Vaiante?
>
> Gruß Stephan

leider nein, jetzt ist das gegenteil, manchmal hängt es sich auf und der 
serial.read gibt nur low aus, obwohl das Taktsignal weiter besteht

von Stephan (Gast)


Lesenswert?

Hallo Milian,

Du hast 2 Programmversionen, die das tun was du erwartest.
Das Problem liegt VERMUTLICH an der Verbindung zwischen dem Taktgeber 
und dem Pin2 des ESPs.
-Der Ausgang könnte nur zwischen nix und Low wechseln.
 Dann wird ein Pullup-Widerstand benötigt.
-Der Taktgeber hängt sich auf.
 Bauteildimensionen überprüfen.
-Verbide zum Test den Taktgeber direkt mit dem ESP ohne die Schaltung 
auf dem großen Steckbrett und suche den Fehler

Wenn du Hilfe brauchst,
Dann zeichne einen Schaltplan von dem Schaltungsausschnitt,
( das Steckbrett mit dem Taktgeber ) mach hier einen neuen Thread auf 
und hoffe auf Hilfe.

Es wird sicher einige Forenmitglieder geben, die an deinem Schaltpan 
rumnörgeln. Oder welche, die dir "um zwei Ecken rum" was sagen wollen ( 
wie hier Programmzeile 42 ).
Versuche zu verstehen was sie dir mitteilen wollen, und bleib immer 
cool.

Gruß Stephan

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.