ESP8266 D1 Mini zeigt immer HIGH an obwohl nix angeschlossen ist

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

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