ESP8266 D1 Mini zeigt immer HIGH an obwohl nix angeschlossen ist

OP #7074298
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?
Angehängte Dateien:
#7074315
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.
OP #7074322
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
Gast #7074397
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.
Gast #7074443
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
Gast #7074512
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.
Gast #7074522
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.
OP #7074532
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
Gast #7074572
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
OP #7074593
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...
Gast #7074622
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
OP #7074640
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.
Angehängte Dateien:
#7074708
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.
Gast #7074729
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
OP #7074774
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!!
Gast #7074798
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
OP #7074822
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.
Angehängte Dateien:
Gast #7074827
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");
}
OP #7074834
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);
    }
Gast #7074860
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
Gast #7074876
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 ;-)
Gast #7074893
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
OP #7074920
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?
Gast #7074970
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 ?
Gast #7075003
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
Gast #7075016
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 von einem Moderator gelöscht.
OP #7075023
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
Angehängte Dateien:
Gast #7075032
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
#7075082
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.
Angehängte Dateien:
Persönliche Seite #7075105
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
Gast #7075182
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
}
Gast #7075291
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()
Gast #7075324
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
}
Gast #7076821
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 4 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.