Blockclock bauen aus ESP8266 und LED Display

Hat von euch schon jemand sich eine Blockclock selber gebaut?
Habe hier einen ESP8266 und ein TM1637 6-stelliges LED-Display.
Müsste doch eigentlich möglich sein?

Bin kein Programmier Freak. ChatGPT hat gut geholfen, aber leider bekomme ich, egal was ich kompiliere, immer komische Fehler angezeigt.
Komme nicht weiter.

Gibts hier Leute die das schon gemacht habe, oder Lust haben zu helfen?

Gruß Mattn

2 „Gefällt mir“

doch so viele? :smiley:

keine Arduino Freaks hier die das mal probiert haben? ;-)

Hey, ich hab vor ein paar Tagen nach dem gleichen gesucht und nur diesen Thread hier gefunden :slight_smile:
Daher hab ich mal selber was aufgesetzt und gerade auf GitHub gestellt:

Ich bin nicht ganz sicher, aber die LedController Bibliothek die ich verwende müsste auch für die TM1637 Anzeige gehen. In der config.hpp müsstest du noch die Sachen anpassen so dass sie für dich passen.
Wenn das nicht geht kannst dich ja trotzdem mal melden, vielleicht kann ich dir ja mit deinem code helfen…
So sieht das ganze bei mir aus (hab mir noch ein Gehäuse dafür aus Holz gebaut…):

1 „Gefällt mir“

Hey du! Ja sehr geil! wusste ich doch, dass es irgendwie geht :-D bin wahrscheinlich nur zu doof für sowas ;-) Aber man muss ja auch nicht ALLES perfekt können richtig? ;-)

Cool dann werde ich mir die github Seite mal anschauen sobald es geht. Werde mich, so wie ich mich kenne, ganz bestimmt bei dir melden! :smiley:
Das Gehäuse sieht ja mal richtig edel aus!

Update :-)
gerade mal rein geschaut bei github. Ich bin echt zu doof für Github.
Wo finde ich da nun Informationen, was ich genau machen muss um es nachzubauen?

Hm, wo genau hapert es?
Du lädst erstmal den Code runter, öffnest das .ino File in der Arduino IDE, und kompilierst es für deinen Controller. Dabei wird ihm dann vermutlich die LEDController Bibliothek fehlen, die musst du noch installieren.
Wenn das kompilieren klappt, passt du noch in der config.hpp deine Sachen an. Also an welchen Pins das Display angeschlossen ist, und die WLAN Informationen vor allem. Und ich hab noch die Anzahl der Stellen konfigurierbar gemacht. Bei mir sind 8, du schriebst oben du hast ein 6-stelliges Display… dann kannst mal schauen ob es läuft. Vermutlich wird die letzte Stelle bei dir nicht angezeigt, weil ich hab die erste Stelle immer frei gelassen, damit die aktuell 6-stellige Blockzeit mittig bei mir im Display steht. Da müsste man dann noch mal ran an den Code…
Wenns irgendwo nicht klappt, musst mal genauer beschreiben wo du hängst bzw. was passiert…

ah ok. das mit der .ino Datei hatte ich übersehen :smiley:
wenn ich mir den Code so anschaue, muss ich aber doch irgendwo auch mein Wlan und das Passwort eingeben. Aber wo? Sieht irgendwie anders aus bei dir, als bei anderen codes die ich bisher probiert hatte.

In der config.hpp- wie ich oben schrieb :wink:

oh man vor lauter lauter zu viel überlesen sorry.
hab mir by the way mal die gleiche Hardware bestellt wie du sie hast. dauert noch etwas.
Versuche es trotzdem mit dem was ich hier liegen haben.
wenn ich die blockclock.ino öffne, erscheint ein Feld wo steht:

Die Datei „blockclock.ino“ muss sich in einen Sketch Ordner „blockclock“ befinden. Ordner erstellen, Datei verschieben und fortfahren?

ich bin etwas weiter.
ich Depp hab die ganze Zeit die falschen Bibliotheken probiert.
ist halt alles auch noch recht neu für mich.
dachte auch: komm installier einfach 4-5. kann ja nix schaden :smiley:
Jetzt schaffe ich es endlich mal was am Display anzuzeigen.

Aktuell bekomme ich beim Kompilieren diesen Fehler:

Compilation error: ‚SPI_MOSI‘ was not declared in this scope; did you mean ‚SPIUMOSI‘?

liegt an den Anschlüssen. Mein Display hat nur:
VCC, GND, DIO und CLK

und als Bibliotheke nutze ich die hier:

Zeig doch auch bitte ein Foto der Platine. Und den Schaltplan.

Kann dir leider nicht folgen :slightly_smiling_face:
SPI_MOSI klingt nach einer Definition aus meinem Sketch, aber jetzt verwendest du eine andere Bibliothek?
Dann müsstest du wenigstens deinen Code posten.

würde ja am liebsten auf Telegram oder Discord rüber switchen ;-)

naja ich habe deinen code genommen und ihn bei perplexity eingegeben, da er ja nicht zu meiner Hardware passte.
Dort gesagt, welche Bibliothek ich verwende für mein Display. (siehe oben)
Nun sieht der Code so aus: edit. siehe paar Beiträge weiter unten

und hier noch die config.hpp (warum braucht man die überhaupt? warum schreibt man nicht alles in den normalen Code rein?

Status:
Einen Fehler beim Kompilieren oder Hochladen bekomme ich nicht, doch ich bekomme in dem 6stelligen Display nur eine Null ganz rechts angezeigt.
Scheint er empfängt keine Daten die er anzeigen kann?

Hey, ich hab mir auch eine Blockclock aus einem ESP32 und TM1637 gebaut. Das sollte deiner Hardware sehr nahe kommen. Kann dir den Code mal morgen zur Verfügung stellen.

dankeschön.
kann man ja alles mal testen.

die Frage ist, welches TM1637

Der Code in deiner Pastebin (erster Link) ist leider nicht verfügbar. Nur die config.hpp (zweiter Link) :slight_smile:

ok dann probier ich es hier:

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <TM1637TinyDisplay6.h> // Fügen Sie die TM1637TinyDisplay6-Bibliothek hinzu

// WLAN-Zugangsdaten
const char* ssid = "xxxxx";      // Ersetzen Sie dies durch Ihren WLAN-Namen
const char* password = "xxxxxx"; // Ersetzen Sie dies durch Ihr WLAN-Passwort

// Pins für das TM1637-Display
#define CLK D2  // D2 auf NodeMCU
#define DIO D1  // D1 auf NodeMCU

TM1637TinyDisplay6 display(CLK, DIO); // Initialisieren des Displays

// API-URL für die Bitcoin-Blockhöhe
const char* apiUrl = "https://blockstream.info/api/blocks/tip/height";

void setup() {
  Serial.begin(115200);
  
  display.begin(); // Display initialisieren
  display.setBrightness(7); // Maximale Helligkeit einstellen

  WiFi.begin(ssid, password);
  Serial.print("Connecting to WLAN...");
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println(" connected!");
}

void loop() {
  long blockHeight = getBitcoinBlockHeight();
  
  if (blockHeight >= 0) {
    display.showNumber(blockHeight); // Zeigt die Blockhöhe auf dem Display an
    Serial.println("Block Height: " + String(blockHeight));
  } else {
    display.showString("ERROR"); // Fehleranzeige
    Serial.println("Failed to retrieve block height.");
  }

  delay(10000); // Aktualisierung alle 10 Sekunden
}

long getBitcoinBlockHeight() {
  WiFiClient client;
  
  if (!client.connect("blockstream.info", 443)) { // Verwenden Sie Port 443 für HTTPS
    return -1; // Fehler bei der Verbindung
  }

  client.print(String("GET ") + apiUrl + " HTTP/1.1\r\n" +
               "Host: blockstream.info\r\n" +
               "Connection: close\r\n\r\n");

  String response = "";
  
  while (client.connected() || client.available()) {
    if (client.available()) {
      String line = client.readStringUntil('\n');
      response += line; // Speichern der Antwort
      if (line.length() == 0) { // Leere Zeile bedeutet Ende der Header
        break;
      }
    }
  }

  // Debugging: Ausgabe der gesamten Antwort in der seriellen Konsole
  Serial.println(response);

  return response.toInt(); // Blockhöhe zurückgeben
}

Also die Funktion getBitcoinBlockHeight() sieht ziemlich zweifelhaft aus, ich bin mir fast sicher dass das so nicht funktioniert :slight_smile:
Um es zu verifizieren, ersetze doch einfach mal in der loop() Funktion die erste Zeile durch die hier:
long blockHeight = 123456;
Dann auf den Controller laden, und wenn dein Display dann 123456 anzeigt, dann weißt du schon mal dass alles richtig verkabelt ist und das Display prinzipiell geht. Dann kann man weiter schauen.

ich hab keine Ahnung wo das getBitcoinBlockHeight her kommt :smiley: Hab eigentlich nur perplexity gesagt, es soll deinen code anpassen mit meiner Bibliothke :-D

wenn ich den Versuch mit dem 123456 mache, bekomme ich direkt diese Meldung:
Compilation error: expression cannot be used as a function

hättest du evtl die Möglichkeit deinen Code für mich zu ändern? Sprich die oben von mir genannte Bibliotheke rein schreiben und meinen esp8266 nodemcu v4?
dann müsste es ja gehen.
weil so kommen wir glaub ich nicht weiter :-)

würde mich sehr freuen und wenn es klappt auch gerne erkenntlich zeigen

Sorry für die späte Antwort. Hier ist mein Code. Sicherlich nicht der schönste Code aber funktioniert bei mir :slight_smile: Kannst du ja mal testen und dich melden, falls etwas nicht funktioniert.

edit: ach ups ich hatte ja gar nicht erwähnt, dass ich mir den aktuellen Bitcoin Kurs ausgeben lasse. Das müsstest du dementsprechend noch ändern.

#include <Arduino.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <TM1637TinyDisplay6.h> // Include 6-Digit Display Class Header

// Define Digital Pins
#define CLK 22
#define DIO 21

TM1637TinyDisplay6 display(CLK, DIO); // 6-Digit Display Class

// WLAN-Zugangsdaten
const char* ssid = "****";
const char* password = "****";

// API-URL für den Bitcoin-Kurs in Euro
const char* apiURL = "https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=eur";

void setup() {
    Serial.begin(115200); // Initialisiere die serielle Kommunikation

    // Initialisiere das Display
    display.begin();
    display.setBrightness(7); // Setze die Helligkeit auf den maximalen Wert (7)

    // Stelle eine Verbindung zum WLAN her
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
    Serial.println("Connected to WiFi");
}

void loop() {
    if (WiFi.status() == WL_CONNECTED) {
        HTTPClient http;
        http.begin(apiURL); // Starte die Verbindung zur API

        int httpCode = http.GET(); // Sende die GET-Anfrage

        if (httpCode == 200) { // Wenn die Anfrage erfolgreich war
            String payload = http.getString(); // Hole die Antwort als String
            Serial.println("Received payload: " + payload); // Debug-Ausgabe

            int BitcoinRate = parseBitcoinRate(payload); // Parste den Bitcoin-Kurs

            if (BitcoinRate >= 0) { // Überprüfe, ob der Kurs gültig ist
                display.showNumberDec(BitcoinRate, 0b00100000, false); // Zeige die ganzzahlige Zahl an
            } else {
                Serial.println("Invalid Bitcoin rate");
            }
        } else {
            Serial.println("Error on HTTP request, code: " + String(httpCode));
        }

        http.end(); // Schließe die Verbindung
    } else {
        Serial.println("WiFi Disconnected");
    }

    delay(10000); // Warte 10 Sekunden, bevor der nächste Kurs abgerufen wird
}

// Funktion zum Parsen des Bitcoin-Kurses aus dem API-Antwort-String
int parseBitcoinRate(const String& payload) {
    int startIndex = payload.indexOf("\"eur\":") + 6;
    int endIndex = payload.indexOf("}", startIndex);
    if (startIndex > 0 && endIndex > startIndex) {
        String rateString = payload.substring(startIndex, endIndex);
        return rateString.toInt();
    }
    return -1; // Rückgabewert im Fehlerfall
}