De lichtmodule
De lichtmodule gebruikt 2 pinnen met PWM (pulsbreedte) om het licht te schakelen. Zo kan de lichtsterkte in de software worden gedimd als het te fel is. De sketch:
/*
* MODELTREIN LICHTMODULE
* Schakelbaar licht voor de modeltrein, voor binneverlichting, sluitverlichting en meer.
*
* Rijstroom met pulsbreedtebesturing is nodig: met veranderingen van de pulsfrequentie worden
* de lichtfuncties bestuurd.
*
* versie 0.2 - 19 sep 2018
*
* Notities:
* voor Digispark EEPROM gebruik moet de library worden gekopieerd van
* C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\EEPROM\
* naar
* C:\Users\{user.name}\AppData\Local\Arduino15\packages\digistump\hardware\avr\1.6.5\libraries\EEPROM\
*
* Voor gebruik losse ATtiny: Bootloader branden met BOD op 4.3V en clock op 16 MHz
*/
// --- DEFINITIES ----
// Pinnen
#define lichtPin 0 // pin1 voor aansturen van licht: PWM pin (dimbaar licht)
#define lichtPin2 1 // 2e lichtpin
#define rijPin1 3 // rijstroom meting
#define rijPin2 4 // rijstroom meting
// definities voor licht
#define lichtfunctie 5 // functie 5 is sluitlicht aan/uit
#define lichtsterkte 20 // lichtsterkte (0-255)
#define lichtfunctie2 6 // functie 6 is binnenverlichting aan/uit
#define lichtsterkte2 50 // lichtsterkte (0-255)
// EEPROM geheugenlocaties
#define licht1adr 0
#define licht2adr 1
// definities voor de meting van de rijstroom
#define pullup false // geeft aan of de interne pullup weerstand gebruikt moet worden
#define maxpulsperiode 5000 // hoe lang wachten (minimaal 2x periode rijstroom PWM)
// Frequenties (Periodes) op de rijstroom
#define rijPeriode 2020 // rijstroom puls in us
#define functie_01_Periode 1500 // Periode (freq.) functie 1 - niet gebruikt (geluid)
#define functie_02_Periode 1250 // Periode (freq.) functie 2 - niet gebruikt (geluid)
#define functie_03_Periode 990 // Periode (freq.) functie 3 - niet gebruikt (geluid)
#define functie_04_Periode 790 // Periode (freq.) functie 4 - niet gebruikt (geluid)
#define functie_05_Periode 590 // Periode (freq.) functie 5 - licht 1
#define functie_06_Periode 450 // Periode (freq.) functie 6 - licht 2
#define pulsruis 70 // maximaal verschil in gemeten Periodes (ruis)
#define minhoog 100 // minimaal "hoog" signaal
// ---- libraries en objecten ----
#include <EEPROM.h> // EEPROM om licht aan/uit en geluid aan/uit te onthouden
// --- CONSTANTES EN VARIABELEN---
// rijstroom variabelen
int rijpin[] {rijPin1, rijPin2};
int vooruit = 1; // richting: bepaalt welke pin wordt uitgelezen voor de rijstroom puls
double pulsbreedteHoog;
double pulsbreedteLaag;
double pulsPeriode;
// variabelen voor speciale functies op de rijstroom
int functie = 0; // speciale functie frequentie gemeten
int licht; // licht sterkte of uit (0);
int licht2; // licht sterkte of uit (0);
// --- FUNCTIES ---
// MEET DE PULS OP DE RiJSTROOM
void meetPuls() {
// puls meting variabelen: lengte 'hoog', 'laag' en trillingstijd (periode). Alle tijden in us.
pulsbreedteHoog = pulseIn(rijpin[vooruit], HIGH, maxpulsperiode);
pulsbreedteLaag = pulseIn(rijpin[vooruit], LOW, maxpulsperiode );
pulsPeriode = pulsbreedteHoog + pulsbreedteLaag;
}
// HERKEN FUNCTIE-FREQUENTIE
// functie voor het checken van functie-frequenties
// op de puls (functietoets).
int getFunctie () {
int f = 0;
if (abs (pulsPeriode - functie_01_Periode) < pulsruis) { f = 1;}
if (abs (pulsPeriode - functie_02_Periode) < pulsruis) { f = 2;}
if (abs (pulsPeriode - functie_03_Periode) < pulsruis) { f = 3;}
if (abs (pulsPeriode - functie_04_Periode) < pulsruis) { f = 4;}
if (abs (pulsPeriode - functie_05_Periode) < pulsruis) { f = 5;}
if (abs (pulsPeriode - functie_06_Periode) < pulsruis) { f = 6;}
return f;
}
// ----- HOOFDPROGRAMMA -----
// ----- initialisatie -----
void setup() {
// intialiseren rij pinnen
pinMode (rijpin[0],INPUT);
digitalWrite(rijpin[0],pullup);
pinMode (rijpin[1],INPUT);
digitalWrite(rijpin[1],pullup);
delay(100); // even wachten op opladen elco (stabiele voeding)
// bij opstarten de opgeslagen licht status gebruiken
licht = EEPROM.read(licht1adr); // laatste licht waarde uit EEPROM
pinMode (lichtPin,OUTPUT);
analogWrite (lichtPin,licht); // licht aan of uit: waarde uit EEPROM
licht2 = EEPROM.read(licht2adr); // laatste licht waarde uit EEPROM
pinMode (lichtPin2,OUTPUT);
analogWrite (lichtPin2,licht2); // licht aan of uit: waarde uit EEPROM
}
// ----- hoofdlus ------
void loop() {
// Pulsbreedte bepalen
do {
vooruit = !vooruit; // wissel de pin waarop de rijstroom wordt gemeten
meetPuls();
} while (pulsbreedteHoog < minhoog || pulsbreedteLaag < pulsruis); // 'hoog' signaal alleen op actieve rijpin
functie = getFunctie();
// speciale geluidsfunctie gevonden
if (functie) {
// als speciale functie is gevonden, controleer de functie frequentie nogmaals.
// Hiermee wordt onterecht meten voorkomen (door bijvoorbeeld storing op de stroomopname).
delay (5); // korte pauze tussen de metingen
meetPuls();
if (functie == getFunctie()) { // nog steeds dezelfde funtie op de rijstroom
switch (functie) {
case lichtfunctie:
if (licht == 0) {licht = lichtsterkte;} else { licht = 0;} // wissel licht aan/uit op juiste sterkte
analogWrite(lichtPin, licht); // zet licht aan (op dimwaarde) of uit
EEPROM.write(licht1adr,licht); // onthou licht aan of uit tot volgende opstart.
delay (500);
break;
case lichtfunctie2:
if (licht2 == 0) {licht2 = lichtsterkte2;} else { licht2 = 0;} // wissel 2e licht aan/uit op juiste sterkte
analogWrite(lichtPin2, licht2); // zet licht aan (op dimwaarde) of uit
EEPROM.write(licht2adr,licht2); // onthou licht aan of uit tot volgende opstart.
delay (500);
break;
}
}
}
}
Tot zover het overzicht.
Rob