blog.ijacek007.cz

Blog o všem trochu jinak.

O možnostech led pásku s čipem WS2112B jsme si tady už několikrát psali. Dnes si z tohoto univerzálního led pásku složíme osmiřádkový displej, který bude připojený na wifi a přes síť do něj budeme posílat text, který budeme chtít zobrazit.


Pohled na rozsvícený pásek

Když už máme pásek led diod, u kterého můžeme zvlášť ovládat jednotlivé diody, téměř se nabízí možnost využít jej k něčemu lepšímu, než-li je jen obyčejný světelný had s několika různými efekty a tak si postavíme vlastní LED displej. Displej bude fungovat velice jednoduše pomocí prototypovácí desky s čipem ESP8266 se připojíme na wifi síť a zprovozníme si malý webový server, který bude mít dvě podstránky a čtveřici proměnných. První podstránka bude připravena pro přijmutí textu. Ten se předá ve formě proměnné v adresní řádce. Společně s touto proměnou si pošleme ještě dvě proměnné pro barvu textu a barvu pozadí, kterou bude náš displej při tomto textu svítit. Celý systém bude fungovat naprosto jednoduše až minimalisticky. Prostě adresní řádce pošlete text s dvěma barvami a elektronika si text převezme a pošle na náš displej. Jakmile proletí text celým displejem, tak se displej zhasne a bude čekat na další náš povel s dalším textem.


Pohled na ovládácí webovou stránku.

Náš displej tedy budete moci ovládat z jakéhokoliv zařízení ve stejné síti a prostě zobrazí co mu pošlete. Aby mohl text proletět celý, museli jsme vyřešit hned několik problému a jedním z těch nejsložitějších byl počet zaslaných znaků. Abychom mohli totiž celým textem správně proplout, musíme vědět počet znaků. Náš systém je ale úmyslně variabilní a můžete do něj poslat jen jednoduchý text typu „Ahoj světe“, ale i relativně dlouhý text. Bylo tedy nutné v kódu počet znaků spočítat tak, abychom vždy docílili správného proplutí textu, ať už je, jakkoliv dlouhý. Druhým problémem byla spotřeba samotného pásku a tím nutnost pracovat s jasem. On pásek je totiž docela nenažraný a při plném svitu všech tří barev tedy jasně bílé barvě, si pásek spotřebuje opravdu nemalé množství energie. Spotřeba se při plném svitu na bílou dokáže s přehledem přehoupnout přes několik ampér. Při plném jasu ale displej svíti tak, že už to opravdu ani není příjemné, a tak je potřeba najít kompromis, který dobře vypadá, ale i nesvítí tak, že by se ve vzdálenosti slilo písmo textu v hodně světélkující světelný zdroj. Právě proto je v našem kódu umístěna ještě podstránka jas, pomocí které můžeme nastavit jas, který se poté uloží do paměti a použije se tak i při opětovném zapojení našeho displeje. Posledním problémem je diakritika, se kterou knihovna Adafruit prostě nepočítala. Pokud tedy pošlete na displej jakýkoliv český znak, ke zobrazení tohoto znaku nedojde. Tento problém však v našem příkladě řešit nebudeme a budeme prostě brát fakt, že pokud bychom poslali český znak, pak prostě nebude zobrazen.


Schéma zapojení kontroléru led pásku i napájení.

Samotná konstrukce je velice jednoduchá. Jde vlastně jen o osm řad led pásku, rozstříhaných po 32 diodách a zapojení za sebou tak, abychom docílili hada. Nejprve se začne na první vrchní řadě vlevo a dojde se na pravou stranu. Poté se provede spoj a začne se zase vpravo a pod prvním páskem pokračujeme vlevo. Poté zase propoj pod pásek 2 a následujeme zase vpravo. I když celý pásek nesvítí pořád a jakmile projde text displejem, opět se zhasne, přesto jsme pro bezpečnost celý pásek nalepili na kus hliníkového plechu. Ten slouží jednak jako základní podklad pro náš displej a zároveň by se mohl efektivně starat o odvod tepla s diod, pokud by docházelo k generování tepla svíticími krystaly diod. Zezadu našeho panelu je tak jen samotný kontrolér s web serverem a k celému displeji jdou pouze tři kabely, dva z nich jsou napájecí a poslední je datový, který se stará o komunikaci s řídícími čipy diod v pásku. Teď už samotný zdrojový kód.


Pohled na led pásek spojený jako LCD display.

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <ESP_EEPROM.h>

#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#ifndef PSTR
 #define PSTR // Make Arduino Due happy
#endif

#define PIN 4
#define BRIGHTNESS 100
#define JAS_AD 10 // adresa jasu v paměti

#ifndef STASSID
#define STASSID "Název Wifi"
#define STAPSK  "SuperTajneHeslo"
#endif

const char* ssid = STASSID;
const char* password = STAPSK;

ESP8266WebServer server(80);
String webString = "";   // String to display

const int led = 13;

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(32, 8, PIN,
  NEO_MATRIX_TOP     + NEO_MATRIX_LEFT +
  NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG,
  NEO_GRB            + NEO_KHZ800);

const uint16_t colors[] = {
  matrix.Color(255, 0, 0), matrix.Color(0, 255, 0), matrix.Color(0, 0, 255) };

int x    = matrix.width();
int pass = 0;


void handleRoot() {
  digitalWrite(led, 1);
  server.send(200, "text/plain", "hello from esp8266!\r\n");
  digitalWrite(led, 0);
}

void handleNotFound() {
  digitalWrite(led, 1);
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i = 0; i < server.args(); i++) {
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
  digitalWrite(led, 0);
}

void setup(void) {
  pinMode(led, OUTPUT);
  digitalWrite(led, 0);
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  if (MDNS.begin("LCD")) {
    Serial.println("MDNS responder started");
  }

  //server.on("/", handleRoot);

  server.on("/", []() {
    // root stranka
 int read_jas;
 EEPROM.get(JAS_AD, read_jas);

  server.send(200, "text/plain", "Nastaveny jas je "+String(read_jas)+"");

  });

  server.on("/text", []() {

    String a=server.arg("a");
    String html1 = a;
    int pocet = 0;
    int r1 = 255;
    int g1 = 0;
    int b1 = 0;
    int r2 = 0;
    int g2 = 0;
    int b2 = 0;

    String c=server.arg("c");
    int opakovani = c.toInt();



    pocet = html1.length();

    //#F96AA3  F96AA3
    //# nelze pouzit ignoruje v promenich tento znak !

     if ((pocet > 5 ) and (pocet < 7)) {
     // poslalo se 6 znaku správne zadani
       Serial.println(" Spravne zadani ");

    // string hexstring = "#FF3Fa0";

     html1 = "#"+html1;

    // Get rid of '#' and convert it to integer
    int number = (int) strtol( &html1[1], NULL, 16);

    // Split them up into r, g, b values
    r1 = number >> 16;
    g1 = number >> 8 & 0xFF;
    b1 = number & 0xFF;
    }

  String b=server.arg("b");
      String html2 = b;
    Serial.println("Volam zmenu barvy z html zadani");
    int pocet2 = 0;
    pocet2 = html2.length();

    //#F96AA3  F96AA3
    //# nelze pouzit ignoruje v promenich tento znak !

     if ((pocet2 > 5 ) and (pocet2 < 7)) {
     // poslalo se 6 znaku správne zadani
       Serial.println(" Spravne zadani ");

    // string hexstring = "#FF3Fa0";

     html2 = "#"+html2;

    // Get rid of '#' and convert it to integer
    int number = (int) strtol( &html2[1], NULL, 16);

    // Split them up into r, g, b values
    r2 = number >> 16;
    g2 = number >> 8 & 0xFF;
    b2 = number & 0xFF;
   }

    String text =server.arg("d");
    //char text[]="Speedy ";
    //int pocet = strlen(text) +1;
    unsigned int pocet3 = text.length();     // previous length of the String
    //x = -33;

    int pocet4 = pocet3 * 6 +33  ;
  int krok = 0;
  Serial.print("Pocet znaku ");
  Serial.println(pocet4);

  matrix.setTextColor(matrix.Color(r1, g1, b1));
  server.send(200, "text/plain", "Poslan text "+text+" pocet znaku "+pocet4);

  for(krok=0;krok<(pocet4);krok++){

  matrix.fillScreen(matrix.Color(r2, g2, b2));
  matrix.setCursor(x, 0);

  //matrix.print(text);
 matrix.print(text);
  // jeden znak 18 na 4  + 6 na každe dalsi cislo


 /**/
  if(--x < -pocet4) {
    x = matrix.width();
   // if(++pass >= 3) pass = 0;
   // matrix.setTextColor(matrix.Color(r, g, b));
  }
 matrix.show();
  delay(100);

  }
   pass = 0;
   x    = matrix.width();
   matrix.fillScreen(matrix.Color(0, 0, 0));
   matrix.show();
   // x = 0;


  });

   server.on("/jas", []() { // if you add this subdirectory to your webserver call, you get text below :)
    int chyba_dat = 0;
    String r=server.arg("r");
    int jas = r.toInt();
    Serial.println("Volam zmenu jasu");
    Serial.print(" Jas - ");
    Serial.println(jas);


 if ((jas > -1 ) and (jas < 256)) {

    webString = "Jas je  "+ String(jas) +" ";
    EEPROM.put(JAS_AD,jas);

  }else{

    webString= "Jas ma neplatne zadani cekam 0/255 ";
    chyba_dat = 1;
  }


  if ( chyba_dat < 1 ) {

  // write the data to EEPROM
  boolean ok1 = EEPROM.commit();
  matrix.setBrightness(jas);
  Serial.println((ok1) ? "Ukladani probehlo ok" : "Chyba ulozeni do pameti");

  }else{

  Serial.println("Chyba dat ukladani preruseno.");

  }


     server.send(200, "text/plain", webString);            // send to someones browser when asked


  });


  server.onNotFound(handleNotFound);

  /////////////////////////////////////////////////////////
  // Hook examples

  server.addHook([](const String & method, const String & url, WiFiClient * client, ESP8266WebServer::ContentTypeFunction contentType) {
    (void)method;      // GET, PUT, ...
    (void)url;         // example: /root/myfile.html
    (void)client;      // the webserver tcp client connection
    (void)contentType; // contentType(".html") => "text/html"
    Serial.printf("A useless web hook has passed\n");
    Serial.printf("(this hook is in 0x%08x area (401x=IRAM 402x=FLASH))\n", esp_get_program_counter());
    return ESP8266WebServer::CLIENT_REQUEST_CAN_CONTINUE;
  });

  server.addHook([](const String&, const String & url, WiFiClient*, ESP8266WebServer::ContentTypeFunction) {
    if (url.startsWith("/fail")) {
      Serial.printf("An always failing web hook has been triggered\n");
      return ESP8266WebServer::CLIENT_MUST_STOP;
    }
    return ESP8266WebServer::CLIENT_REQUEST_CAN_CONTINUE;
  });

  server.addHook([](const String&, const String & url, WiFiClient * client, ESP8266WebServer::ContentTypeFunction) {
    if (url.startsWith("/dump")) {
      Serial.printf("The dumper web hook is on the run\n");

      // Here the request is not interpreted, so we cannot for sure
      // swallow the exact amount matching the full request+content,
      // hence the tcp connection cannot be handled anymore by the
      // webserver.
#ifdef STREAMSEND_API
      // we are lucky
      client->sendAll(Serial, 500);
#else
      auto last = millis();
      while ((millis() - last) < 500) {
        char buf[32];
        size_t len = client->read((uint8_t*)buf, sizeof(buf));
        if (len > 0) {
          Serial.printf("(<%d> chars)", (int)len);
          Serial.write(buf, len);
          last = millis();
        }
      }
#endif
      // Two choices: return MUST STOP and webserver will close it
      //                       (we already have the example with '/fail' hook)
      // or                  IS GIVEN and webserver will forget it
      // trying with IS GIVEN and storing it on a dumb WiFiClient.
      // check the client connection: it should not immediately be closed
      // (make another '/dump' one to close the first)
      Serial.printf("\nTelling server to forget this connection\n");
      static WiFiClient forgetme = *client; // stop previous one if present and transfer client refcounter
      return ESP8266WebServer::CLIENT_IS_GIVEN;
    }
    return ESP8266WebServer::CLIENT_REQUEST_CAN_CONTINUE;
  });

  // Hook examples
  /////////////////////////////////////////////////////////

  matrix.begin();
  matrix.setTextWrap(false);
  //matrix.setBrightness(255);
   // načteni jasu z paměti

 EEPROM.begin(16);
 int read_jas;
 EEPROM.get(JAS_AD, read_jas);

  matrix.setBrightness(read_jas);
  matrix.setTextColor(colors[0]);



  server.begin();
  Serial.println("HTTP server started");
}

void loop(void) {
  server.handleClient();
  MDNS.update();
}

Mohlo by vás zajímat

Minimalistický wifi kontrolér k led pásku WS2812

Jednoduchá vánoční dekorace pomocí ws2812


Štítky článku elektronika | programovani | skutecnost | zabava |
Autor Ijacek.007 03.04.2022 zobrazeno 589x
Předchozí článek Jak pomocí ESP8266 či Arduina ovládat světlo DJ led světlo T645C
Autodesk Tinkercad jak emulovat kód i chování Arduina zdarma Další článek


gravatar

Vložit komentář

Nick *:
WWW:
Email * (nezobrazuje se ):
Gravatar:
Pamatuj si mě:
Komentář článku *:
Opiš následující text: *

* - vyžadované údaje. RSS kanál s komentáři

Přihlášení



Audioknihy

Jsme milovníci audio knížek, kterých aktuálně máme zakoupených 390. Poslech všech dohromady zabral přes 5340 hodin.

Z tohoto množství jsme si již stihli poslechnout téměř 48% tedy 188 audioknih.

Aktuálně poslouchaná audioknihakniha je Everest 1922

Poslední hodnocenou audioknihou je Nápad za miliardu Hodnocení audioknihy 4/5.

Nejlépe hodnocenou audioknihou je Astronautův průvodce životem na Zemi Hodnocení audioknihy 4/5.

Reklama