Lad der blive lys (Læst 4868x)

Offline salomon

  • Modstanden
  • **
  • Indlæg: 17
  • Antal brugbare Indlæg: 1
    • Vis profil
Lad der blive lys
« Dato: Marts 23, 2015, 21:52:34 »

Jeg har et sommerhus 750km nord fra, hvor jeg bor. Der kan blive koldt om vinteren.
Når det er rigtig koldt kan der blive -40 grader. Det er derfor vigtigt, at der er strøm på huset, da det er opvarmet med el-radiatorer.
Selvom jeg tømmer vandet af rørene, ligger der stadig lidt tilbage, som kan fryse, hvilket får rørene til at sprænge. Det er sket et par gange.
Til og med er vandmåleren sprængt en gang. Jeg har selvfølgelig både isoleret rørene samt vandmåleren i kælderen og sat varmekabler på. Varmekabler kræver dog også strøm.

Jeg har en linux server og hjemmelavet temperaturovervågning/varmestyring i huset. Det sker dog, at jeg mister forbindelsen til huset.

I januar mistede jeg forbindelsen og jeg bad mine søde genboer, der bor overfor, at undersøge om der var strøm på huset.
Efter at de (manden i huset) havde konstateret at der var strøm på huset, spurgte de mig forståeligt nok om jeg ikke kunne sætte en lampe i vinduet, så de fra deres hus kan se om der er strøm på mit.
Genborene er ikke helt unge. Manden er 83 år og da jeg bad dem om, at se om der var strøm på huset, lå der godt og vel en meter sne hele vejen ind til huset, så det er vel et rimeligt krav, det med lyset i vinduet.

Jeg kunne selvfølgelig have sat en lampe med timer i vinduet, men det virkede lidt kedeligt, så derfor fik jeg følgende plan:

Vi skal bruge:

1  stk. Arduino med tilhørende USB kabel
1  stk. breadboard
1  stk. RGB led (Common Anode)
1  stk. lys følsom modstand (photoresistor)
1  stk. DS18B20
1  stk. 4k7 ohm modstand
1  stk. 10K ohm modstand
3  stk. 220 ohm modstand
1  stk. 0,96" 128x64 oled skærm
12 stk. jumper kabler

Derudover skal der bruges en PC med USB og Arduino IDE (http://arduino.cc/en/Main/Software) installeret.
Følgende libraries skal også installeres: https://github.com/milesburton/Arduino-Temperature-Control-Library og https://github.com/stanleyhuangyc/MultiLCD


Det hele samles således (har vedhæftet nogle billeder):

Power:
GND og +5v fra arduino'en forbindes til -/+ på breadboard'et

RGB Led:
Anode forbindes til pin 8 på arduino'en og på hver RGB ben forbindes en 220 ohm's modstand som forbindes til arduino'en (pin 9=rød,pin 10=grøn, pin 11=blå)



DS18B20:
GND forbindes til - og VCC til +. Sæt en 4k7  modstand mellem + og DQ. DQ forbindes til pin 13 på arduino'en



Photoresistor:
Det ene ben forbindes til +. Det andet ben forbindes til en 10K modstand og til arduino'en pin A0. Det andet ben af modstanden forbindes til -

OLED 64x128 display:
GND forbindes til - og VCC til +. SDA forbindes til SDA og SCL forbindes til SCL på arduino'en.




Og så til koden:

Kode:
#include <MicroLCD.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Math.h>

#define ONE_WIRE_BUS 13
#define TEMPERATURE_PRECISION 12
#define LIGHT  A0
#define OnOff 8
#define YELLOW  0
#define RED  9
#define GREEN 10
#define BLUE 11
#define OFF 0
#define ON 1

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
LCD_SSD1306 lcd;
DeviceAddress termo;

void setup() {
  sensors.begin();
  lcd.begin();
  pinMode(OnOff, OUTPUT);
  pinMode(RED, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(BLUE, OUTPUT);
}

void loop() {
  if (analogRead(LIGHT) < 350) {
    unsigned long timer = millis();
    int C = 0;
    float tempC = 0;
    while (millis() < timer + 30000) {
      tempC = getTemp();
      showIt("Temperature:", tempC);
      C = round(tempC);
      if (tempC > 7) setColor(GREEN);
      else if (tempC <= 0) setColor(RED);
      else setColor(BLUE);
      switchIt(ON);
      delay(500);
    }
    switchIt(OFF);
    delay(2000);
    switchIt(ON);
    if (C < 0) C = C * -1;
    blinkIt(C);
    switch (OFF);
    delay(2000);
  }
  else {
    lcd.clear();
    delay(60000);
  }
}

void switchIt(byte state) {
  if (state) digitalWrite(OnOff, ON);
  else digitalWrite(OnOff, OFF);
}

void blinkIt(byte count) {
  for (int i = 0; i < count; i++) {
    showIt("Count:", i + 1);
    switchIt(ON);
    delay(500);
    switchIt(OFF);
    delay(500);
  }
  if (count == YELLOW) {
    setColor(YELLOW);
    for (int i = 0; i < 10; i++) {
      switchIt(ON);
      delay(50);
      switchIt(OFF);
      delay(50);
    }
  }
}

void setColor(byte color) {
  analogWrite(RED, 255);
  analogWrite(GREEN, 255);
  analogWrite(BLUE, 255);
  switch (color) {
    case RED:
      analogWrite(RED, 0);
      break;
    case GREEN:
      analogWrite(GREEN, 0);
      break;
    case BLUE:
      analogWrite(BLUE, 0);
      break;
    case YELLOW:
      analogWrite(RED, 0);
      analogWrite(GREEN, 0);
      break;
  }
}

void showIt(String text, float toPrint) {
  int roundedNumber = toPrint;
  lcd.clear();
  lcd.setFontSize(FONT_SIZE_XLARGE);
  lcd.setCursor(0, 0);
  lcd.println(text);
  lcd.setCursor(0, 3);
  if (text.equals("Count:")) lcd.println(roundedNumber);
  else lcd.println(toPrint);
  lcd.setCursor(0, 6);
  lcd.print("LUX: ");
  lcd.println(analogRead(LIGHT));
}

float getTemp() {
  sensors.getAddress(termo, 0);
  sensors.setResolution(termo, TEMPERATURE_PRECISION);
  sensors.requestTemperatures();
  return sensors.getTempC(termo);
}


Og så blev der lys (altså, når det er mørkt nok).



Lidt forklaring til hvad koden gør:

RGB LED tændes i 30 sek. - slukker dernæst og blinker temperaturen, og tænder igen
RGB LED lyser/blinker grønt, når der er mere end 7 grader 
RGB LED lyser/blinker blåt mellem 7 og 1 grader
RGB LED lyser/blinker rødt under 0 grader
RGB LED lyser/blinker hurtigt gult ved 0 grader

Der vises temperatur, lys niveau samt antal blink, når der blinkes.


Spørgsmål er selvfølgelig velkommen.


Hilsen
Morten
« Senest Redigeret: Marts 29, 2015, 14:34:23 af salomon »