This commit is contained in:
2015-07-02 19:40:16 +01:00
parent 340fca762c
commit d619a16834
4 changed files with 78 additions and 62 deletions
+78 -62
View File
@@ -1,9 +1,9 @@
/************************************* /*************************************
* LDR-schakelaar berging * LDR-schakelaar isr0
* Author: Michel Bats * Author: Michel Bats
* Website: www.batssoft.nl * Website: www.batssoft.nl
* Version: 1.2.0 * Version: 1.2.0
* Revision: 20141211 * Revision: 20150207
* *
* Used libraries: * Used libraries:
* Adafruit_SSD1306\Adafruit_SSD1306 by adafruit * Adafruit_SSD1306\Adafruit_SSD1306 by adafruit
@@ -16,7 +16,7 @@
// Bibliotheken // Bibliotheken
#include <SPI.h> #include <SPI.h>
#include <Wire.h> #include <Wire.h>
#include <NewRemoteTransmitter.h> #include <NewRemoteTransmitter.h>
#include <Adafruit_GFX.h> #include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h> #include <Adafruit_SSD1306.h>
@@ -33,6 +33,8 @@
// Bepalingen Display // Bepalingen Display
#define OLED_ADDR 60 // 60 = 0x3C / 61 = 0x3D #define OLED_ADDR 60 // 60 = 0x3C / 61 = 0x3D
#define OLED_RESET 4 #define OLED_RESET 4
// Interupts
#define displaySwitch 0 // ISR adres van de drukknop om het scherm te activeren. (ISR0 = Pin2)
// Initialisatie NewRemoteTransmitter // Initialisatie NewRemoteTransmitter
NewRemoteTransmitter transmitter(kakuAddr, 11, 260, 4); NewRemoteTransmitter transmitter(kakuAddr, 11, 260, 4);
@@ -53,13 +55,14 @@ int sensorLdrValueDispPos;
int dimLevel; int dimLevel;
int dimLevelPercent; int dimLevelPercent;
int currentState; int currentState;
int displayOn = 60;
int currentDimLevel = -1; int currentDimLevel = -1;
// 32x32 icoon voor licht aan. // 32x32 icoon voor licht aan.
#define BULB32_ON_HEIGHT 32 #define BULB32_ON_HEIGHT 32
#define BULB32_ON_WIDTH 32 #define BULB32_ON_WIDTH 32
static const unsigned char PROGMEM bulb32_on_bmp[] = static const unsigned char PROGMEM bulb32_on_bmp[] =
{ {
B00000000, B00000010, B01000000, B00000000, // 1 B00000000, B00000010, B01000000, B00000000, // 1
B00000000, B01000010, B01000010, B00000000, // 2 B00000000, B01000010, B01000010, B00000000, // 2
B00000000, B01000010, B01000010, B00000000, // 3 B00000000, B01000010, B01000010, B00000000, // 3
@@ -95,9 +98,9 @@ static const unsigned char PROGMEM bulb32_on_bmp[] =
}; };
// 32x32 icoon voor licht uit. // 32x32 icoon voor licht uit.
#define BULB32_OFF_HEIGHT 32 #define BULB32_OFF_HEIGHT 32
#define BULB32_OFF_WIDTH 32 #define BULB32_OFF_WIDTH 32
static const unsigned char PROGMEM bulb32_off_bmp[] = static const unsigned char PROGMEM bulb32_off_bmp[] =
{ {
B00000000, B00000000, B00000000, B00000000, // 1 B00000000, B00000000, B00000000, B00000000, // 1
B00000000, B00000000, B00000000, B00000000, // 2 B00000000, B00000000, B00000000, B00000000, // 2
B00000000, B00000000, B00000000, B00000000, // 3 B00000000, B00000000, B00000000, B00000000, // 3
@@ -134,7 +137,7 @@ static const unsigned char PROGMEM bulb32_off_bmp[] =
void setup() { void setup() {
// Start Display // Start Display
display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR,HEX); display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR, HEX);
display.clearDisplay(); display.clearDisplay();
// Start debug-led // Start debug-led
@@ -144,14 +147,16 @@ void setup() {
// Lamp laten knipperen op het opstartscherm en op de daadwerkelijke schakelaar/dimmer. // Lamp laten knipperen op het opstartscherm en op de daadwerkelijke schakelaar/dimmer.
display.setTextSize(1); display.setTextSize(1);
display.setTextColor(WHITE); display.setTextColor(WHITE);
display.setCursor(0,0); display.setCursor(0, 0);
display.println("VERLICHTING"); display.println("VERLICHTING");
display.println(""); display.println("");
display.println("v1.2.0 (beta)"); display.println("v1.2.1 (20150207)");
display.println("v1.2.0 (20141211)");
display.println("v1.1.3 (20141202)"); display.println("v1.1.3 (20141202)");
display.println("v1.1.2 (20141118)"); display.println("v1.1.2 (20141118)");
display.println("v1.1.1 (20141117)"); //display.println("v1.1.1 (20141117)");
display.println("v1.1.0 (20141116)"); //display.println("v1.1.0 (20141116)");
display.println("|");
display.println("v1.0.0 (20141116)"); display.println("v1.0.0 (20141116)");
digitalWrite(ledPin, LOW); digitalWrite(ledPin, LOW);
transmitter.sendUnit(kakuUnit, false); transmitter.sendUnit(kakuUnit, false);
@@ -170,6 +175,9 @@ void setup() {
// initieel ophalen van LDR-waarde // initieel ophalen van LDR-waarde
currentSensorLdrValue = analogRead(sensorLdr); currentSensorLdrValue = analogRead(sensorLdr);
// Aanmaken interupt
attachInterrupt(0, isr0, RISING);
} }
void loop() { void loop() {
@@ -180,11 +188,11 @@ void loop() {
potDimValue = analogRead(potDim); // De potmeter voor het dim-niveau potDimValue = analogRead(potDim); // De potmeter voor het dim-niveau
// In geval van abrupte wijziging in LDR waarde dit opvangen door niet meer als 1 waarde afwijken van vorige meting // In geval van abrupte wijziging in LDR waarde dit opvangen door niet meer als 1 waarde afwijken van vorige meting
if (sensorLdrValue > currentSensorLdrValue){ if (sensorLdrValue > currentSensorLdrValue) {
currentSensorLdrValue++; currentSensorLdrValue++;
sensorLdrValue = currentSensorLdrValue; sensorLdrValue = currentSensorLdrValue;
} }
else if (sensorLdrValue < currentSensorLdrValue){ else if (sensorLdrValue < currentSensorLdrValue) {
currentSensorLdrValue--; currentSensorLdrValue--;
sensorLdrValue = currentSensorLdrValue; sensorLdrValue = currentSensorLdrValue;
} }
@@ -193,26 +201,27 @@ void loop() {
currentSensorLdrValue = sensorLdrValue; currentSensorLdrValue = sensorLdrValue;
// Berekenen van de hysteresis en de waarde niet onder/boven de min/max LDR-waarde uit laten komen. // Berekenen van de hysteresis en de waarde niet onder/boven de min/max LDR-waarde uit laten komen.
switchValueHigh = potSwitchValue+(potThresholdValue/2); switchValueHigh = potSwitchValue + (potThresholdValue / 2);
if (switchValueHigh > 1022) { // Door 1022 te gebruiken kán er nog geschakeld worden. Bij 1023 valt de LDR bij max altijd in de hysteresis. if (switchValueHigh > 1022) { // Door 1022 te gebruiken kán er nog geschakeld worden. Bij 1023 valt de LDR bij max altijd in de hysteresis.
switchValueHigh = 1022; switchValueHigh = 1022;
} }
switchValueLow = potSwitchValue-(potThresholdValue/2); switchValueLow = potSwitchValue - (potThresholdValue / 2);
if (switchValueLow < 1) { // Door 1 te gebruiken kán er nog geschakeld worden. Bij 0 valt de LDR bij min altijd in de hysteresis. if (switchValueLow < 1) { // Door 1 te gebruiken kán er nog geschakeld worden. Bij 0 valt de LDR bij min altijd in de hysteresis.
switchValueLow = 1; switchValueLow = 1;
} }
// Dim-niveau volgens potmeter omzetten in waarden voor de KAKU-dimmer // Dim-niveau volgens potmeter omzetten in waarden voor de KAKU-dimmer
dimLevel = map(potDimValue, 0, 1023, 0, 15); // 0 t/m 1023 omzetten naar 0 t/m 15. // 1023 is 1020 geworden. Potmeters komen nooit helemaal op maximaal (niet stabiel althans) daarrom iets onder de maximaal-waarde.
dimLevel = map(potDimValue, 0, 1020, 0, 15); // 0 t/m 1020 omzetten naar 0 t/m 15.
// Dim-niveau volgens potmeter omzetten in procenten voor weergave op het scherm // Dim-niveau volgens potmeter omzetten in procenten voor weergave op het scherm
dimLevelPercent = map(potDimValue, 0, 1023, 0, 100); // 0 t/m 1023 omzetten naar 0 t/m 100. dimLevelPercent = map(potDimValue, 0, 1020, 0, 100); // 0 t/m 1020 omzetten naar 0 t/m 100.
// Aanschakelen KAKU-dimmer als deze (volgens het programma) uit zou zijn mits aan de voorwaarden wordt voldaan. // Aanschakelen KAKU-dimmer als deze (volgens het programma) uit zou zijn mits aan de voorwaarden wordt voldaan.
if(sensorLdrValue <= switchValueLow && currentDimLevel != dimLevel){ if (sensorLdrValue <= switchValueLow && currentDimLevel != dimLevel) {
digitalWrite(ledPin, HIGH); digitalWrite(ledPin, HIGH);
// Controleren of de huidige staat uit is. Zo ja, eerst een signaal versturen dat de unit aan moet. // Controleren of de huidige staat uit is. Zo ja, eerst een signaal versturen dat de unit aan moet.
// Dit is bij Dimmers niet nodig maar als er zich een schakelaar op dit kanaal bevindt dan wordt deze ook geschakeld. // Dit is bij Dimmers niet nodig maar als er zich een schakelaar op dit kanaal bevindt dan wordt deze ook geschakeld.
if(currentState == 0) { if (currentState == 0) {
transmitter.sendUnit(kakuUnit, true); transmitter.sendUnit(kakuUnit, true);
} }
transmitter.sendDim(kakuUnit, dimLevel); transmitter.sendDim(kakuUnit, dimLevel);
@@ -220,61 +229,68 @@ void loop() {
currentState = 1; currentState = 1;
} }
// Uitschakelen KAKU-dimmer als deze (volgens het programma) aan zou zijn mits aan de voorwaarden wordt voldaan. // Uitschakelen KAKU-dimmer als deze (volgens het programma) aan zou zijn mits aan de voorwaarden wordt voldaan.
else if(sensorLdrValue >= switchValueHigh && currentState == 1) { else if (sensorLdrValue >= switchValueHigh && currentState == 1) {
digitalWrite(ledPin, LOW); digitalWrite(ledPin, LOW);
transmitter.sendUnit(kakuUnit, false); transmitter.sendUnit(kakuUnit, false);
currentDimLevel = -1; currentDimLevel = -1;
currentState = 0; currentState = 0;
} }
// Gegevens voor het display. if (displayOn > 1) {
// Potmeter-waarden omzetten naar scherm-posities. // displayOn in mindering brengen
switchValueLowDispPos = map(switchValueLow, 0, 1023, 0, 127); displayOn--;
switchValueHighDispPos = map(switchValueHigh, 0, 1023, 0, 127);
sensorLdrValueDispPos = map(sensorLdrValue, 0, 1023, 0, 127);
// Tekst weergeven op het scherm // Gegevens voor het display.
display.setTextSize(1); // Potmeter-waarden omzetten naar scherm-posities.
display.setTextColor(WHITE); switchValueLowDispPos = map(switchValueLow, 0, 1023, 0, 127);
display.setCursor(0,0); switchValueHighDispPos = map(switchValueHigh, 0, 1023, 0, 127);
display.println("VERLICHTING"); sensorLdrValueDispPos = map(sensorLdrValue, 0, 1023, 0, 127);
display.println("");
display.println("Dimmer-niveau:");
display.print(" ");
display.print(dimLevel);
display.print(" (");
display.print(dimLevelPercent);
display.println("%)");
// Lamp-icoon // Tekst weergeven op het scherm
// Icoon voor licht aan weergeven als het licht (volgens het programma) aan is. display.setTextSize(1);
if (currentState == 1 ){ display.setTextColor(WHITE);
display.drawBitmap(97, 0, bulb32_on_bmp, 32, 32, 1); display.setCursor(0, 0);
} display.println("VERLICHTING");
// Icoon voor licht uit weergeven als het licht (volgens het programma) uit is. display.println("");
else { display.println("Dimmer-niveau:");
display.drawBitmap(97, 0, bulb32_off_bmp, 32, 32, 1); display.print(" ");
display.print(dimLevel);
display.print(" (");
display.print(dimLevelPercent);
display.println("%)");
// Lamp-icoon
// Icoon voor licht aan weergeven als het licht (volgens het programma) aan is.
if (currentState == 1 ) {
display.drawBitmap(97, 0, bulb32_on_bmp, 32, 32, 1);
}
// Icoon voor licht uit weergeven als het licht (volgens het programma) uit is.
else {
display.drawBitmap(97, 0, bulb32_off_bmp, 32, 32, 1);
}
// Lijnen tekenen voor visuele weergave (op het scherm) van de gegevens
display.drawLine(0, 40, 127, 40, WHITE);
display.drawLine(0, 52, 127, 52, WHITE);
display.drawLine(0, 63, 127, 63, WHITE);
display.fillRect(switchValueLowDispPos, 48, switchValueHighDispPos - switchValueLowDispPos + 1, 9, WHITE);
display.drawLine(sensorLdrValueDispPos, 40, sensorLdrValueDispPos, 63, WHITE);
} }
// Lijnen tekenen voor visuele weergave (op het scherm) van de gegevens // Display uitvoer zolang er data is.
display.drawLine(0, 40, 127, 40, WHITE); if (displayOn > 0) {
display.drawLine(0, 52, 127, 52, WHITE); // Uitvoer naar display en display-buffer leegmaken.
display.drawLine(0, 63, 127, 63, WHITE); display.display();
display.fillRect(switchValueLowDispPos, 48, switchValueHighDispPos-switchValueLowDispPos+1, 9, WHITE); display.clearDisplay();
display.drawLine(sensorLdrValueDispPos, 40, sensorLdrValueDispPos, 63, WHITE); }
display.display();
display.clearDisplay();
// 1000ms (1sec) wachten voor het starten van de volgende ronde. // 1000ms (1sec) wachten voor het starten van de volgende ronde.
// Wordt vooral gebruikt om het abrupt wijzigen van de LDR tegen te gaan. // Wordt vooral gebruikt om het abrupt wijzigen van de LDR tegen te gaan.
delay(1000); delay(1000);
} }
void isr0() //interrupt service routine
{
displayOn = 120;
}
Binary file not shown.
Binary file not shown.
Binary file not shown.