Tag 15: Lichtsensor

Das Projekt des heutigen Tages benutzt die Webseite des Webservers nicht als Steueroberfläche, sondern als Ausgabeelement. Die über einen Helligkeitssensor gemessene Helligkeit wird als Relativwert übersichtlich dargestellt.

Hinter dem heutigen Türchen befindet sich ein Fototransistor, der als Lichtsensor dient. Der Fototransistor sieht aus wie ein LED, sollte aber nicht mit einer verwechselt werden. Den Aufbau des heutigen Versuchs zeigt das Bild. Der Kollektor des Fototransistors ist der kürzere Anschluss und liegt an +5 V.

Anschluss des Fototransistors an Pin A0

Anschluss des Fototransistors an Pin A0 (R=10 kOhm)

Das Programm: Day15_TCPServerBright

Bis heute bestanden die Webseiten des Webservers immer aus einer nicht veränderbaren Seite, die Daten an den Controller geschickt hat. Heute soll die Webseite vor dem Übertragen an den Browser verändert werden, um die gemessene Helligkeit des Fototransistors anzuzeigen.  Dies funktioniert, weil im Quellcode der Webseite eine Art Platzhalter versteckt ist. Das Programm ersetzt nun beim Laden der Daten aus der Progmen-Variablen den Platzhalter *bright* durch den aktuellen Helligkeitswert. Somit werden der Ausgabetext und der Ausschlag des Schiebereglers verändert. Eine weitere Zeile in der HTML-Datei sorgt dafür, dass sich die Seite automatisch alle paar Sekunden neu lädt. Schon wird die aktuelle Helligkeit übersichtlich im Browser angezeigt.

Die Webseite des Helligkeitssensors

Die Webseite des Helligkeitssensors

43 Kommentare

  1. RICI

    Heute habe ich endlich das offline tool vom Klaus im Forum gefunden.
    Herzlichen Dank fürs Sharen.

    http://iot.fkainka.de/forum/topic/textconverter
    Das Tool ist super !

    Für den Tag 15 habe ich folgende Parameter verwendert
    Input: „HTLM text“
    Parameter: „Plain Text“ „CR LF“

    Output: „const byte site[] PROGMEM“
    Parameter: „Byte Array“ „LF“

    1. RICI

      Beispiel

  2. AlfredW

    Hallo,

    2 Fragen zum Tag 15:

    – wie sieht der Fototransistor aus; wie kann man ihn von einer LED unterscheiden?
    – wie ist die Brücke/Kabel unten links bei „Y2 gesteckt? Obendrüber befindet sich kein Loch im Breadboard.

    Gruß

    Alfred

    1. Dirk

      Hi,

      die Dioden musst du von oben anschauen,
      Weiss – Diode
      Schwarz – Fotodiode
      Schwarz, kleiner Punkt – IR-Diode

      Das Bild passt nicht ganz. Der kurze Anschluss der Diode muss auf 5V, also direkt auf den Anschluss
      „Y 1“

  3. Jakob

    Bei mir ist in dieser Tür ein Kondensator drin??

    1. Klaus

      Da ist wohl bei Dir was durcheinander geraten. Auf Tag0 gibt es eine Liste, wann was drin sein sollte.

  4. Ralph

    Hey,

    endlich hatte ich auch mal wieder Zeit meinen Adventskalender auf den neuesten Stand zu bringen. Waren wieder super Projekte dabei, die mein „Anfängerherz“ höher schlagen lassen :). An dieser Stelle nochmals vielen lieben Dank!

    Eine wichtige Frage hätte ich allerdings noch (passt zwar nicht so 100 prozentig an diese Stelle aber ich hoffe, dass mir trotzdem jemand „helfen“ bzw. mich beraten kann).

    Ich möchte mich mehr mit dem Thema rund um das Arduino Board beschäftigen. Dazu würde ich mir gerne ein „Paket“ mit einem möglichst ausführlichem Handbuch aber auch einer vielzahlt an Bauteilen für Projekte in alle Richtungen zulegen. Bei Conrad findet man ja viele solcher Pakete. Es wäre super, wenn mir jemand eine Ratschlag (oder Erfahrung) geben kann, was für ein (Lern)paket perfekt für mich wäre :).

    Ich würde mich sehr über Antworten freuen :)

    Danke schonmal und liebe Grüße

    Ralph

    1. Karsten

      Hi. Wenn Enlisch kein Problem ist kannst Du im Moment bei sharewareonsale.tradepub.com ein paar recht gute Bücher als PDF gratis bekommen. Gib einfach in der Suche mal Arduino ein. Dann werden da Ein Beginners Guide, ein Buch über C-Programmierung des Arduino, Ein Buch über Home Automation und ein Bundle für den RasPi angeboten.
      und für Bauteile Sets kann man auch mal in einem großen Auktionshaus oder auf DX.com schauen… ;-)

      1. Ralph

        Vielen Dank für die Infos zum kostenlosen Guide! „Standartenglisch“ ist kein Problem :)

    2. MC

      Hallo Ralph,
      schau Dir das mal an.
      https://www.arduino.cc/en/Main/ArduinoStarterKit
      Damit habe ich auch angefangen, und bin auch noch mit viel Spaß und auch Erfolg dabei.

      1. Ralph

        Hallo MC,

        vielen Dank für deine Antwort!

        Dieser Kit, den du gepostet hast, ist doch vergleichbar mit dem hier, welcher bei conrad angeboten wird:

        https://www.conrad.de/de/arduino-arduino-starter-kit-k000007-095060.html

        Ich habe nämlich noch einen Gutschein von Conrad und bekomme über Weihnachten besuch von meinem Neffen. Wir wollen uns das sozusagen „teilen“ und zusammen lernen :)Da muss ich schauen, dass der bis dahin noch eintrifft :).

        Eine Frage noch. Bei diesen StaerterKit`s ist ja immer ein Arduino UNO dabei. Kann dieser für die Projekte auch durch das NanoESP-Board aus dem Kalender ersetzt werden? Ein Arduino UNO hat ja kein w-lan Modul.

        Liebe Grüeß

        Ralph

        1. MC

          Hallo Ralph,
          da bin ich nun auch überfragt, da ich mich abseits dieses Kalenders noch gar nicht mit dem NanoESP beschäftigt habe.
          Da aber auch hier genügend I/O Pins, sowohl digital, analog, als auch PWM vorhanden sind, sollte es schon möglich sein, den Arduino Uno durch das NanoESP zu ersetzen.
          Vergleiche aber auf jeden Fall die Strombelastbarkeit der Pins an den unterschiedlichen Boards. Nicht das es zu einer Überlastung und damit Beschädigung des NanoESP bei einem der Versuche aus dem Buch kommt.

  5. bernd

    war das jetzt ne schlechte idee, den widerstand wegzunehmen, um das programm auf das board zu laden?

    Mach ich mit dem 9V-block den Transistor kaputt?

    Ich werde es ja gleich sehen.

  6. bernd

    1. ich so: wow, ne led! ab in die kiste. ??Wie kann man die unterscheiden???

    2. „Der kollektor liegt an den 5V“ – alles klaro!!

    3. was ist das für blauer strich bei dem sensor auf dem bild, der über der weißen fläche einfach aufhört?

    4. ist das nur bei mir so, dass der usb-stecker die felder für den widerstand überdecken?

    Superspaß heute …

    1. Karsten

      1. Wenn Du in die Linse schaust ist der Fototransistor dunkel, bei LEDs sit das hell.
      2. ja
      3. Der blaue Strich ist falsch, der Anschluss des FT kann gleich in die Y Reihe gesteckt werden.
      4. Nein, das ist bei Allen so. lege den Widerstand einach flach auf das Breadboard, dann passt der Stecker drüber.

  7. Fabian

    Hi,
    ich wollte das Prog von heute so verändern das unter einer bestimmten Helligkeit eine LED an D9 geschaltet wird. Bin mir eigentlich sicher das der Schaltungsaufbau richtig ist. Bin im Programmieren nicht gerade ein Crack, bzw. ist schon lange her :-P. müsste doch mit ner einfachen if schleife zu machen sein:
    if (SENSOR < 600);
    {
    pinMode(LED, HIGH);
    }
    Jemand ne Idee?

    1. Fabian

      oder so? geht auch nich :-(
      if ((analogRead(SENSOR)) < 600);
      {
      pinMode(LED, OUTPUT);
      }

      1. Fabian

        So leuchtet die LED immer, aber nur sehr schwach
        if ((analogRead(SENSOR)) < 600);
        {
        digitalWrite(LED,HIGH);
        }

        1. Hartmut

          Ich glaube, Du musst schon ein bischen mehr von Deinem Programm zeigen, z.B. die ganze Loop() Funktion. Sonst kann keiner sehen, ob und wenn ja, wo Du die LED ausschaltest (digitalWrite(LED, LOW);)

          pinMode(LED, OUTPUT) gehört natürlich in die Setup() Funktion.

          1. Fabian

            Hey,
            also das ist mal ein Auszug, WLAN Daten sind natürlich auch drin.
            Hätte gerne das die LED brennt solange es dunkel ist und aus geht wenns hell genug ist.
            Schön, dass hier auch kein Noop hilfe bekommt :-P

            #define LED_WLAN 13
            #define LED 9
            #define SENSOR A0

            #define DEBUG true

            #include

            SoftwareSerial esp8266(11, 12); // RX, TX

            const byte site[] PROGMEM = {
            60,72,84,77,76,62,60,72,69,65,68,62,10,60,108,105,110,107,32,114,101,108,61,34,105,99,111,110,34,32,104,114,101,102,61,34,100,97,116,97,58,59,98,97,115,101,54,52,44,105,86,66,79,82,119,48,75,71,103,111,61,34,62,10,60,109,101,116,97,32,110,97,109,101,61,34,118,105,101,119,112,111,114,116,34,32,99,111,110,116,101,110,116,61,34,119,105,100,116,104,61,100,101,118,105,99,101,45,119,105,100,116,104,44,32,105,110,105,116,105,97,108,45,115,99,97,108,101,61,50,46,48,44,32,117,115,101,114,45,115,99,97,108,97,98,108,101,61,121,101,115,34,62,10,60,109,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,114,101,102,114,101,115,104,34,32,99,111,110,116,101,110,116,61,34,51,34,62,10,60,116,105,116,108,101,62,10,66,114,105,103,104,116,110,101,115,115,10,60,47,116,105,116,108,101,62,10,60,47,72,69,65,68,62,10,60,66,79,68,89,32,98,103,99,111,108,111,114,61,34,35,70,70,70,70,57,57,34,32,116,101,120,116,61,34,35,48,48,48,48,48,48,34,62,10,60,70,79,78,84,32,115,105,122,101,61,34,54,34,32,70,65,67,69,61,34,86,101,114,100,97,110,97,34,62,10,66,114,105,103,104,116,110,101,115,115,10,60,47,70,79,78,84,62,10,60,70,79,78,84,32,115,105,122,101,61,34,51,34,32,70,65,67,69,61,34,86,101,114,100,97,110,97,34,62,10,60,72,82,62,10,60,66,82,62,10,9,60,108,97,98,101,108,32,102,111,114,61,34,104,101,108,108,34,62,67,117,114,114,101,110,116,32,66,114,105,103,104,116,110,101,115,115,58,32,42,98,114,105,103,104,116,42,60,47,108,97,98,101,108,62,32,60,66,82,62,10,9,60,105,110,112,117,116,32,116,121,112,101,61,34,114,97,110,103,101,34,32,32,109,97,120,32,61,32,34,49,48,50,52,34,32,110,97,109,101,61,34,104,101,108,108,34,32,118,97,108,117,101,61,42,98,114,105,103,104,116,42,62,60,66,82,62,10,60,66,82,62,10,60,72,82,62,10,60,47,102,111,110,116,62,10,60,47,72,84,77,76,62
            };

            void setup() {
            pinMode(LED,OUTPUT);
            Serial.begin(19200);
            esp8266.begin(19200);

            if (!espConfig()) serialDebug();
            else digitalWrite(LED_WLAN, HIGH);

            if (configTCPServer()) debug(„Server Aktiv“); else debug(„Server Error“);
            }

            void loop() {

            if ((analogRead(SENSOR)) 600);
            {
            digitalWrite(LED, LOW);
            }

          2. Fabian

            Hat loop nicht gescheit kopiert
            void loop() {

            if ((analogRead(SENSOR)) 600);
            {
            digitalWrite(LED, LOW);
            }

          3. Fabian

            void loop(){
            if ((analogRead(SENSOR)) 600);
            {
            digitalWrite(LED, LOW);
            }

          4. Fabian

            Also nochmal Sorry
            #define LED_WLAN 13
            #define LED 9
            #define SENSOR A0

            #define DEBUG true

            #include

            SoftwareSerial esp8266(11, 12); // RX, TX

            const byte site[] PROGMEM = {
            60,72,84,77,76,62,60,72,69,65,68,62,10,60,108,105,110,107,32,114,101,108,61,34,105,99,111,110,34,32,104,114,101,102,61,34,100,97,116,97,58,59,98,97,115,101,54,52,44,105,86,66,79,82,119,48,75,71,103,111,61,34,62,10,60,109,101,116,97,32,110,97,109,101,61,34,118,105,101,119,112,111,114,116,34,32,99,111,110,116,101,110,116,61,34,119,105,100,116,104,61,100,101,118,105,99,101,45,119,105,100,116,104,44,32,105,110,105,116,105,97,108,45,115,99,97,108,101,61,50,46,48,44,32,117,115,101,114,45,115,99,97,108,97,98,108,101,61,121,101,115,34,62,10,60,109,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,114,101,102,114,101,115,104,34,32,99,111,110,116,101,110,116,61,34,51,34,62,10,60,116,105,116,108,101,62,10,66,114,105,103,104,116,110,101,115,115,10,60,47,116,105,116,108,101,62,10,60,47,72,69,65,68,62,10,60,66,79,68,89,32,98,103,99,111,108,111,114,61,34,35,70,70,70,70,57,57,34,32,116,101,120,116,61,34,35,48,48,48,48,48,48,34,62,10,60,70,79,78,84,32,115,105,122,101,61,34,54,34,32,70,65,67,69,61,34,86,101,114,100,97,110,97,34,62,10,66,114,105,103,104,116,110,101,115,115,10,60,47,70,79,78,84,62,10,60,70,79,78,84,32,115,105,122,101,61,34,51,34,32,70,65,67,69,61,34,86,101,114,100,97,110,97,34,62,10,60,72,82,62,10,60,66,82,62,10,9,60,108,97,98,101,108,32,102,111,114,61,34,104,101,108,108,34,62,67,117,114,114,101,110,116,32,66,114,105,103,104,116,110,101,115,115,58,32,42,98,114,105,103,104,116,42,60,47,108,97,98,101,108,62,32,60,66,82,62,10,9,60,105,110,112,117,116,32,116,121,112,101,61,34,114,97,110,103,101,34,32,32,109,97,120,32,61,32,34,49,48,50,52,34,32,110,97,109,101,61,34,104,101,108,108,34,32,118,97,108,117,101,61,42,98,114,105,103,104,116,42,62,60,66,82,62,10,60,66,82,62,10,60,72,82,62,10,60,47,102,111,110,116,62,10,60,47,72,84,77,76,62
            };

            void setup() {
            pinMode(LED,OUTPUT);
            Serial.begin(19200);
            esp8266.begin(19200);

            if (!espConfig()) serialDebug();
            else digitalWrite(LED_WLAN, HIGH);

            if (configTCPServer()) debug(„Server Aktiv“); else debug(„Server Error“);
            }

            void loop() {

            if ((analogRead(SENSOR)) *pfeillinks* 600);
            {
            digitalWrite(LED, HIGH);
            }
            if ((analogRead(SENSOR)) *pfeilrechts* 600);
            {
            digitalWrite(LED, LOW);
            }
            String xBuffer;

            Der Rest ist gleich mit dem Prog von heute

        2. Fabian

          Ah der fügt das nicht richtig ein
          if ((analogRead(SENSOR)) 600);
          {
          digitalWrite(LED, LOW);
          }

          1. nerd

            Das Pfeilrechts-Symbol kommt im Kommentar nicht durch.
            fk müsste da schon grösseren Aufwand treiben, um das zu beheben (das Symbol hat in HTML eine wichtige Rolle).
            Dies wurde in den Kommentaren auch schon erwähnt.

          2. Hartmut

            Da ist ein Semikolon am Ende der If Zeile. D.h. wenn die Bedingung erfüllt wird, tue nichts. Was Du meintest, ist:

            if ( analogRead(SENSOR) < 600 )
            {
            digitalWrite(LED, LOW);
            }
            else
            {
            digitalWrite(LED, HIGH);
            }
            Kein Semikolon hinter dem IF und das ELSE ist auch wichtig, sonst bleibt die Lampe immer aus.

          3. nerd

            Sollte so gehen. ändert sich wirklich nichts?
            Mit 10k (orange) wirds düster, mit 1k (rot) sollte es einigermassen leuchten.

    2. Fabian

      Ahhh ich habs. Ich Idiot hatte zwei ; zuviel
      Bitte ignoriert die Kommentare, sorry für den Spam.
      Viel wills ja jemand nachmachen:
      Das hier
      void loop() {

      if ((analogRead(SENSOR)) *pfeillinks* 600)
      {
      digitalWrite(LED, HIGH);
      }
      if ((analogRead(SENSOR)) *pfeilrechts* 600)
      {
      digitalWrite(LED, LOW);
      }
      String xBuffer;

      Einfügen, oben pinMode(LED,OUTPUT);
      und voila. Läuft
      Was ich jetzt damit mache. Mhm

      1. nerd

        ich brauche eine neue Brille!

  8. Klaus

    Beim Widerstand bitte aufpassen: Braun – Schwarz – Orange, nicht Braun – Schwarz – Rot !

    Hätte man mal dazu schreiben sollen. Ich als Elektroniker weiß das, aber die meisten werden darauf nicht achten.

  9. Olaf

    Ich find’s gruselig dass einfach nur gesagt wird „bitte nicht mit LED verwechseln“ ohne einen Hinweis darauf, wie man die beiden absolut sicher unterscheiden kann. Ich weiß genau dass ich mir das nicht merken kann und eigene Markierungen draufpinseln, wie unprofessionell ist das denn… :(

    1. nerd

      Die Kalenderfächer sind angeschrieben. Man kann sie ja zur Sicherheit schön brav zurücklegen! Haha.

    2. Nico

      Schau von ganz Oben drauf ;)
      Die LED sieht Weiß aus
      und der Fototransistor Schwarz

  10. Jens

    Guten Morgen, hoffe mal, das ist keine illegale Werbung.

    https://www.facebook.com/groups/967872949952771/
    (IoT mit dem NanoESP)

    Angelegt für weitere, weitergehende Experimente, Erfahrungsaustausch, Bilder, Videos…

    Viel Spaß
    Jens

    1. bastard

      Fratzenbuch …? Echt jetzt?

    2. von Hammel

      mit der Flöte vorangehen und sammeln…

  11. Raabinator

    Wieder der gleiche Fehler wie gestern:
    for (int i = 0; i <= sizeof(site); i++)
    müsste lauten
    for (int i = 0; i < sizeof(site); i++)

    Sonst wird ein Byte zuviel gesendet (ist dem Browser aber egal).

    1. jz

      Funktioniert dank dem Nullterminator; length() liefert die gewünschte Länge.

    2. Hartmut

      Die Länge eines C-Strings bestimmt man mit strlen(), die Länge eines C-Strings im Program-Memory mit strlen_P().

      Eigentlich sollte zum kopieren von C-Strings ja strcpy_P() verwendet werden. Hier wird aber nicht von C-String auf C-String kopiert, sondern von C-String auf C-Object. Daher die For-Schleife.

  12. AE

    mit Edding angemalt (natürlich nur unten ;))
    habe gerade Tag 10 bis 15 „erledigt“ und es hat alles super funktioniert, bin total begeistert und freue mich auf die nächsten Tage.
    Grosses Lob dem Autor!!

  13. Kacki

    Bei mir hat der Foto-T ein „kleineres“ Innenleben.
    Ggf. kann man die Lichtempfindlichkeit noch mit einem Multimeter messen, um ganz sicher zu sein.

    Ich frage mich gerade, ob der Foto-T den Strom von ~20mA überleben würde, wenn man ihn ausversehen mit der LED verwechselt.

  14. RGH

    Und wie genau kann ich jetzt den Fototransistor von einer weißen LED unterscheiden? (Könnte ja sein, dass die mal zufällig zusammen irgendwo herumliegen.)

    1. BravoSierra

      Servus
      Die LEDs haben an der Kathode ein schwarzes Klebeband bekommen.
      Fototransistor ein rotes.
      Die Wiederstände weiss mit den Werten drauf
      Grüssle

Schreiben Sie einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.