IPO-TRONICS SMART LIGHTING

Arduino extersize

Recreating a product in CAD from just some photographs is a great way for me to improve my CAD skills.

It has become a bit of an art form for me to make photorealistic product visualizations from CAD models.

March 2015

BLOG  –  Ian van Mourik

20  –  2  –  15

De opdracht

Untitled-3

Voor IPOtronics ga ik Smart Lighting Concept maken wat geïntegreerd kan worden in bijvoorbeeld een lantaarn paal of andere openbare verlichting. Het doel van de opdracht is om kennis te maken met de Arduino Grove kit en het programmeren met behulp van de Arduino software.

Een persoonlijke doelstelling was om zoveel mogelijk sensoren te gebruiken. En om ook verder te denken wat er nog meer mogelijk is met sensoren met mogelijke toepassingen op een grotere schaal. Dit valt samen met het vooronderzoek voor De Light challenge 2015 waar ik samen met Kevin, Olivier en Michel een nieuw verlichtingsconcept voor de binnenstad ga ontwerpen.

27  –  2  –  15

Getting started

Om mijn geheugen weer een beetje op te frissen ben ik eerst bezig geweest met het begrijpen van de logica achter de example codes die te vinden zijn binnen de Arduino software. Voor het keuze vak FABLAB heb ik een licht gevende stuiterbal gemaakt. Het prototype wat ik toen had gemaakt heb ik weer aangesloten en de documentatie van mezelf weer bestudeerd.

Nu ik het weer een beetje begrijp ben ik gaan spelen met verschillende sensoren en vooral de RGB-LCD unit die bij de grove kit zit. Hiermee kan niet alleen tekst weergegeven worden maar ook de kleur kan aangepast worden. Met de sensoren heb ik geoefend hoe ik het LCD scherm kan aansturen.

Hiervoor heb ik de volgende Links gebruikt om de problemen die ik tegen kwam op te lossen:

 

http://arduino.cc/en/reference/homePage

http://playground.arduino.cc/uploads/Main/arduino_notebook_v1-1.pdf

http://www.seeedstudio.com/wiki/index.php?title=Main_Page – Learning

https://github.com/Seeed-Studio/Grove_LCD_RGB_Backlight

http://www.rapidtables.com/web/color/RGB_Color.htm

6  –  3  –  15

Some

Copy ⇒ Paste

Druk gevoelige stoep

Met de Touch sensor display dimmen:

Het idee acht het concept is dat als iemand bijvoorbeeld over de stoep loopt dat tijdelijk de verlichting feller val gaan branden. Dit boots ik na door de Touch sensor te gebruiken als “stoep” en de back light van het LCD scherm te gebruiken als “larenpaal”.

Wanneer er niemand op de stoep loopt brand de back light op 25% en als er iemand op de stoep loopt brand de back light op 100% voor 3 seconde

view druk gevoelige stoep code

Temperature Light

Kleuren weergeven met betrekking tot de temperatuur:

Ben erachter gekomen dat met de temperatuur sensors een soort omreken code nodig is om de temperatuur om te zetten in graden Celsius. Voorbeelden vond ik hier:

http://www.instructables.com/id/Arduino-LCD-Thermostat/

https://gist.github.com/thedod/d38456f66a7254422041

https://github.com/Seeed-Studio/Grove_Temperature_Sensor

http://www.sodaq.net/#!7grovetempsensorandoleddisplay/cmzc

In deze links staat uitgelecht hoe je via de temperatuur sensor van de grove kit om te zetten in graden Celsius en deze waarde weer te geven op het display.

De kleuren die je in kan stellen doormiddel van RGB codes zijn hier te vinden:

http://blog.oscarliang.net/rgb-led-with-arduino/

http://www.rapidtables.com/web/color/RGB_Color.htm

Vervolgens heb ik met alle informatie 2 codes gemaakt

 

Waarbij in 2 stappen te zien is op het op dat moment opwarmt of afkoelt. Roze voor een beetje opwarmen, rood als het snel opwarmt. En het zelfde met licht blauw en donkerblauw als het afkoelt.

view opwarmen en afkoelen code

 

En een code waarbij met de kleur te zien is welke temperatuur het is. Bij 10 graden is het scherm blauw. En bij 30 graden is het scherm rood met een verloop aan kleuren ertussen.

view kleur en temperatuur code

Geluidsoverlast

Met een microfoon wordt het geluidsniveau gemeten. Als een niveau overschreden word dar gaat er een alarm. Het scherm kleurt rood en er wordt en melding weergegeven.

 

view geluidsoverlast code

13  –  3  –  15

Enough playing around

Het Concept

Het concept wat moet zo goed als alle componenten die in de grove kit zitten benutten. Al deze componenten komen samen in een lantarenpaal die slim en interactief moet worden.

Hiervoor ga ik gebruik maken van:

  1. Arduino UNO + grove shield
  2. Temperatuur sensor
  3. Microfoon
  4. Lux sensor
  5. Angle sensor
  6. Touch sensor
  7. Relais
  8. 9 volt LED lamp
  9. Servo
  10. RGB-LCD screen
  11. Een miniatuur lantaarnpaal
  12. En een systeempje waarmee de LED lamp gedimd kan worden met de servo en een klepje
Wat wil ik bereiken (PVE)

  • Op het scherm moet de temperatuur weergegeven worden
  • Op het scherm moet good morging in de ochtend staan
  • Op het scherm moet good night staan als het donker is
  • Als het opwarmt of afkoelt moet het scherm rood of blauw kleuren
  • Als een geluidsniveau overschreden word kleurt het scherm rood en er wordt een melding op het scherm weergegeven
  • Als het donker wordt moet het relais met de 9 volt LED lamp aan gaan
  • Als het donder is en er loopt iemand op straat dan moet het LCD scherm oplichten en moet de servo de klep voor de LED lamp weg draaien
  • Naarmate het donkerder word moet de servo verder open draaien
  • Overdag moet de servo dicht staan
  • Als het donker is moet het licht en de kleuren van het LCD scherm gedimd zijn.
  • Als er geluidsoverlast is moet het scherm rood kleuren en moet er een melding weergegeven worden
  • Met de angle sensor moet s ’nachts zelf een lichtniveau in te stellen zijn door de servo te draaien.

FLow chart

Set up

20  –  3  –  15

Coding….

Werkende code (concept)

Het is me gelukt om een werkende code te bouwen waarbij alle sensoren een nut hebben. het bestaat voor het grootse deel nog uit knip en plak werk van de vorige codes waarbij is de rest aan heb gevuld.

Het is nog een concept code en alle bugs zijn er nog niet uitgehaald. Voor het grootste deel doet de code wat in de flowchart staat maar ik wil nog wel verder gaan dan dat om alles te verfijnen en mooier in elkaar over te laten lopen.

Achter elke regel in de code heb ik bijgehouden wat alles is en doet, zo maak ik het voor mezelf overzichtelijk en voor anderen beter te begrijpen.

 

view concept code uber sensor lamp

27  –  3  –  15

Prototyping….

Het lantaarnpaaltje

Het lantaarn paaltje wat ik van CityTec heb gekregen is een mooi begin om een slimme lantaarnpaal van te maken. Stap 1 is om het lantaarnpaaltje helemaal uitelkaar te halen om te kijken wat erin zit: een 9volt batterij, een knop, een led-module en wat draden.

Stap 2 is om de led module te repareren wand ik kon natuurlijk het niet laten om de boel te slopen om het los te krijgen.

Stap 3 is om te bedenken hoe ik de servo aan de paal wil bevestigen en hoe de servo met een klepje de led-module moet gaan bedekken.  Hoe het precies uit moet zien weer ik nog niet maar ik heb wel alvast 1 poot die de kap van de lantaarn paal ondersteund eraf gezaagd. Om het ontwerp wat makkelijker te maken.

3D prints

Voor het monteren van monteren van de servo heb ik een houder uitgeprint die om de paal heen komt. Deze houder klemt op precies op de goede hoogte vast aan de paal. In deze houder zit een uitsparing waar de servo in past die vervolgens door een stel klikvingertjes op zijn plek gehouden word.

Om de led-module te bedekken heb ik een soort waaier bedacht. Deze kan omdat ik 1 steunpootje eraf had gezaagd van de LED’s helemaal bedekken tot helemaal open draaien. De waaier zit door de frictie en de strakke tolerantie vast aan de servo.

Debugging....

29  –  3  –  15

The final design

Design voor presentatie

Voor de eindpresentatie ga ik een opstelling maken waarbij alle componenten op een houten plaat bevestigd worden. Op deze plaat is ook gelijk een flowchart te zien hoe alle signalen lopen en wat de sensoren meten. En aan de zijkant staat een basis omschrijving van wat er gebeurd in de code.

Hieronder is het laser bestand te zien wat ik op het Stadslab kan gaan maken.

 

Code updates

sinds de laatste code update heb ik veel aan de code gesleuteld om alle bugs eruit te halen en en alle elementen en sensoren logisch met met elkaar te werken.

Checklist code updates

  • LCD-LED fade van fel naar naar gedimd als de touch sensor geactiveerd is
  • costum graden Celsius character
  • werkend relais met 9 volt
  • LCD-LED flits rood als geluisd alarm afgaat
  • gedimde kleuren als het nacht is
  • overdag staat de servo klep dicht
  • druk knop om potmeter te activeren voor persoonlijk licht.
  • Servo klep gaat geleidelijk open naarmate het donkerder word
  • kan alleen maar lichter gemaakt worden met potmeter
  • licht instelknop geeft een melding en 10 seconden licht
  • servo fade mee met LCD-LED als de toutch sensor geactiveerd is
  • servo gaat open als geluidsoverlast alarm afgaat
  • servo waarden zijn getuned
  • lichtsensor waardes zijn getuned
  • micsensor waardes zijn getuned
  • code is heringedeeld

Grove sensor lamp code

//  Smart light
//  IPOtronics smart light using Arduino grove kit by Ian van Mourik

//// SET-UP ANALOG PORTS

const int pinTemp = A0;                                             // Temperature sensor on pin A0
const int pinMic = A1;                                                  // Microphone on pin A1
const int pinLux = A2;                                                 // Light sensor on pin A2
const int potpin = A3;                                                  // pot meter on pin A3

//// SET-UP DIGITAL PORTS

const int drukPin = 3;                                                  // button on pin D2 (grove shield)
const int knopPin = 2;                                                 // Touch sensor on pin D3 (grove shield)
const int pinRelais = 4;                                               // Relays on pin D4 (grove shield)

//// DEFINE VALUE’S

const int B = 3975;                                                        // constant of temperature sensor to calculate degrees
const int thresholdMic = 120;                                   // he threshold for amount of noise
const int thresholdLux=150;                                     // The threshold for knowing when it’s dark.
const int thresholdLux1=100;                                   // The threshold for knowing when it’s dark.
const int thresholdLux2=50;                                     // The threshold for knowing when it’s dark.
const int thresholdLux3=25;                                      // The threshold for knowing when it’s dark.
const int thresholdLux4=15;                                       // The threshold for knowing when it’s dark.

int TempReading = 0;                                                   // variable to read the value from the analog pin
int TempReadingOld = 0;                                            // variable to read the last value from the analog pin
int MicReading = 0;                                                     // variable to read the value from the analog pin
int LuxReading = 0;                                                     // variable to read the value from the analog pin
int potvalue = 0;                                                           // variable to read the value from the analog pin
int buttonState = 0;                                                    // variable to read the value from the digital pin
int knopState = 0;
//// INCLUDE LIBRARIES FOR OPERATION

#include <Wire.h>                                                        // needed for LCD operation
#include “rgb_lcd.h”                                                    // needed for LCD operation
#include <Servo.h>                                                      // needed for servo operation

Servo servo;                                                                     // name of the servo

rgb_lcd lcd;                                                                    // set up the LCD

byte degC[8] = {                                                        //// making of a custom character
0b00111,                                                                          // 1 is a black pix
0b00101,                                                                        // 0 is a white pixel
0b00111,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
};

void setup()                                                            ///// SET-UP THE LOOP
{
lcd.begin(16, 2);                                                          // start the LCD
Serial.begin(9600);                                                   // start serial connection
servo.attach(8);                                                         // attaches the servo on pin D8(grove shield) to the servo object
pinMode(drukPin, INPUT);                                  // make the drukPin an input
pinMode(pinRelais, OUTPUT);                           // make the pinRelais en output

#if 1
lcd.createChar(1, degC);                                         // create and name the new character
#endif
}

void loop()                                                                ///// MAKE THE LOOP

{
//// READ AL SENSORS
{
buttonState = digitalRead(drukPin);                             // name and read the drukPin state
knopState = digitalRead(knopPin);                                // name and read the knopPin state
}

{
int val = analogRead(pinMic);                                         // Read the value of the microphone
MicReading = analogRead(pinMic);                             // name the value: MicReading
}

{
int val = analogRead(pinLux);                                        // read the value of the light sensor
LuxReading = analogRead(pinLux);                             // name the value LuxReading
}

int val = analogRead(pinTemp);                                    // Get the (raw) value of the temperature sensor.
TempReading = analogRead(pinTemp);                     // name the value  TempReading

float resistance = (float)(1023-val)*10000/val;        // Determine the current resistance of the thermistor based on the sensor value.
float temperature = 1/(log(resistance/10000)/B+1/298.15)-273.15;      // Calculate the temperature based on the resistance value.

{
lcd.begin(16, 2);                                                                   // start up the LCD
//  Serial.print(TempReading );                                     // serial monitor used for testing (remove // to activate)
//  Serial.print(MicReading );                                         // serial monitor used for testing (remove // to activate)
//  Serial.print(LuxReading );                                        // serial monitor used for testing (remove // to activate)
}

if(MicReading > thresholdMic && LuxReading < thresholdLux)              // if it’s dark and there is a loud sound:
{
lcd.clear() ;                                                                            // clears the LCD of previous information
servo.write(70);                                                                   // move the servo to open
lcd.setCursor(0, 0);                                                            // set cursor at the beginning
lcd.print(“GELUIDS OVERLAS    politie komt kijken”);                  // print message

// sequence to blink red and white for 3 second
lcd.setRGB(255, 0, 0);                                                        // turns LCD red
delay(500);                                                                            // wait half a second
lcd.setRGB(255, 255, 255);                                              // turns LCD white
delay(500);                                                                           // wait half a second
lcd.setRGB(255, 0, 0);
delay(500);
lcd.setRGB(255, 255, 255);
delay(500);
lcd.setRGB(255, 0, 0);
delay(500);
lcd.setRGB(255, 255, 255);
delay(500);
lcd.setRGB(255, 0, 0);

for (int positionCounter = 0; positionCounter < 40; positionCounter++)// set counter for moving text spaces
{
lcd.scrollDisplayLeft();                                                    // scroll one position left:
delay (500);                                                                        // wait 500 ms between steps
}
}
//// TEMPERATURE LIGHT

if(TempReading-TempReadingOld <=-4 && LuxReading > thresholdLux)        /// if it’s cooling down a lot and is daytime
{
lcd.setRGB(0, 0, 255);                                                   // LCD-LED turns bright dark Blue
}

else if(TempReading-TempReadingOld >=4 && LuxReading > thresholdLux )   /// if it’s heating up a lot and is daytime
lcd.setRGB(255, 0, 0);                                                 // LCD-LED turns bright red
}

else if(TempReading-TempReadingOld <=-2 && LuxReading > thresholdLux)   /// if is’t cooling down a bit and is daytime
{
lcd.setRGB(0,255,255);                                               // LCD-LED tuns bright light blue
}

else if(TempReading-TempReadingOld >=2 && LuxReading > thresholdLux)    /// if it’s heating up a bit and is daytime

{
lcd.setRGB(255,0,255);                                               // LCD-LED turns bright pink
}

else if (TempReading-TempReadingOld <=-4 && LuxReading < thresholdLux)  /// if it’s cooling down a lot and is night time
{
lcd.setRGB(0,0,50);                                                    // LCD-LED turns dimmed dark blue
}

else if (TempReading-TempReadingOld >=4 && LuxReading < thresholdLux)   /// if it’s heating up a lot and is night time
{
lcd.setRGB(50,0,0);                                                   // LCD-LED turns dimmed red
}

else if (TempReading-TempReadingOld <=-2 && LuxReading < thresholdLux)  /// if is’t cooling down a bit and is night time
{
lcd.setRGB(0,50,50);                                                  // LCD-LED turns dimmed light blue
}

else if (TempReading-TempReadingOld >=2 && LuxReading < thresholdLux)   /// if it’s heating up a bit and is night time
{
lcd.setRGB(50,0,50);                                                  // LCD-LED turns dimmed pink
}

else if (buttonState == LOW && LuxReading < thresholdLux)               /// if the temperature is stady and it is night time
{
lcd.setRGB(105,105,105);                                          // The LCD-LED is dimmed
}

else if (buttonState == HIGH && LuxReading < thresholdLux )             /// if it’s dark outside and somebody is walking on the street
{
lcd.clear() ;                                                                     // clears the LCD of previous information
digitalWrite (pinRelais,HIGH);                              // turns on the relais
lcd.setCursor(0, 0);                                                    // set cursor in the first row
lcd.print(“GoodNight it’s” );                                    // print message
lcd.setCursor(0, 1);                                                    // set cursor second row
lcd.print(temperature);                                            // print temperature
lcd.write(1);                                                                  // print custom char
lcd.print(“C”);                                                              // print C

// sequence to smoothly brighten up, wait, and dim down the LCD-LED and mode the servo
lcd.setRGB(125,125,125);                                             // set LCD-LED
servo.write(40);                                                              // move servo
delay (100);                                                                      // wait 100 ms
lcd.setRGB(150,150,150);
servo.write(50);
delay (100);
lcd.setRGB(200,200,200);
servo.write(60);
delay (100);
lcd.setRGB(255,255,255);
servo.write(70);
delay (3000);                                                                     // wait a couple of seconds at full brightens
lcd.setRGB(200,200,200);
servo.write(60);
delay (100);
lcd.setRGB(150,150,150);
servo.write(50);
delay (100);
lcd.setRGB(125,125,125);
servo.write(40);
delay (100);
}

//// DAY OR NIGHT

if (LuxReading < thresholdLux)                                  /// if its getting dark
{
digitalWrite (pinRelais,HIGH);                                   // turns on the relais
lcd.clear() ;                                                                         // clears the LCD of previous information
lcd.setCursor(0, 0);                                                        // set cursor in the first row
lcd.print(“GoodNight it’s” );                                        // print message
lcd.setCursor(0, 1);                                                         // set cursor second row
lcd.print(temperature);                                                // print temperature
lcd.write(1);                                                                       // print custom char
lcd.print(“C”);                                                                  // print C
}

else                                                                                    /// if it’s not dark
{
digitalWrite(pinRelais,LOW);                                  // relais is of
lcd.clear() ;                                                                     // clears the LCD of previous information
lcd.setCursor(0, 0);                                                    // set cursor in the first row
lcd.print(“GoodMorning it’s” );                              // print message
lcd.setCursor(0, 1);                                                    // set cursor second row
lcd.print(temperature);                                            // print temperature
lcd.write(1);                                                                  // print custom char
lcd.print(“C”);                                                             // print C
servo.write(12);                                                          // closes the servo
}

if (LuxReading < thresholdLux)                           /// if it’s getting dark
{
servo.write(20);                                                          // open the sevo a bit
}

if (LuxReading < thresholdLux1)                         /// if it’s getting darker
{
servo.write(25);                                                         // open the servo a bit more
}
if (LuxReading < thresholdLux2)                       /// if it’s really dark
{
servo.write(30);                                                         // open up the servo for 50%
}

//// PERSONAL LIGHT

if (knopState == HIGH && LuxReading < thresholdLux3)                    /// if somebody pushes the button at nightht time
{
lcd.begin(16, 2);                                                         // start LCD
lcd.clear() ;                                                                  // clears the LCD of previous information
lcd.setRGB(105, 105, 105);                                    // set LCD-LED
lcd.setCursor(0, 0);                                                 // set cursor in the first row
lcd.print(“Stel het zelf in!” );                                 // print message
potvalue = analogRead(potpin);                          // reads the value of the potentiometer (value between 0 and 1023)
potvalue = map(potvalue, 0, 1023, 40, 80);     // scale it to use it with the servo (value between 40 and 80)
servo.write(potvalue);                                             // sets the servo position according to the scaled value
delay(10000);                                                             // wait 10 seconds
}

TempReadingOld = TempReading;                     // saves the current temperature of later comparison

delay(500);                                                                 // Wait one second between measurements.
}

31  –  3  –  15

DEADLINE!

Presentatie model

Op de plaat van het eindmodel is te zien in welke richting de signalen lopen en bij elke sensor staat wat het is en wat het doet. Voor alle onderdelen zij cut-outs in de plaat gemaakt waarin alle onderdelen vallen en op hun plek blijven zitten.

Aan de zijkant staat een grove omschrijving van alles wat er gebeurd als het overdag is, als het donker word en als het donker is.