/* * Schakelbord.cpp * * Created on: 15-01-2015 * Version: 0.1 * Changes: Initial version * * interface hardware needed ! */#include <Arduino.h> #include "Schakelbord.h"Schakelbord::Schakelbord(int Pin): _pin(Pin) { pinMode(_pin, OUTPUT); digitalWrite(_pin, HIGH); // LED off _stand = 0; _pulse = 0; _dender = SETDENDER; // Set waittime back to start.}Schakelbord::Schakelbord() { _stand = 0; _pulse = 0; _dender = SETDENDER; // Set waittime back to start.}// Initialize pin for reading switch and driving LEDvoid Schakelbord::pin(int Pin) { _pin = Pin; pinMode(_pin, OUTPUT); digitalWrite(_pin, HIGH); // LED off _stand = 0; _pulse = 0; _dender = SETDENDER; // Set waittime back to start.}// Lees de stand van de schakelaar/drukknopint Schakelbord::read() { int temp; // Set pin to input and read pinMode(_pin, INPUT); temp = digitalRead(_pin); // Set pin to output and restore pinMode(_pin, OUTPUT); set(_stand); if (temp == 0) { _dender = SETDENDER; // Set waittime back to start. } else { if (_dender != 0) { _dender--; // Continue waiting, temp = 0; // Report open switch } } return temp;}int Schakelbord::pulse() { int temp; int result; temp = read(); _pulse = _pulse ^ temp; // Last 0 and new 1 and last 1 and new 0 both give 1 result = _pulse & temp; // But only if new 1 then result = 1 _pulse = temp; return result;}// Set LED on or offvoid Schakelbord::set(int stand) { if (_invers) { if (stand == 0) { digitalWrite(_pin, LOW); // LED on } else { digitalWrite(_pin, HIGH); // LED off } } else { if (stand == 0) { digitalWrite(_pin, HIGH); // LED off } else { digitalWrite(_pin, LOW); // LED on } } _stand = stand;}// Get state LEDint Schakelbord::get() { return _stand;}void Schakelbord::setInvers(bool value) { _invers = value;}// Get SX_bus parametersbool Schakelbord::getProcessed() { return _processed;}void Schakelbord::setProcessed(bool value) { _processed = value;}int Schakelbord::getAdresLED() { return _adresLED;}void Schakelbord::setAdresLED(int value) { _adresLED = value;}int Schakelbord::getBitLED() { return _bitLED;}void Schakelbord::setBitLED(int value) { _bitLED = value;}int Schakelbord::getAdresSwitch() { return _adresSwitch;}void Schakelbord::setAdresSwitch(int value) { _adresSwitch = value;}int Schakelbord::getBitSwitch() { return _bitSwitch;}void Schakelbord::setBitSwitch(int) { _bitSwitch = value;}
/* * Schakelbord.h * * Created on: 27.09.2015 * Version: 0.1 * Changes: Initial version * * interface hardware needed ! */#ifndef Schakelbord_H_#define Schakelbord_H_class Schakelbord {public: Schakelbord(int); // Constructor with pinnumber Schakelbord(); // Empty constructor void pin(int); // Initialise pin`` int read(); // Read value switch int pulse(); // Read value switch and make it a pulse void set(int); // Set LED on/off_type int get(); // Get state LED void setInvers(bool); bool getProcessed(); void setProcessed(bool); int getAdresLED(); void setAdresLED(int); int getBitLED(); void setBitLED(int); int getAdresSwitch(); void setAdresSwitch(int); int getBitSwitch(); void setBitSwitch(int); protected:private: const int SETDENDER = 3; int _pin; int _stand; int _dender; bool _invers; int _pulse; int _adresLED; int _bitLED; int _adresSwitch; int _bitSwitch; bool _processed;};#endif /* Schakelbord_H_ */
// Set LED on or offvoid Schakelbord::set(int stand) { if (_invers) { digitalWrite(_pin, stand); } else{ digitalWrite(_pin, !stand); } _stand = stand;}
De Arduino zelf heeft alleen maar instructies om de uitgang hoog of laag te maken.
Is een idee dat ik uit moet proberen. Stuit me wel tegen de borst een uitgang kortsluiten naar ground. Ik verwacht dat het misgaat, want de LED wordt 90% van de tijd geactiveerd.
digitalWrite is geen macro maar gewoon een functie.Wat bedoel je hiermee? Zijn digitale uitgnagen dus ja, hoog of laag. Maar je kunt ze ook gewoon on the fly schakelen naar een input.
Hoezo zou dit mis gaan? Als de led geactiveerd is dan is de pin toch ook gewoon al laag? Enige effect is dat de knop nu iets meer effect heeft op de led. Nu heeft het alleen tijdens het pollen even effect dus afhankelijk van hoe vaak je pollt.
// Lees de stand van de schakelaar/drukknopint Schakelbord::read() { int temp; // Set pin to input and read pinMode(_pin, INPUT); digitalWrite(_pin, HIGH); // Set pullup on <-- Toevoeging temp = digitalRead(_pin); // Set pin to output and restore pinMode(_pin, OUTPUT); set(_stand); // Ontdender de terugmelding if (temp == 0) { _dender = SETDENDER; // Set waittime back to start. } else { if (_dender != 0) { _dender--; // Continue waiting, temp = 0; // Report open switch } } return temp;}
Aangezien ik de assembly vrij goed ken, begin ik af en toe zelf voor compiler te spelen en doe alvast wat zaken die in de macro functie gebeuren.
Maar corrigeer me als ik je fout begrepen heb.
// Lees de stand van de schakelaar/drukknopbool Schakelbord::read() { bool temp; //bool is groot genoeg ;) // Set pin to input and read pinMode(_pin, INPUT_PULLUP); temp = digitalRead(_pin); // Just restore //pinMode(_pin, OUTPUT); set(_stand); if (temp == 0) { _dender = SETDENDER; // Set waittime back to start. } else { if (_dender != 0) { _dender--; // Continue waiting, temp = 0; // Report open switch } } return temp;}// Set LED on or offvoid Schakelbord::set(int stand) { //Zou er overigens er een bool van maken ipv een int... //Overigens zouden volgens mij alle int's vervangen kunnen worden door een bool of byte _stand = stand; if(_invers){ stand != stand; } if(stand){ digitalWrite(_pin, LOW); //Need this order! Otherwise the output is pulled pinMode(_pin, OUTPUT); //high for a short time => shortcircuit possible } else{ pinMode(_pin, INPUT_PULLUP); } /*if (_invers) { if (stand == 0) { digitalWrite(_pin, LOW); // LED on } else { digitalWrite(_pin, HIGH); // LED off } } else { if (stand == 0) { digitalWrite(_pin, HIGH); // LED off } else { digitalWrite(_pin, LOW); // LED on } } _stand = stand;*/}
Vraagje van meer algemene aard.Bestaat er al een selectrix centrale op basis van een arduino ?ik heb het forum wat doorgelezen en kom af en toe wel artikelen tegen maar ik krijg de indruk dat er nog niet iets is nabouwbaars is.wie geeft mij wat licht op deze zaak ?