Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

SMART CUBE:Eine neue Möglichkeit, Ihr Zuhause zu kontrollieren

Komponenten und Verbrauchsmaterialien

Arduino 101
× 1
LED (generisch)
1 blau - 1 gelb - 1 grün - 2 rot
× 5
Widerstand 221 Ohm
× 5
Breadboard (generisch)
Nicht obligatorisch
× 1
Seeed Base Shield V2
× 1
Seeed Grove LCD-RGB-Hintergrundbeleuchtung
× 1
Seeed Grove Schallsensor
× 1
Seeed Grove Summer
× 1
Seeed Grove-Temperatursensor
× 1
Tastatur
× 1
Jumper (generisch)
× 1
9-V-Batterie (generisch)
× 1
9-V-Batterieklemme
× 1
Mitteldichte Faser (MDF) 20x30 cm
3 mm MDF oder anderes Material zum Laserschneiden
× 1

Notwendige Werkzeuge und Maschinen

Laserschneider (generisch)
Lötkolben (generisch)

Apps und Onlinedienste

Arduino-IDE
Nordic Semiconductor nRF Connect SDK
Nicht obligatorisch

Über dieses Projekt

Was ist SMART CUBE?

Smart Cube ist ein Controller für Ihre Smart Home-Geräte.

Heutzutage wird die intelligentere Verwaltung aller Geräte in unseren Häusern zu einer Erfordernis . Wir brauchen etwas Einfaches und intuitiv benutzen. Smart Cube könnte eine Lösung sein:Es ist ein tragbares Gerät, das ein Arduino 101 enthält Board und einige Sensoren die mit den Geräten und Aktoren in Ihrem Smart Home kommunizieren.

Die Innovation dieser Fernbedienung hängt mit der Innovation des Arduino 101-Boards zusammen. Es verwendet Bluetooth (BLE) um Licht, Temperatur und Ihren Fernseher zu steuern und Sie können ihn auch mit Ihrem Smartphone synchronisieren . Aber die größte Neuerung ist die Art und Weise, wie Sie mit Smart Cube interagieren mit Ihrer Geste mit dem Gyroskop und dem Beschleunigungsmesser. Der Würfel hat 6 Gesichter und jede steuert eine bestimmte Funktion . Die gewünschte Funktion wird dank des Gyroskops erkannt, das das obere Gesicht erkennt. Zum Beispiel können Sie die Lichter des Raumes, in dem Sie sich befinden, öffnen, indem Sie den Würfel mit dem „Lichtgesicht“ in die obere Position positionieren . Wenn Sie das Licht ausschalten möchten, müssen Sie nur den Würfel schütteln.

Wenn ein Gesicht UP ist und es sich länger als 2 Sekunden nicht bewegt wird die entsprechende Funktion aktiviert. Diese Verspätung ist so konzipiert, dass Sie die Zeit haben, sich zu drehen und mit dem Würfel zu interagieren, um das gewünschte Gesicht zu finden ohne versehentlich andere Funktionen zu aktivieren. Wenn Sie den Würfel länger als 2 Sekunden schütteln, wird die zuletzt aktivierte Funktion geschlossen.

Dieses Projekt soll Ihnen helfen, einen intelligenten Controller zu bauen . Dieses Gerät benötigt einen Empfänger (intelligente Mittellinie im Bild), die die Daten interpretieren und verwalte die Funktionen Ihres Smart Homes. Die Hauptausgabe des Würfels ist ein BLE-Signal, das vielseitig verwendet werden kann:zum Beispiel können Sie den Würfel mit einer Smartphone-App verbinden (oder machen Sie Ihre eigenen), oder Sie können eine Station mit einem anderen Arduino bauen die die BLE-Daten sammelt und direkt die Geräte Ihres Hauses steuert. Aufgrund der Vielfalt der Fälle hängt dieser Teil von Ihren Anforderungen ab. In dieser Anleitung erfahren Sie, wie Sie einen Smart Cube erstellen und wie Sie ihn personalisieren.

Funktionen:

Die Struktur des Codes lässt sich leicht personalisieren (wir analysieren den Code später), damit Sie entscheiden können, welche Funktionen Sie steuern möchten. Dies sind die Funktionen, die ich steuern möchte:

LICHTER :Dieses Gesicht in UP positioniere die Lichter des Raumes, in dem Sie sich befinden. Beim Schütteln des Würfels gehen die Lichter aus und eine gelbe LED in diesem Gesicht wird aktiviert, damit Sie den Würfel in der Dunkelheit finden können. Die Kommunikation mit deinen Lampen wird durch die BLE des 101 Boards gemacht.

TEMPERATUR :Dieses Gesicht UP aktivieren (über BLE) die Klimaanlage wenn es heiß ist oder die Heizung wenn es kalt ist. Es erkennt die Temperatur mit einem Thermosensor und öffne eine blaue LED wenn die Spülung eingeschaltet ist (Schneeflocke) oder rot eine, wenn die Heizung aktiviert ist (Sonne).

TIMER :Dieses Gesicht UP Starten Sie einen Timer, den Sie auf dem LCD-Display sehen können. Es gibt einen Summer, der als Alarm funktioniert wenn der Countdown abgelaufen ist. Wenn Sie schütteln, stoppen Sie den Timer und Sie können die verbleibende Zeit sehen. Wenn der Countdown endet, wechselt die Farbe des LCD von Blau zu Rot und der Summer gibt drei Töne von sich.

Fernseher :Dieses Gesicht UP öffne den Fernseher. Der Würfel wird zur Fernbedienung für Ihren Fernseher. Es gibt ein Schaltflächenfeld mit Zahlen, die nur aktiviert werden, wenn dieses Gesicht OBEN ist, um versehentliche Berührungen zu vermeiden. Die Nummer, die Sie drücken, wird über BLE an den zentralen Controller gesendet, der mit Ihrem Fernseher verbunden ist. Durch Schütteln des Würfels schließen Sie den Fernseher.

TON :Dieses Gesicht UP Aktivieren Sie eine LED, deren Helligkeit auf dem Geräuschpegel des Raums basiert. Das Geräusch wird dank eines Schallsensors erkannt. Wenn Sie den Würfel schütteln, schließen Sie diese Funktion. (Wenn Sie möchten, können Sie Ihre persönliche Funktion aktivieren, indem Sie in die Hände klatschen).

AUS Gesicht:Wenn du den Würfel nicht schüttelst, ist dieses Gesicht wie eine neutrale Position an denen nichts geändert wird. Wenn Sie schließen möchten Alles positionieren Sie den Würfel mit der OFF-Seite nach OBEN und schütteln Sie ihn. Diese Geste ist wie die Home-Taste auf Ihrem Smartphone, die Sie drücken, wenn Sie schnell verlassen möchten. Es gibt eine rote LED damit du den Würfel finden kannst, wenn es dunkel ist.

Unterschiede zum Konzept:

Der ursprüngliche Plan war, auch IR-Kommunikation zu verwenden um Ihren Fernseher direkt mit dem Cube zu verbinden. Da der Arduino 101 (vorerst) die Bibliothek, die die IR-Signale verwaltet, nicht unterstützt, habe ich beschlossen, die Informationen über BLE an eine Station zu senden, die diese Bibliothek verwalten kann (wie Arduino UNO). Aufgrund dieses Problems habe ich die Radiofunktion entfernt (sehr ähnlich wie beim TV-Gesicht), indem es durch ein Tonsensor-Gesicht ersetzt wird. Dieses Gesicht könnte verwendet werden, um ein lautes Geräusch (wie Händeklatschen) zu erkennen, um etwas zu aktivieren. Die größte Änderung liegt im Material des Würfels. Anfangs dachte ich daran, es mit einem 3D-Drucker zu bauen aber dann habe ich mich für einen Laserschneider entschieden . Auf diese Weise ist es einfacher zu ersetzen ein Gesicht, wenn Sie eine Funktion ändern möchten. Sie können zum Beispiel das Timer-Gesicht entfernen und es durch ein Gesicht ersetzen, das den Napf Ihrer Katze automatisch füllt. modular sein Sie müssen nicht die gesamte Struktur neu aufbauen!

Lass es uns bauen:

Befolgen Sie diese Anweisungen, um Ihren eigenen Smart Cube zu erstellen. Wir beginnen mit der Hardware , Zusammenbau der Elektronik zuerst die Bauteile und dann der lasergeschnittene Würfelkörper aus MDF. Nach dieser Operation erkläre ich wie der Code funktioniert und wie Sie es personalisieren können . Nachdem Sie den Code auf Ihrem Arduino 101 hochgeladen haben, können Sie die App herunterladen um den BLE-Ausgang des Cubes zu sehen oder direkt mit deinem Smart Home zu verbinden!

Hardware - Elektronik:

Beginnen wir mit Ihrem Arduino 101. Dies ist das Fritzen zu befolgendes Schema:

Montieren Sie das Grove-Basisschild auf deinem Board und beginne mit den Verbindungen.

Tastatur :Sie müssen die Drähte an die Pins anschließen:10, 8, 7, 6, 5, 4, 2.

LED-Anschlüsse :

Zuerst müssen wir die LEDs vorbereiten:

- Verbinden Sie das lange Bein der LED (Anode) mit einem 220-Ohm-Widerstand und dann mit einem roten Draht (dies ist das Kabel, das an den Pin angeschlossen wird)

- Verbinden Sie das kurze Bein (Kathode) mit einem weißen Kabel (dieses geht an die Masse)

- Teile verlöten und mit Isolierband abdecken

- Verbinden Sie alle weißen Kabel mit einem einzigen weißen Kabel (dieses geht an die Masse) und löten Sie sie alle zusammen

Verbinden Sie nun die roten Drähte mit Ihrem Arduino:GRÜN führte zu Pin 9, GELB führte zu Pin 11, ROT führte zu Pin 12, BLAU führte zu Pin 13 und das letzte ROT zu Pin A2.

Grove-Sensoren :

Verbinden Sie die Groove-Sensoren mit der Abschirmung (siehe Schema auf den Anhängen).

Summer an D3, LCD RGB an I2C, Temperatursensor an A0, Soundsensor an A1.

Ok, jetzt haben wir alle elektrischen angeschlossen Teile. Jetzt brauchst du den Koffer .

Hardware - Box

Sie können die Skizze herunterladen des Würfels mit Laser zu schneiden. Die roten Linien in der Skizze sind die Symbole der Gesichter, einfach gravieren Ihnen. Die schwarzen Linien sollten abgeschnitten werden. Das Innenmaß des Würfels beträgt 9 cm . Die Skizze ist in Ordnung, wenn Sie ein 3-mm-Material verwenden , wenn Sie eine andere Dicke verwenden, sollten Sie diese ändern (Sie können diese Website verwenden:http://www.makercase.com/).

Als Material wähle ich MDF (Mitteldichte Faser), aber Sie können verwenden, was Sie wollen.

Hier einige Bilder vom Laserschnitt :

Jetzt müssen wir es zusammenbauen .

Ich habe geklebt einige Stücke Pappe, um die Dicke für die LED zu machen. Auf diese Weise werden sie an der Oberfläche ausgerichtet .

Jetzt montieren wir die Tastatur . Setzen Sie es in das Loch ein und entfernen Sie die Klebefolie, dann schließen Sie die Stifte wieder an.

Jetzt das RGB-LCD . Dies passte perfekt in das Loch.

Lassen Sie uns den Batterieanschluss vorbereiten :

Ich habe einen alten Trafostecker abgeschnitten und mit einem Batterieclip verbunden. Auf diese Weise sparen wir Platz in der Box.

An dieser Stelle sollten Sie das haben:

Jetzt müssen Sie nur noch die Batterie anschließen , Code hochladen und schließe den Würfel !

TIPP:Befestigen Sie die Platine und den Akku mit dem Gehäuse, damit sie beim Schütteln des Würfels stabil sind.

Code

Den Code finden Sie in den Anhängen . Laden Sie es mit der Arduino IDE in Ihr Board hoch (Denken Sie daran, Ihre Software für die Kompatibilität mit Arduino 101 zu aktualisieren).

Ich habe kommentiert fast jede Zeile des Codes, um es verständlicher zu machen, als ich kann. Haben Sie keine Angst vor den über 500 Zeilen, die Struktur ist nicht so kompliziert.

Am Anfang stehen die Bibliotheken und alle Variablen deklaration .

In diesem Teil gibt es auch die Definition von BLE Diensten und Eigenschaft . Ich habe Automation IO verwendet Service. Ich habe das Digitale verwendet Charakteristik für Licht und Temperatur (dies verwendet 2 Bit , also 4 mögliche Fälle zum Kodieren) und das Analog für TV (um alle Codes der Tastatur zu senden).

Dann die Einrichtung . Dieses Pat wird nur einmal ausgeführt am Anfang. Hier initialisieren wir die Komponenten als Ein- oder Ausgänge und initialisieren den BLE und den Kreisel des 101er Boards.

Der Hauptteil ist die Schleife . Es ist in vier Teile unterteilt:

  • 1 Der erste Teil wird aus dem Arduino-Website-Tutorial kopiert:(https://www.arduino.cc/en/Tutorial/Genuino101CurieIMUAccelerometerOrientation ) dieser Teil wird ständig ausgeführt und es gibt die Ausrichtung zurück des Vorstandes.
  • 2 Im zweiten Teil aktivieren wir ein Gesicht nur wenn es sich länger als zwei Sekunden in der oben Position befindet . Wir verwenden die Millis Funktion zum Zählen der Zeit. Wenn sich die Position ändert, wird der Millisekundenwert gespeichert und wenn die Ausrichtung gleich bleibt, treten wir nach einem Intervall (2 Sek.) in eine Wenn-Zone ein, in der die ausgewählte Fläche wahr wurde (für den 4. Teil).
  • 3 Der dritte Teil wird nur aktiviert, wenn der Würfel geschüttelt wird mit einer bestimmten Intensität und für mehr als 2 Sekunden. Die zuletzt aktivierte Gesichtsfunktion ist geschlossen und das Gesicht wird als falsch festgelegt . Wenn das Gesicht falsch ist, kann der vierte Teil nicht eingegeben werden.
  • 4 Der vierte Teil ist nur für wahr Gesichter. Hier liegt der Kern der Funktionen des Smart Cube. In diesem Teil werden ständig nur die Gesichter ausgeführt, die in der Schleife wahr sind.

Sie können ändern das Gesicht funktioniert mit einigen Modifikationen des Codes. Die Hauptstruktur sollte wie beschrieben sein. Sie können den Teil innerhalb der if-Bedingungen ändern jedes Gesichtes.

if (face2 ==true) {// TEMPERATURE face // STARTEN SIE HIER ÄNDERN digitalWrite (LEDOFF, LOW); // wenn dieses Gesicht wahr ist, ist die AUS-Gesichts-LED LOW if (central.connected() ==true) {// wenn der Würfel BLE-verbunden ist // Temperaturwert lesen Int val =analogRead (pinTemp); // Analogwertwiderstand abrufen =(float) (1023-val) * 10000 / val; // Widerstandstemperatur abrufen =1 / (log (Widerstand / 10000) / B + 1 / 298,15)-273,15; // Temperatur berechnen // Aktivierungsbedingungen if (Temperatur> tooHot) {// Klimaanlage aktivieren digitalWrite (LEDhot, LOW); // Heizungs-LED schließen DigitalWrite (LEDcold, HIGH); // offene Klimaanlage führte termoChar.setValue (1); // über BLE die Bedingung 1 setzen =kalt an - heiß aus} if (temperatur  tooCold &&temperature  

Sie müssen den "wahren" Teil (wie im vorherigen Code) und auch den "falschen" Teil codieren, wenn der Würfel geschüttelt wird:

// TEMPERATURE Deaktivierung if (lastFUNCTION ==2) { // TEMPERATURE face //START CHANGING HERE // wenn eine Zentrale mit einer Peripherie verbunden ist:if (central.connected() ==true) { digitalWrite (LEDheiß, NIEDRIG); // Temperatur schließen rote LED DigitalWrite (LEDcold, LOW); // Temperatur blaue LED schließen termoChar.setValue (0); // Temperatur BLE-Signal:0 =kalt aus - heiß aus // ENDE HIER} Serial.println ("TEMPERATURE false - CLOSE"); Gesicht2 =falsch; // TEMPERATURE-Gesicht wurde falsch } 

Denken Sie daran, das Gesicht als falsch zu setzen wenn du es schüttelst.

App:

Um die BLE-Ausgaben des Cubes zu sehen, können Sie herunterladen diese App:nRF Connect

https://play.google.com/store/apps/details?id=no.nordicsemi.android.mcp&hl=it

Wenn Sie es öffnen, einfach suchen für Geräte und verbinden mit "smartcubesketch". Dann sehen Sie drei Registerkarten "Automation IO", klicken Sie darauf und drücken Sie den Continuous Data Collector.

Es ist wichtig, den Cube anzuschließen, da einige Funktionen (Licht, Temperatur und TV) nur ausgeführt werden, wenn der Cube angeschlossen ist.

So funktioniert es:VIDEO

Laden Sie den Code hoch, legen Sie die Batterie ein, schließen Sie die Box und...

...jetzt haben Sie einen SMART CUBE!

Ich habe ein Video gemacht, um dir alle Funktionen des Würfels und seine Verwendung zu zeigen.

Schlussfolgerungen

Dieses Projekt ist nur der erste Schritt zu einem intelligenten Zuhause. Mein Ziel war es, den Arduino 101 . zu verwenden Board-Potenzial, etwas Neues zu schaffen . Ich denke, dass der Beschleunigungsmesser und Gyroskop geben dem Vorstand neue Möglichkeiten in Sachen Mobilität. Mit der BLE ist nicht nur tragbar, sondern auch leicht zu anzuschließen .

Dies ist das erste Mal, dass ich eines meiner Projekte konkret realisiere (ich meine mit einem funktionierenden Prototyp). Es war hart und es gab einige Schwierigkeiten auf der Strecke, aber am Ende habe ich viel gelernt und bin mit dem Ergebnis zufrieden. Ich hoffe, dass auch jeder, der diesen Leitfaden gelesen hat, etwas von meiner Arbeit lernen und dieses Projekt auch an seine Bedürfnisse anpassen konnte . Es tut mir leid für mein schlechtes Englisch, aber ich hoffe, dass die Bilder dir helfen konnten.

In der Zukunft von diesem Projekt erwarte ich die Zentrallinie das ist wie die brücke zwischen dem smart cube und den aktoren (licht, temperatur, fernseher...). Diese Zentrale empfängt das BLE-Signal vom Würfel und verwendet diese Informationen, um intelligente Dinge in Ihrem Zuhause zu tun.

Ich freue mich sehr, die Möglichkeit zu haben, Arduino 101 zu verwenden und das Grove-Kit (das Kit ist sehr einfach und schnell für das Prototyping).

Ich hoffe, dass die Verwendung des Boards auf diese Weise eine Inspiration sein könnte für Ihr Projekt. Sie können es nach Belieben personalisieren :Ich bin gespannt, welche Funktionen Sie erstellen und in welchem ​​Kontext Sie sie einsetzen werden!

Vielleicht ist dies keine Revolution, aber es ist eine neue Art, mit Ihrem Zuhause zu interagieren .

Ich hoffe, Ihnen gefällt dieses Tutorial.

Jetzt sind Sie an der Reihe :Legen Sie Ihre Hände auf den Würfel und hacken Sie ihn!

Code

  • SMART CUBE - kompletter Code mit Kommentaren
SMART CUBE - kompletter Code mit KommentarenArduino
Dies ist der Code zum Hochladen auf Ihren Arduino 101. Sie können diesen Code unverändert verwenden oder an Ihre Bedürfnisse anpassen. Folgen Sie den Kommentaren, um zu verstehen, wie es funktioniert.
// Bibliotheken#include "CurieIMU.h" // Beschleunigungsmesser und Gyroskop#include  // Bluetooth Low Energy#include #include "rgb_lcd .h" // LCD#include  // Keypadrgb_lcd lcd; // LCD-Initialisierung // Bluetooth-Initialisierung:BLEPeripheral blePeripheral; // BLE-Peripheriegerät (die Platine, die Sie programmieren) // BLE ServicesBLEService lightsService("1815"); // BLE Automation IO (1815) - LichtinformationenBLEService termoService("1815"); // BLE Automation IO - TemperaturinformationenBLEService TVService("1815"); // BLE Automation IO - TV-Informationen // BLE-CharakteristikBLEUnsignedCharCharacteristic LichterChar("2A56", // BLE-Charakteristik Digital (2A56) - Lichter BLERead | BLENotify);BLEUnsignedCharacteristic termoChar("2A56", // BLE-Charakteristik Digital - Temperatur BLERead | BLENotify );BLEUnsignedCharCharacteristic TVChar("2A58", // BLE-Charakteristik Analog (2A58) - tv BLERead | BLENotify);// Konstanten- und Variablendeklaration:// Face-Orientierung und Shake-Funktionen:int lastOrientation =- 1; // vorherige Orientierung (zum Vergleich)unsigned long previousMillis =0; // letztes Mal updateunsigned langes Intervall =2000; // Wartezeit in der oberen Position vor der Gesichtsaktivierungunsigned long SHAKE previousMillis =0; // letztes Mal updateunsigned long SHAKEinterval =2000; // Wartezeit während des Schüttelns auf Gesichtsdeaktivierungboolean keep =false; // Dies wird verwendet, um nur einmal die Änderung der Gesichtsausrichtung zu zählenint lastFUNCTION =-1; // Dies wird verwendet, um zu wissen, was die vorherige Ausrichtung ist// Faces-Initialisierung:am Anfang ist jedes Gesicht falseboolean face0 =false;boolean face1 =false;boolean face2 =false;boolean face3 =false;boolean face4 =false;boolean face5 =false; // LIGHTS faceconst int LEDlights =11; // Pin 11:gelbe LED // TEMPERATURE faceconst int pinTemp =A0; // Pin A0:Temperatursensorconst int LEDhot =12; // Pin 12:rote LEDconst int LEDcold =13; // Pin 13:blaue LEDfloat-Temperatur; // Temperaturwertspeicherungint B=3975; // B-Wert des Thermistorfloat-Widerstands; // Widerstandswert memorizationfloat tooHot =26.0; // Temperatur, bei der die Klimaanlage aktiviert wird [SET]float tooCold =23.0; // Temperatur, bei der die Heizung aktiviert wird [SET] // TIMER faceint BUZZER =3; // Pin 3:Buzzerboolean KEEPtime =false; // Dies wird verwendet, um nur einmal die Änderung der Gesichtsausrichtung zu zählen (kein Neustart während des Zählens)int TIMERmillis =0; // die folgenden sind für die Countdown-Bestimmungint prevSHOWsecond =0;int CountdownInMillis =0;int SHOWmillis =0; // Millis-Wert-Berechnung resultint SHOWminute =0; // Minutenwert zur Anzeige im Monitor für den Countdownint SHOWseconds =0; // Sekundenwert, der im Monitor für den Countdown angezeigt werden sollconst int SETminute =2; // 2-Minuten-Timer einstellen [SET] const int SETsecond =30; // 30 Sekunden Timer einstellen [SET] // SOUND faceconst int soundLED =9; // Pin 9:grüne LED const int soundSENSOR =A1; // Pin A0:Tonsensorint Helligkeit =0; // grüne LED-Helligkeitsinitialisierung // TV faceconst Byte ROWS =4; // vier Zeilen Keypadconst Byte COLS =3; // dreispaltige Tastenfeldtasten[ROWS][COLS] ={ {'1','2','3'}, {'4','5','6'}, {'7','8' ,'9'}, {'*','0','#'}}; // Tastenfeld-Wertebyte rowPins[ROWS] ={10,8,7,6}; // Pin 10,8,7,6:mit den Zeilen-Pinbelegungen des Keypadbyte verbinden colPins[COLS] ={5,4,2}; // Pin 5,4,2:Verbinden Sie sich mit den Spaltenpinbelegungen der TastaturKeypad keyboard =Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS); // Initialisierung der Tastatur // OFF faceconst int LEDOFF =A2; // Pin A2:rotes ledvoid setup () {pinMode (LEDlights, OUTPUT); // jede LED wird als Ausgang gesetzt pinMode (LEDhot, OUTPUT); pinMode (LEDkalt, AUSGANG); PinMode (SoundLED, AUSGANG); pinMode (LEDOFF, AUSGANG); Serial.begin (9600); // Serielle Kommunikation initialisieren CountdownInMillis =(SETminute * 60 + SETsecond) * 1000; // dies berechnet den entsprechenden Wert in Millis aus der Minuten- und Sekundeneinstellung lcd.begin(16, 2); // LCD-Initialisierung lcd.setRGB (0, 0, 0); // LCD RGB ist am Anfang AUS // Gerät initialisieren Serial.println ( "IMU-Gerät wird initialisiert ..."); CurieIMU.begin(); // Setzen Sie den Beschleunigungsmesserbereich auf 2G CurieIMU.setAccelerometerRange (2); // Schockerkennung aktivieren CurieIMU.setDetectionThreshold(CURIE_IMU_SHOCK, 7000); // 7.0g =7000 mg (dieser Wert stellt die Intensität des Schocks ein) CurieIMU.setDetectionDuration(CURIE_IMU_SHOCK, 2000); // 2000ms (dieser Wert stellt die Dauer des Schocks ein) CurieIMU.interrupts(CURIE_IMU_SHOCK); // BLE-Setup-Initialisierung blePeripheral.setLocalName("SmartCubeSketch"); // der Name des Projekts blePeripheral.setAdvertisedServiceUuid(lightsService.uuid()); // füge die Lichterdienst-UUID hinzu blePeripheral.addAttribute(lightsService); // fügen Sie den BLE-Lichterdienst hinzu blePeripheral.addAttribute(lightsChar); // füge die BLE-Lichtereigenschaft hinzu lightsChar.setValue (3); // Initialwert für dieses Merkmal =3 //BLE Lichtwert Bedeutung:0 =Licht aus, 1 =Licht an, 3 =Ausgangszustand, 4 =nicht verwendet blePeripheral.setAdvertisedServiceUuid(termoService.uuid()); // füge die Temperaturdienst-UUID hinzu blePeripheral.addAttribute(termoService); // den BLE-Temperaturdienst hinzufügen blePeripheral.addAttribute(termoChar); // füge die BLE-Temperaturkennlinie hinzu termoChar.setValue(0); // Anfangswert ist 0:kalt aus - heiß aus // BLE-Termowert Bedeutung:0 =kalt aus - heiß aus, 1 =kalt an - heiß aus, 2 =kalt aus - heiß an, 3 =nicht verwendet blePeripheral.setAdvertisedServiceUuid (TVService.uuid()); // füge die TV-Dienst-UUID hinzu blePeripheral.addAttribute(TVService); // den BLE-TV-Dienst hinzufügen blePeripheral.addAttribute(TVChar); // füge die TV-Eigenschaft hinzu TVChar.setValue('x'); // Initialwert für dieses Merkmal (x bedeutet nichts) //BLE TV-Wert Bedeutung:#Nummer entspricht der gedrückten Taste, C:TV schließen, O:TV öffnen, x:Anfangszustand blePeripheral.begin(); Serial.println ( "Bluetooth-Gerät aktiv, wartet auf Verbindungen ..."); } // Endvoid-Schleife einrichten () {BLECentral central =blePeripheral.central (); // BLE-Verbindung unsigned long currentMillis =millis(); // aktueller Zeitwert in Millisekunden // der folgende Code stammt von www.arduino.cc/en/Tutorial/Genuino101CurieIMUccelerometerOrientation // wird verwendet, um die Ausrichtung der Platine zu erkennen int orientierung =- 1; // die Ausrichtung des Boards String AusrichtungString; // String zum Drucken der Orientierungsbeschreibung // Beschleunigungsmesser lesen:int x =CurieIMU.readAccelerometer(X_AXIS); int y =CurieIMU.readAccelerometer(Y_AXIS); int z =CurieIMU.readAccelerometer(Z_AXIS); // Berechne die absoluten Werte, um den größten zu bestimmen int absX =abs(x); int absY =abs(y); int absZ =abs(z); if ( (absZ> absX) &&(absZ> absY)) { // Basisorientierung auf Z if (z> 0) {orientString ="up"; Orientierung =0; } Else { OrientierungString ="unten"; Ausrichtung =1; } } Else if ((absY> absX) &&(absY> absZ)) {// Basisorientierung auf Y if (y> 0) {orientationString ="digitale Pins up"; Ausrichtung =2; aufrechtzuerhalten. } else { orientierungString ="analoge Pins hoch"; Ausrichtung =3; } } else { // Basisorientierung auf X if (x <0) {orientString ="connector up"; Ausrichtung =4; } Else { OrientierungString ="Anschluss unten"; Ausrichtung =5; } } // Ende des Tutorial-Codes. // at this point you have the orientation value of the board constantly updated:/* The orientations of the board:0:flat, processor facing up (TIMER) 1:flat, processor facing down (TV) 2:landscape, analog pins down (TEMPERATURE) 3:landscape, analog pins up (OFF) 4:portrait, USB connector up (LIGHTS) 5:portrait, USB connector down (SOUND) */ // for this project you need to know if the face has changed from the previous face function [lastFUNCTION !=orientation] // but this information is printed only if the face is in the UP position for more than [interval] time // and only for one time [keep] (you don't nedd to constantly activate the face, you just need it one time) // because the orientation value is constantly updated you need to start counting time when the orientation change [orientation !=lastOrientation] if (orientation !=lastOrientation) { // if the orientation has changed, start to count time lastOrientation =orientation; // memorize the current orientation of the face previousMillis =currentMillis; // memorize the time when the face has changed keep =false; } else if (currentMillis - previousMillis> interval &&keep ==false &&lastFUNCTION !=orientation) { //this condition print the orientation only if the face is up for an interval //and only for one time (keep) //and only if the face is different from the previous loop Serial.println(orientationString); // print the orientation // the current face [orientation] is set as true (that means that the face function is set as activated) if (orientation ==1) { // TV face face1 =true; // TV face becomes true lastFUNCTION =orientation; // memorize this activation in [lastFUNCTION] Serial.println("TV true"); // print the activated face TVChar.setValue('O'); // O:open the tv signal (BLE):tv is open only one time } if (orientation ==4) { // LIGHTS face face4 =true; lastFUNCTION =orientation; Serial.println("LIGHTS true"); } if (orientation ==3) { // OFF face face3 =true; lastFUNCTION =orientation; Serial.println("OFF true"); } if (orientation ==5) { // SOUND face face5 =true; lastFUNCTION =orientation; Serial.println("SOUND true"); } if (orientation ==2) { // TEMPERATURE face face2 =true; lastFUNCTION =orientation; Serial.println("TEMPERATURE true"); } if (orientation ==0) { // TIMER face face0 =true; lastFUNCTION =orientation; Serial.println("TIMER true"); if (KEEPtime ==false) { // timer is activated only if it is the 1st cycle or has been stopped TIMERmillis =currentMillis; // start counting time } } keep =true; // [keep] change value so that, in the next loop, you can't enter in this condition if the face don't change (avoid to activate another time the same face) } // this condition is for the shake function:if you shake for more than [SHAKEinterval] time, the face is deactivated if (CurieIMU.getInterruptStatus(CURIE_IMU_SHOCK) &¤tMillis - SHAKEpreviousMillis> SHAKEinterval) { Serial.println("SHAKE"); // print "SHAKE" if shake is detected // the last activated face [lastFUNCTION] is set as false (that means that the face function is deactivated) //TV deactivation if (lastFUNCTION ==1) { // TV face TVChar.setValue('C'); // C:close the tv BLE signal Serial.println("TV false - CLOSE"); // print the closed face face1 =false; // TV face becomes false } //LIGHTS deactivation if (lastFUNCTION ==4) { // LIGHTS face if (central.connected() ==true) { // if a central is connected to peripheral:lightsChar.setValue(0); // lights OFF BLE signal digitalWrite (LEDlights, HIGH); // open the yellow led to see the cube in the dark } Serial.println("LIGHTS false - CLOSE"); face4 =false; // LIGHTS face become false } // OFF if (lastFUNCTION ==3) { // OFF face // OFF face shaked:everything is closed and red led OFF is open digitalWrite (LEDOFF, HIGH); // red led OFF is on when cube is closed // now close all the activated functions:// CLOSE TV TVChar.setValue('C'); // C:close the tv BLE signal Serial.println("TV false - CLOSE"); face1 =false; // CLOSE LIGHTS Serial.println("LIGHTS false - CLOSE"); if (central.connected() ==true) { lightsChar.setValue(0); digitalWrite (LEDlights, LOW); // lights led is closed if OFF face is shaked } face4 =false; // CLOSE SOUND analogWrite(soundLED, LOW); // close the sound led Serial.println("SOUND false - CLOSE"); face5 =false; //CLOSE TEMPERATURE if (central.connected() ==true) { digitalWrite(LEDhot, LOW); digitalWrite(LEDcold, LOW); termoChar.setValue(0); // temperature BLE signal:0 =cold off - hot off } Serial.println("TEMPERATURE false - CLOSE"); face2 =false; // CLOSE TIMER Serial.println("TIMER false - CLOSE"); lcd.setRGB(0, 0, 0); // the LCD RGB is closed lcd.clear(); KEEPtime =false; face0 =false; // The cube is inactive, only OFF led is active Serial.println("OFF false - CLOSE"); face3 =false; // OFF face becomes false } // SOUND deactivation if (lastFUNCTION ==5) { // SOUND face analogWrite(soundLED, LOW); // close the sound led Serial.println("SOUND false - CLOSE"); face5 =false; // SOUND face becomes false } // TEMPERATURE deactivation if (lastFUNCTION ==2) { // TEMPERATURE face // if a central is connected to peripheral:if (central.connected() ==true) { digitalWrite(LEDhot, LOW); // close temperature red led digitalWrite(LEDcold, LOW); // close temperature blue led termoChar.setValue(0); // temperature BLE signal:0 =cold off - hot off } Serial.println("TEMPERATURE false - CLOSE"); face2 =false; // TEMPERATURE face became false } // TIMER deactivation if (lastFUNCTION ==0) { // TIMER face Serial.println("TIMER false - CLOSE"); face0 =false; // TIMER face became false // if you shake the cube when the time is running, the LCD became red and show the remaining time to countdown lcd.setRGB(180, 40, 0); // the RGB backlight become red lcd.clear(); // lcd is cleared lcd.setCursor(0, 0); lcd.print("STOP AT "); lcd.setCursor(8, 0); lcd.print(SHOWminute); // indicates the minutes when you shake the cube lcd.setCursor(9, 0); lcd.print(":"); lcd.setCursor(10, 0); lcd.print(SHOWseconds); // indicates the seconds when you shake the cube tone(BUZZER,1000,1000); // it make a short sound delay(2000); lcd.clear(); // clear the LCD lcd.setRGB(0, 0, 0); // LCD RGB backlight is closed KEEPtime =false; // TIMER face became false } SHAKEpreviousMillis =currentMillis; // memorize the value for the [SHAKEinterval] calculation } // the following instructions are executed in loop only if the face is activated if (face1 ==true) { // TV face digitalWrite (LEDOFF, LOW); // if this face is true the OFF face led is LOW if (central.connected() ==true) { // if the cube is BLE connected char key =keypad.getKey(); // read the value from the keypad if (key &&orientation ==1){ // if something is pressed and only when the tv face is up (avoid involuntary keypad pression) if (key =='0') { // if the pressed key is 0 TVChar.setValue(key); // send the [key] value via BLE Serial.println(key); // print the pressed button (comment if you don't want to show this information) } if (key =='1'){ TVChar.setValue(key); Serial.println(key); } if (key =='2'){ TVChar.setValue(key); Serial.println(key); } if (key =='3'){ TVChar.setValue(key); Serial.println(key); } if (key =='4'){ TVChar.setValue(key); Serial.println(key); } if (key =='5'){ TVChar.setValue(key); Serial.println(key); } if (key =='6'){ TVChar.setValue(key); Serial.println(key); } if (key =='7'){ TVChar.setValue(key); Serial.println(key); } if (key =='8'){ TVChar.setValue(key); Serial.println(key); } if (key =='9'){ TVChar.setValue(key); Serial.println(key); } if (key =='*'){ TVChar.setValue(key); Serial.println(key); } if (key =='#'){ TVChar.setValue(key); Serial.println(key); } } } } if (face4 ==true) { // LIGHTS face digitalWrite (LEDOFF, LOW); // if this face is true the OFF face led is LOW if (central.connected() ==true) { // if a central is connected to peripheral:lightsChar.setValue(1); // LIGHTS activated BLE signal digitalWrite (LEDlights, LOW); // yellow led is closed because the home lights are on } } if (face3 ==true) { // OFF face // when OFF face is up nothing is done digitalWrite (LEDOFF, LOW); // led OFF is activated only when the cube is shaked, so now is LOW } if (face5 ==true) { // SOUND face digitalWrite (LEDOFF, LOW); // if this face is true the OFF face led is LOW // sound sensor is activated, led brightness regulated by the sond // this code comes from brightness regulation example long sum =0; for (int i=0; i<32; i++) { sum +=analogRead(soundSENSOR); } sum>>=5; brightness =(sum*255)/1024; // calculate the brightness value analogWrite(soundLED,brightness); // green led brightness intensity is regulated by the noise delay(50); //end brightness example } if (face2 ==true) { // TEMPERATURE face digitalWrite (LEDOFF, LOW); // if this face is true the OFF face led is LOW if (central.connected() ==true) { // if the cube is BLE connected // read temperature value int val =analogRead(pinTemp); // get analog value resistance=(float)(1023-val)*10000/val; // get resistance temperature=1/(log(resistance/10000)/B+1/298.15)-273.15; // calculate temperature //conditions of activation if (temperature> tooHot) { // activate air conditioning digitalWrite(LEDhot, LOW); // close heating led digitalWrite(LEDcold, HIGH); // open air conditioner led termoChar.setValue(1); // set via BLE the condition 1 =cold on - hot off } if (temperature  tooCold &&temperature  

Kundenspezifische Teile und Gehäuse

This is the file (.dxf) that you can upload on your laser cutter. I used a medium density fiberboard (MDF) of 3mm. Cut the black lines and engrave red lines. Important:if your material thickness is different you have to modify this sketch. smart_cube_8sVCflFmhM.dxfThe same file of the box but in a different format:.pdf

Schaltpläne

This is a .jpeg of the Fritzing scheme (yellow wires are connected to Grove components) This is a scheme of the connections in the Grove Shield _cI0IwUsPVZ.Base%20shield%20connections

Herstellungsprozess

  1. Warum Sonnenkollektoren eine intelligente Investition für Ihr Zuhause sind
  2. Go Big oder Go Home mit Ihrem neuen Produktdesign
  3. Anwendungen der Heimautomatisierung
  4. Aufbau eines drahtlosen Sensornetzwerks in Ihrem Zuhause
  5. Überwachen Sie Ihre Haustemperatur mit Ihrem Raspberry Pi
  6. Die Kompetenzlücke im Smart Home
  7. Machen Sie sich schlau:Die Zukunft Ihres Zuhauses
  8. Smart Security:So schützen Sie Ihre Smart Home-Geräte vor Hackern
  9. Möglichkeiten zur Verbesserung der Sicherheit Ihres Smart Home
  10. Smart Plant IoT