#include <Bounce2.h>const byte LedPins[] = {13, 12}; //Pinnen voor de knipper ledjes (even lang aan als uit)const byte FlasherPin = 10; //Pin voor de flasher, andere aan dan uit tijdconst byte KnopjePin = 9; //Pin voor het drukknopjes (tussen de pin en GND)const byte TimedLedPin = 8; //Pin voor het ledje wat je an kunt doen met het knopjeconst unsigned int LedIntervals[] = {500, 1200}; //aan/uit interval voor led1, led 2 enzconst unsigned int FlasherIntervals[] = {1900, 100}; //1900ms uit, 100ms aanconst unsigned int TimedLedInterval = 30000; //uit na zoveel msBounce knopje;void setup(){ //Alle pins met ledjes moeten natuurlijk output zijn for(byte i = 0; i < sizeof(LedPins); i++){ pinMode(LedPins[i], OUTPUT); } pinMode(FlasherPin, OUTPUT); //Flasher ook output pinMode(TimedLedPin, OUTPUT);//en deze ook knopje.attach(KnopjePin, INPUT_PULLUP); //Verbind de pin met het object en zet pull up aan }void loop(){ updateLed(0); //Een ledje laten knipperen updateLed(1); //En nog één! updateFlasher(); //En nu nog eentje laten met verschillende aan en uit tijden timedLedUpdate(); //En nog een ledje (maar zou net zo goed een wissel kunnen zijn ;) ), aan met knop, vanzelf uit }//Laat ledjes knipperen. Even lang aan als uit. Werkt voor hoevel ledjes je in LedPins en LedIntervals definieertvoid updateLed(byte ledNummer){ static unsigned long vorigeMillis[sizeof(LedPins)]; //om de laatste keer te onthouden (wanneer keek ik op de klok?) //Controleer of interval om is. MOET op deze manier if(millis() - vorigeMillis[ledNummer] >= LedIntervals[ledNummer]){ vorigeMillis[ledNummer] = millis(); //sla op dat we weer iets doen digitalToggle(LedPins[ledNummer]); //Wissel led (HIGH <-> LOW) }}//functie om een pin te wisselen (LOW <-> HIGH)void digitalToggle(byte pin){ digitalWrite(pin, !digitalRead(pin));}void updateFlasher(){ static unsigned long vorigeMillis = 0; //Laate keer iets gedaan, ondertussen bekende variabele ;) //Checken of het interval om is. We gebruiken een interval voor uit (FlasherIntervals[0]) en een voor aan FlasherIntervals[1] //Door dus digitalRead() te bruiken komt hier al 0 of 1 uit al naar gelang of de flasher aan of uit is if(millis() - vorigeMillis >= FlasherIntervals[digitalRead(FlasherPin)]){ vorigeMillis = millis(); //Sla op dat we eits doen digitalToggle(FlasherPin); //wissel led(HIGH <-> LOW) }}//Timed ledje, gaat aan met knopje en weer uit na een ingestelde tijdvoid timedLedUpdate(){ static unsigned long ledjeAanMillis = 0; //Beginnen we met kijken of het knopje is ingedrukt want ja, dan moet het ledje aan knopje.update(); //Lees het knopje //Is het knopje ingedrukt? if(knopje.fell() ){ digitalWrite(TimedLedPin, HIGH); //zet het ledje aan ledjeAanMillis = millis(); //sla op wanneer je it gedaan hebt } //nu we dat gedaan hebben, is het misschien tijd om het ledje uit te zetten? Moet hij wel aan staan natuurlijk! //Staat ledje aan? (Ja, je kan gewoon een digitalRead op een output doen, geen probleem :) ) if(digitalRead(TimedLedPin)){ //Ledje is dus aan, maar moet hij al uit? if(millis() - ledjeAanMillis >= TimedLedInterval){ digitalWrite(TimedLedPin, LOW); } }}
void setWissel(byte Wnummer, bool Wrichting) { if (Wnummer == 1) { if (Wrichting == 0) { digitalWrite(Wissel1rPin, HIGH); delay(750); // Normaal staat de waarde op 500) digitalWrite(Wissel1rPin, LOW); } } if (Wnummer == 1) { if (Wrichting == 1) { digitalWrite(Wissel1aPin, HIGH); delay(750); // Normaal staat de waarde op 500) digitalWrite(Wissel1aPin, LOW); } }} // einde functie setWissel
void setWissel(byte Wnummer, bool Wrichting) { if (Wnummer == 1) { if (Wrichting == 0) { digitalWrite(Wissel1rPin, HIGH); delay(750); // Normaal staat de waarde op 500) <--------------- Dit is dus typisch iets om een const variabele voor aan te maken! digitalWrite(Wissel1rPin, LOW); } else{ digitalWrite(Wissel1aPin, HIGH); delay(750); // Normaal staat de waarde op 500) digitalWrite(Wissel1aPin, LOW); } }} // einde functie setWissel
char Slave = Wire.read(); // receive a byte as character
int myVar = 1;void setup(){ Serial.begin(115200);}void loop(){ int myVar = 50; Serial.println(myVar); //print de lokale variabele Serial.println(::myVar); //print de global variabele (geef je aan met de :: ) delay(1000);}
Als ik het goed heb kan ik 127 slave units met de I2C gebruiken.
Wire.begin(5); // Stelt de communicatie met de AAMS centrale in.
Het lijkt er sterk op dat een delay(200) zonder dat de Arduino moet wachten tot de delay(200) is afgelopen andere commando's kan uitvoeren,
byte BlokPin[] = {11, 10, 9, 8};byte State;//int current;void setup() { pinMode(BlokPin[0], OUTPUT); pinMode(BlokPin[1], OUTPUT); pinMode(BlokPin[2], OUTPUT); pinMode(BlokPin[3], OUTPUT); Serial.begin(9600);}void loop() { if (Serial.available() > 0) { if (Serial.peek() == 'A') { Serial.read(); State = Serial.parseInt(); Serial.read(); digitalWrite(BlokPin[0], State); } if (Serial.peek() == 'B') { Serial.read(); State = Serial.parseInt(); digitalWrite(BlokPin[1], State); } if (Serial.peek() == 'C') { Serial.read(); State = Serial.parseInt(); digitalWrite(BlokPin[2], State); } if (Serial.peek() == 'D') { Serial.read(); State = Serial.parseInt(); digitalWrite(BlokPin[3], State); } while (Serial.available() > 0 ) { Serial.read(); } }}
byte BlokPins[] = {11, 10, 9, 8};void setup() { for(byte i = 0; i < sizeof(BlokPins); i++){ pinMode(BlokPins[i], OUTPUT); } Serial.begin(9600); //tijd voor 115200?}void loop() { checkIngekomenSerial(); }void checkIngekomenSerial(){ // Ga dan uit dat de serial commando's eruit zien als // [commando letter] [adres] // Waarbij ieder [] één byte is. Dus geen adressen in ASCII zenden ;) if (Serial.available() >= 2) { switch(Serial.read()){ case 'W': //Schakel een wissel recht //Ga even uit dat de functie schakeWissel(wisselnummer, richting) bestaat schakelWissel(Serial.read(), RECHT); break; //schakel een wissel afbuigend case 'w': schakelWissel(Serial.read(), AFBUIGEN); break; //Maak blok vrij case 'b': setBlok(Serial.read(), VRIJ); break; case 'B': setBlok(Serial.read(), BEZET); break; } }}
byte BlokPins[] = {11, 10, 9, 8};const unsigned int SerialInterval = 200;void setup() { for(byte i = 0; i < sizeof(BlokPins); i++){ pinMode(BlokPins[i], OUTPUT); } Serial.begin(9600); //tijd voor 115200?}void loop() { checkIngekomenSerial(); }void checkIngekomenSerial(){ static unsigned int lastCommandMillis = 0; unsigned int nowMillis = millis(); // Ga dan uit dat de serial commando's eruit zien als // [commando letter] [module adres] [device adres] // Waarbij ieder [] één byte is. Dus geen adressen in ASCII zenden ;) //Kijk of er een commando is binnen gekomen if(Serial.available() >= 3){ //Okay, 3 byte dus een commando, update de tijd dat er een geldig commando was lastCommandMillis = millis(); //Eerst commando van 3 bytes even opslaan for(byte i = 0; i < 3; i++){ laatsteCommando[i] = Serial.read(); } //Nu over I2C versturen Wire.beginTransmission(laatsteCommando[1]); //bevat het adres Wire.write(laatsteCommando[0]); //type commando Wire.write(laatsteCommando[2]); //device adres Wire.endTransmission(); //En de bus sluiten } //Is het anders tijd voor het legen van de buffer? //Gebeurd als er SerialInterval lang geen geldig commando is ontvangen else if(Serial.available() && (nowMillis - lastCommandMillis >= SerialInterval){ while(Serial.available()){ Serial.read(); } } //Om te zorgen dat de buffer niet geleegd word als we na een lange tijd weer beginnen met het zenden van een commando //updaten we de tijd ook als de buffer gewoon leeg is. Kan ook gezien worden als geldig //commando voor do niets ;) else if(!Serial.available()){ lastCommandMillis = millis(); }}
byte BlokPins[] = {11, 10, 9, 8};void setup() { for(byte i = 0; i < sizeof(BlokPins); i++){ pinMode(BlokPins, OUTPUT); } Serial.begin(9600); //tijd voor 115200?}void loop() { checkIngekomenSerial(); }void checkIngekomenSerial(){ // Ga dan uit dat de serial commando's eruit zien als // [commando letter] [adres] // Waarbij ieder [] één byte is. Dus geen adressen in ASCII zenden if (Serial.available() >= 2) { switch(Serial.read()){ case 'W': //Schakel een wissel recht //Ga even uit dat de functie schakeWissel(wisselnummer, richting) bestaat schakelWissel(Serial.read(), RECHT); break; //schakel een wissel afbuigend case 'w': schakelWissel(Serial.read(), AFBUIGEN); break; //Maak blok vrij case 'b': setBlok(Serial.read(), VRIJ); break; case 'B': setBlok(Serial.read(), BEZET); break; } }}
byte BlokPins[] = {11, 10, 9, 8};#define RECHT 0#define AFBUIGEN 1#define VRIJ 0#define BEZET 1void setup() { for(byte i = 0; i < sizeof(BlokPins); i++){ pinMode(BlokPins[i], OUTPUT); } Serial.begin(115200); //tijd voor 115200?}void loop() { checkIngekomenSerial(); }void checkIngekomenSerial(){ // Ga dan uit dat de serial commando's eruit zien als // [commando letter] [adres] // Waarbij ieder [] één byte is. Dus geen adressen in ASCII zenden ;) if (Serial.available() >= 2) { switch(Serial.read()){ case 'W': //Schakel een wissel recht //Ga even uit dat de functie schakeWissel(wisselnummer, richting) bestaat schakelWissel(Serial.read(), RECHT); break; //schakel een wissel afbuigend case 'w': schakelWissel(Serial.read(), AFBUIGEN); break; //Maak blok vrij case 'b': setBlok(Serial.read(), VRIJ); break; case 'B': setBlok(Serial.read(), BEZET); break; } }}void schakelWissel(byte address, bool state){ Serial.print("Wissel "); Serial.print(address); if(state){ Serial.println(" afbuigen"); } else{ Serial.println(" recht"); }}void setBlok(byte address, bool state){ Serial.print("Blok "); Serial.print(address); if(state){ Serial.println(" bezet"); } else{ Serial.println(" vrij"); }}
byte BlokPins[] = {11, 10, 9, 8};//worden voor testen gebruikt voor blok en wissels#define Recht 0#define Afbuigen 1#define Vrij 0#define Bezet 1//char MyString;void setup() { for (byte i = 0; i < sizeof(BlokPins); i++) { pinMode(BlokPins[i], OUTPUT); } Serial.begin(115200); //tijd voor 115200?}void loop() { checkIngekomenSerial();}void checkIngekomenSerial() { // Ga dan uit dat de serial commando's eruit zien als // [commando letter] [adres] // Waarbij ieder [] één byte is. Dus geen adressen in ASCII zenden ;) //while (Serial.available() >= 2) { if (Serial.available() >= 2) { //char MyString = Serial.read(); //if(MyString == 'W1') { // setWissel(MyString, Recht); // } // if(MyString == 'w1'){ // setWissel(MyString, Afbuigen); // } //} switch (Serial.read()) { //switch (MyString) { //schakel een wissel recht case 'W': //case 'W1': setWissel(Serial.read(), Recht); //setWissel(MyString, Recht); break; //schakel een wissel afbuigend case 'w': //case 'w1': setWissel(Serial.read(), Afbuigen); //setWissel(MyString, Afbuigen); break; //Maak blok vrij case 'b': setBlok(Serial.read(), Vrij); break; case 'B': setBlok(Serial.read(), Bezet); break; } }}void setWissel(byte address, bool state) { //char MyString = Serial.read(); //for(byte i = 0; i< sizeof(BlokPins); i++){ // ik gebruik BlokPins ook voor de wissels om makkelijk te testen. Serial.print("Wissel "); Serial.print(address); if (state) { Serial.println(" Afbuigen"); digitalWrite(Serial.read(), state); //digitalWrite(MyString, state); //digitalWrite(address,state);// Deze werkt niet } else { Serial.println(" Rechtdoor"); digitalWrite(Serial.read(), state); //digitalWrite(MyString, state); //digitalWrite(address,state);// Deze werkt niet }}//}void setBlok(byte address, bool state) { Serial.print("Blok "); Serial.print(address); if (state) { Serial.println(" bezet"); } else { Serial.println(" vrij"); }}
const byte BlokPins[] = {11, 10, 9, 8};//worden voor testen gebruikt voor blok en wisselsconst byte WisselPins[][2] = {{13, 14}, {15, 16}}; //wissel pinnen#define Recht 0#define Afbuigen 1#define Vrij 0#define Bezet 1void setup() { for (byte i = 0; i < sizeof(BlokPins); i++) { pinMode(BlokPins[i], OUTPUT); } for(byte i = 0; i < sizeof(WisselPins); i++){ pinMode(WisselPins[i][Recht], OUTPUT); pinMode(WisselPins[i][Afbuigen], OUTPUT); } Serial.begin(115200); //tijd voor 115200?}void loop() { checkIngekomenSerial();}void checkIngekomenSerial() { // Ga dan uit dat de serial commando's eruit zien als // [commando letter] [adres] // Waarbij ieder [] één byte is. Dus geen adressen in ASCII zenden ;) if (Serial.available() >= 2) { switch (Serial.read()) { //schakel een wissel recht case 'W': //case 'W1': setWissel(Serial.read(), Recht); break; //schakel een wissel afbuigend case 'w': //case 'w1': setWissel(Serial.read(), Afbuigen); break; //Maak blok vrij case 'b': setBlok(Serial.read(), Vrij); break; case 'B': setBlok(Serial.read(), Bezet); break; } }}void setWissel(byte address, bool state) { /* Hier doe je niets meer met serial. Alle gegeven die je nodig hebt zijn al uit serial gehaald en als parameter meegegeven aan deze functie. */ //Even compenseren voor ASCII. Werkt alleen voor 1 t/m 9. //GEEN oplossing dus. Beter en simpeler om een echte byte te sturen maar dat doet de serial monitor niet address -= '1'; Serial.print("Wissel "); Serial.print(address); if (state) { Serial.println(" Afbuigen"); digitalWrite(WisselPins[address][0], state); } else { Serial.println(" Rechtdoor"); digitalWrite(WisselPins[address][0], state); }}void setBlok(byte address, bool state) { Serial.print("Blok "); Serial.print(address); if (state) { Serial.println(" bezet"); } else { Serial.println(" vrij"); }}
digitalWrite(22, 1); // Blok 1 Bezet digitalWrite(23, 0); // Blok 2 Vrij digitalWrite(24, 0); // Blok 3 Vrij digitalWrite(25, 0); // Blok 4 Vrij digitalWrite(26, 0); // Blok 5 Vrij digitalWrite(27, 0); // Blok 6 Vrij digitalWrite(28, 0); // Blok 7 Vrij digitalWrite(29, 1); // Blok 8 Bezet
//Maak juiste blokken bezet, rest vrijfor(byte i = 0; i < sizeof(BlokPins); i++){ if(i == 0 || i == 7){ digitalWrite(BlokPins[i], Bezet); } else{ digitalWrite(BlokPins[i], Vrij); }}
//Maak juiste blokken bezet, rest vrijfor(byte i = 0; i < sizeof(BlokPins); i++){ digitalWrite(BlokPins[i], (i == 0 || i == 7));}
ga ik twee bi-polaire relais gebruiken, in dat geval kost dat vier uitgangen