Bei dem letzten Versuch in diesem Advent geht es wieder etwas weihnachtlicher zu. Wir basteln eine wiederverwendbare Geschenkbox, mit der Sie Ihre Verwandten beglücken können. Jedes Mal wenn jemand das Geschenk öffnet, wird der Inhalt in einer individuellen Farbe beleuchtet und ein Weihnachtssound ertönt.
Hinter dem heutigen Türchen befindet sich eine Reflexlichtschranke. Es handelt sich dabei eigentlich um zwei Bauteile, einer IR-Sendediode und einem Phototransitor. Wie genau Sie die Elemente gepolt werden müssen ist nicht ganz einfach zu erkennen. Deswegen stecken Sie am besten die Lichtschranke nach dem unteren Vorbild mit dem Verbindungskabeln zusammen. Dann können Sie die Polung nicht so leicht vertauschen.

Der Aufbau des heutigen Tages enthält heute viele Bauteile, weswegen alles auf den ersten Blick ein bisschen verwirrend aussieht Neben der Reflexlichtschranke, die uns als Sensor zum Erkennen des Öffnen des Paketes dient, kommen noch die RGB-Diode und der Piezosummer zum Einsatz.

Das Programm: A16_P24_MQTT_Present.ino
/*
MQTT Present
Change SSID and PASSWORD.
*/
#include <NanoESP.h>
#include <NanoESP_MQTT.h>
#include <SoftwareSerial.h>
#include <RGBLED.h>
#include <RGBColor.h>
#include "pitches.h"
#include "songs.h"
#define SSID "YourSSID"
#define PASSWORD "YourPassword"
#define LED_WLAN 13
#define DEBUG true
#define RED 3
#define GREEN 5
#define BLUE 6
#define GND 4
#define BUTTON 7
#define PIEZO 8
#define IR A1
#define PHOTO A0
NanoESP nanoesp = NanoESP();
NanoESP_MQTT mqtt = NanoESP_MQTT(nanoesp);
RGBLED rgbLED = RGBLED(RED, GREEN, BLUE, 0, 3, 0);
String ip, mqttId;
RGBColor newColor = RGBColor(0, 0, 0);
RGBColor offColor = RGBColor(0, 0, 0);
int curSong;
bool isOpen = true;
mqtt_msg opened = {"", "Opened", 0, true};
void setup() {
pinMode(RED, OUTPUT);
pinMode(GREEN, OUTPUT);
pinMode(BLUE, OUTPUT);
pinMode(GND, OUTPUT);
digitalWrite(GND, LOW);
pinMode(IR, OUTPUT);
Serial.begin(19200);
nanoesp.init();
//Station Mode
nanoesp.configWifiMode(STATION);
// nanoesp.configWifiStation(SSID, PASSWORD);
if (nanoesp.wifiConnected()) {
Serial.println(F("Wifi Connected"));
digitalWrite(LED_WLAN, HIGH);
}
else {
Serial.println(F("Wifi not Connected"));
}
//Print IP in Terminal
nanoesp.getIpMac( ip, mqttId);
Serial.println("My IP: " + ip);
//Print MQTTid in Terminal
mqttId.replace(":", "");
Serial.println("My MQTT ID: " + mqttId+"\n");
if (mqtt.connect(0, "broker.fkainka.de", 1883, mqttId)) {
Serial.println(F("Connected to Broker"));
Serial.println(F("My personal Topic is:"));
Serial.println("NanoESP/" + mqttId + "/\n");
if (mqtt.subscribe(0, "NanoESP/" + mqttId + "/present", 2, newPresent)) Serial.println(F("Subscribed to present")); else Serial.println(F("Error Subscribe to present"));
}
else {
Serial.println(F("error connecting"));
}
setSongs();
}
void loop() {
int id, len;
if (nanoesp.recvData(id, len)) {
mqtt.recvMQTT(id, len); //auto hanlder mit Funktionen
}
mqtt.stayConnected(0);
//Present opened?
if (!isOpen) {
if (checkIsOpen()) {
isOpen = true;
Serial.println("Open");
mqtt.publish(0, &opened);
rgbLED.crossfade(newColor);
play(curSong);
}
}
else { //Present closed?
if (!checkIsOpen()) {
isOpen = false;
Serial.println("Closed");
rgbLED.crossfade(offColor);
}
}
}
bool checkIsOpen()
{
int high; int low;
digitalWrite(IR, HIGH);
delay(1);
high = analogRead(PHOTO);
digitalWrite(IR, LOW);
delay(1);
low = analogRead(PHOTO);
digitalWrite(IR, HIGH);
delay(1);
high += analogRead(PHOTO);
digitalWrite(IR, LOW);
delay(1);
low += analogRead(PHOTO);
if (high > (2 * low)) {
return false;
}
else {
return true;
}
}
String oldTopic;
void newPresent(String value) {
Serial.println("New Present for " + value);
if (opened.topic != "") {
mqtt.unsubscribe(0, opened.topic + "/color");
Serial.println(F("Unsubscribed old color"));
mqtt.unsubscribe(0, opened.topic + "/song");
Serial.println(F("Unsubscribed old song"));
}
opened.topic = "NanoESP/" + mqttId + "/present/" + value;
mqtt.subscribe(0, opened.topic + "/color", 2, gotnewColor); Serial.println(F("Subscribed new Color"));
// Recieve retained msg before subscribing next
int id, len;
for (int i = 0; i <= 250; i++) {
if (nanoesp.recvData(id, len)) {
if (mqtt.recvMQTT(id, len)) {
break; //auto hanlder mit Funktionen
}
}
delay(10);
}
mqtt.subscribe(0, opened.topic + "/song", 2, gotnewSong); Serial.println(F("Subscribed new Song"));
}
void gotnewColor(String value) {
Serial.println("New color: " + value);
value = value.substring(value.indexOf('(') + 1); //255,23,226)
int red = value.substring(0, value.indexOf(',')).toInt();
value = value.substring(value.indexOf(',' ) + 1); //23,226)
int green = value.substring(0, value.indexOf(',')).toInt();
value = value.substring(value.indexOf(',') + 1); //226)
int blue = value.substring(0, value.indexOf(')')).toInt();
newColor = RGBColor(red, green, blue);
//for direct change
//analogWrite(RED, red); analogWrite(GREEN, green); analogWrite(BLUE, blue);
}
void gotnewSong(String value) {
Serial.println("New Song: " + value);
curSong = value.toInt();
}
void setSongs() {
//Configuration for songs, you may change some songs
int numTunes = 5;
tunes[0] = {weWish, weWishDurations, sizeof(weWish) / sizeof(int), 80, N_C6, N_C5};
tunes[1] = {alleJahre, alleJahreDurations, sizeof(alleJahre) / sizeof(int), 80, N_C6, N_C5};
tunes[2] = {jingleBells, jingleBellsDurations, sizeof(jingleBells) / sizeof(int), 60, 784, 523};
tunes[3] = {firstNoel, firstNoelDurations, sizeof(firstNoel) / sizeof(int), 60, 523, 262};
//tunes[3] = {oHolyNight, oHolyNightDurations, sizeof(oHolyNight) / sizeof(int), 100, 659, 262};
tunes[4] = {whatChild, whatChildDurations, sizeof(whatChild) / sizeof(int), 100, 587, 247};
tunes[5] = {weThreeKings, weThreeKingsDurations, sizeof(weThreeKings) / sizeof(int), 100, 587, 294};
}
void play(int tuneNum) {
int randomOffset = random(32);
int numNotes = tunes[tuneNum].numCount;
int tempo = tunes[tuneNum].tempo;
for (int thisNote = 0; thisNote < numNotes; thisNote++) {
int freq = pgm_read_word_near(tunes[tuneNum].melody + thisNote) * 2;
int noteDuration = tempo * pgm_read_byte_near(tunes[tuneNum].durations + thisNote);
if (freq > 0) {
int n = (map(freq, tunes[tuneNum].low, tunes[tuneNum].high, 1, 31) + randomOffset) % 31 + 1;
tone(PIEZO, freq, noteDuration);
} else {
// REST
delay(noteDuration);
}
delay(noteDuration);
// to distinguish the notes, set a minimum time between them.
// the note's duration + 30% seems to work well:
int pauseBetweenNotes = noteDuration * 0.30;
delay(pauseBetweenNotes);
noTone(PIEZO);
}
}
(Die frühere Einbettung über Arduino Create ist nicht mehr verfügbar; der Code stammt aus dem Download aller Programme.)
Nachdem Sie das heutige Programm auf den Controller geladen habe, gehen Sie erneut auf die http://www.hivemq.com/try-out/ Seite und verbinden sich mit dem Broker broker.hivemq.com. Dort können Sie nun beginnen, den Personen die Sie beschenken wollen ein Topic zu widmen, und zwar nach folgendem Schema:
NanoESP/mqttId/present/person/color
NanoESP/mqttId/present/person/song
Wobei Sie mqttId durch Ihre persönliche ID und person durch die Person die Sie beschenken wollen ersetzen. In dem Topic color publishen Sie ein Farbe nach dem bekannten Schema rgb(X,X,X) und ins Topic song eine Nummer zwischen 0 und 5 die für einen vordefinierten Song steht. Beide Nachrichten müssen mit dem Retain-Flag versehen werden. Für drei Personen sähe dies nun beispielsweise so aus:
| Topic | Value | Retain |
| NanoESP/mqttId/present/mutter/color |
rgb(255,255,0) | X || NanoESP/mqttId/present/mutter/song |
2 | X || NanoESP/mqttId/present/vater/color |
rgb(0,0,255) | X || NanoESP/mqttId/present/vater/song |
1 | X || NanoESP/mqttId/present/schwester/color |
rgb(255,0,255) | X || NanoESP/mqttId/present/schwester/song |
4 | X |
Nun können Sie zwischen diesen Personen umschalten, indem Sie die Person in dem Topic
NanoESP/mqttId/present
veröffentlichen. Tragen Sie dort nun beispielsweise schwester ein (genaue Schreibweise beachten), werden die Einstellungen für Ihre Schwester geladen, und beim Öffnen der Box verwendet. Nach der Entnahme des Geschenks legen Sie das nächste hinein, schließen die Box wieder und laden die nächste Einstellung durch Publishen der nächsten Person. Zu Testzwecken können Sie den Sensor vor ein weißes Blatt halten, was das Schließen der Box simuliert. Das restliche Tageslicht muss dabei abgeschirmt werden. Nehmen Sie das Blatt weg, wird die Box als geöffnet erkannt.
Zum Bauen der Geschenkbox benötigen Sie nun nur noch einen Schuh- oder vergleichbaren Pappkarton. Das Board können Sie einfach mit dem auf der Unterseite des Boards befestigten Klebestreifens an einer Seite des Kartons befestigen. Es hat sich als besonders praktisch erwiesen, den Piezzosummer zwischen Steckboard und Karton zu stecken. Auch überschüssiges Kabel von der Reflexlichtschranke können Sie mit ankleben, wichtig ist nur, dass die Refelexlichtschranke genau bis zum Rand des Kartons reicht. Befestigen Sie ihn dort mit Klebeband.

Eine zusätzliche Pappe, die einfach in den Karton geklemmt werden kann, verdeckt das Board und den Kabelsalat. Ein kleines Loch muss allerdings noch in diese Trennwand gestochen werden, sodass die RGB-LED durchschaut und das innere des Kartons beleuchten kann. Zum Schluss können Sie, nach Bedarf, den Karton noch innen und außen mit weihnachtlichen Geschenkpapier verkleben. Schon ist die Geschenkbox fertig.


26 Kommentare
Die Kommentarfunktion ist geschlossen. Die Kommentare stammen aus der früheren WordPress-Seite.
frohe Weihnachten wünsche ich euch allen.
Nehmt wieder den Broker broker.fkainka.de, bei mir funktioniert es jetzt. Ich war da falsch unterwegs.
Für die vielen Topics habe ich mir eine Textdatei angelegt, vereinfacht etwas die Eingabe.
Justieren muss ich noch die Lichtschranke, scheint mir sehr empfindlich bei einfallendem Licht.
Mal sehen ob das heute nachmittag auch noch klappt.
collect2.exe: error: ld returned 5 exit status
exit status 1
Fehler beim Kompilieren für das Board Arduino Nano.
danke im voraus für hilfe
und fröhliche weihnachten
Der ESP8266 zieht gehörig Strom; ein 9V-Block reicht da nicht lange.
Frohes Fest.
Anschluss wie im Bild oben, kann man das irgendwie durchmessen?
jetzt klappt es, hatte doch vergessen auch NanoESP/18fe34cfa972/present zu subcriben. Mit drei Leuten muss man also 7 subscriptions haben.
sogar der sensor tuts.
Ist bei mir auch so.
Das war das letzte X-Mas Kalender Experiment für dieses Jahr. Nicht immer lief alles glatt, die Bauelemente passen teilweise nicht oder wackeln. Manchmal haben die genutzten Serverdienste lang gebraucht um die Daten zu senden. Manchaml war ein bisschen Raten, wie es geht, notwendig, so wie eben heute. Die Quellcodes haben auch Fragmente ungenutzten Codes drin, der beim Lesen und Nachvollziehen auffällt und erst einmal verwirrt. Eigentlich ein bisschen Schade für die Vorfreude auf, bzw. Freude an Weihnachten.
Ein Wunsch an den Weihnachtsmann, bzw. Autor; Wenn es 2017 noch einmal einen solchen Kalender gibt wäre es super die Schwachstellen auzubügeln und es passt mit der ungetrübten Vorfreude auf Weihnachten.
Weiß jemand warum die Programme zu Beginn mit WPA2 nicht funktionierten? Die letzten Programme die das Thema MQTT betraffen funktionierten Problemlos mit der WPA2 Verschlüsselung (auch WPA/WPA2 Mix). Kann mir das bis jetzt nicht erkläten.
Grüße,
Hans
Im Monitor War auch zu lesen,dass der Song und die Farbe changed wurde. Aber immer nur ein Lied und kein Leuchten.
Es gibt keine Erklärungen zu irgendwas, seit dem ersten Tag.
Aber diese „Anleitung“ ist einfach nur mehr Lächerlich.
Es gibt keine Erklärung zum Code, vor allem die Änderungen die noch zu machen sind, es sind auch sonst keine Erklärungen enthalten die auf das eigentliche Projekt eingehen.
Es sind einfach nur ein paar punkte die zum Projekt gehören quer aufgelistet, die zum Teil nicht Funktionieren z.B. der
„hivemq.com/try-out/“- Link Leitet mich zu MS-OneDrive.
Unter anderem sind die „fritzing“ Schaltpläne Fehlerhaft!!!(solltet ihr echt mal überprüfen(z.B. Tag 18 oder die Widerstände an den Verbraucher anpassen))
Bei solchen Produkten erwartet man eigentlich ein brauchbares
Tutorial.
Die Bauteile Rechtfertigen den Preis Jedenfalls nicht.
Auch ich hatte mir mehr Erklärungen erhofft und das zu Beginn auch geschrieben.
Aber das der Kalender sein Geld nicht Wert ist, finde ich etwas überzogen.
Versuch doch mal alle Bauteile des Kalenders einzeln zu kaufen, überlege dir 24 Experimente, entwickle den Code und die Schaltungen dazu, beschreibe die Experimente und dann sag mir was der Kalender kosten soll.
Wenn du das in einer besseren Qualität für weniger Geld schaffst, kaufe ich den nächsten Kalender bei dir :)
Ich habe mir schon mal die Mühe gemacht die Bauteile zu suchen.
http://iot.fkainka.de/forum/topic/bauteilliste-kalender-2016#post-1990
Ich weiß natürlich auch, dass es die Teile in großer Stückzahl in Asien günstiger gibt.
Aber die Entwicklung und das Testen der 24 Versuche kosten auch Zeit (=Geld). Außerdem würde keiner von uns den Aufwand aus reiner Menschlichkeit und Freude betreiben wenn er damit nicht etwas Geld verdienen könnte. Was ich für legitim halte. Ich glaube der Author wird sicher nicht Reich dadurch.
Obwohl ich die Qualität mancher Bauteile für Grenzwertig halte, kann man für den Preis nicht viel mehr erwarten.
Insgesamt hatte ich mir nicht nur mehr Erklärungen zu den Bauteilen und der Software erhofft/gewünscht, sondern auch mehr sinnvolle aufeinander aufbauende IOT Anwendungen oder zumindest wie teilweise beschrieben Ideen wofür das praxisrelevant eingesetzt werden kann.
Der Kalender wirkt leider ein bisschen zusammengewürfelt, es fehlt oft der rote Faden. An einem Tag werden Bauteile angesteckt oder Software hochgeladen, um sie am nächsten Tag komplett durch etwas anderes zu ersetzen und dann einige Tage später wieder zurück zu bauen. Es wird alle paar Tage was komplett anderes gemacht, angefangen bei dem WLAN, über die App (Blynk), den Webserver, den MQ Broker und am Ende steht man da mit einer IOT Geschenkbox als krönendem Abschluss? O.o
Das war für mich enttäuschend, weil ich bis zum Schluss gehofft hatte, dass es ein großes Ganzes wird.
Den nächsten Kalender werde ich vermutlich auch nicht mehr kaufen, weil der Mehrwert (Lerneffekt/Nutzen) bei diesem Kalender zu gering ist. Der Kalender beschränkt sich leider darauf Bauteile zu stecken, Code kopieren, hochladen, Fehler suchen und sich Fragen wie man das später in der Praxis tatsächlich einsetzen kann. Erinnert mich an Malen nach Zahlen. Das hängt sich auch keiner in die Wohnung.
Das mag noch ok sein für einen Adventskalender, wenn auf der Verpackung nicht stehen würde:
"Ganz nebenbei erwerben Sie auf spielerische Art nützliches Hardware- und Programmierwissen."
Das lässt sich sicher verargumentieren, aber was in Summe bleibt ist ein fader Beigeschmack. Ich könnte noch Stunden damit verbringen darüber zu schreiben was man an dem Kalender verbessern sollte, aber leider werde ich nicht dafür bezahlt.
Fazit:
We got what we paid for!
Weiterempfehlen kann ich ihn leider nicht mehr.
Ich kann mir gut vorstellen, dass der Autor vor ein paar Problemen stand: die (meisten?) Leute wollen mehr unterhalten werden, als lange Anleitungen lesen. Sie wollen ein schnelles Erfolgserlebnis und keine stundenlangen Versuche ausarbeiten (in der Adventszeit hat sowieso kaum einer Zeit) usw. Dann hat der eine schon Erfahrungen mit einem Arduino, der andere ist schon mit C überfordert, der nächste kennt alle Schaltungen aus dem Efef, der andere kann die Ringe der Widerstände nicht auswendig, ein Netzwerker ist auch nicht jeder uvm.
Für mich war der Kalender ein netter Einblick. Viel mehr habe ich eigentlich inhaltlich nicht erwartet (und hätte es zeitlich in der Adventszeit auch nicht aufbringen können). Die Ansatzpunkte kann ich nutzen, tiefer in die Materie einzusteigen.
Nur an der Qualität der Bauteile muss echt ein wenig gefeilt werden. 10 EUR mehr, aber dafür ein besseres Breadboard müssten drin sein.