als schakelaar te lang is ingedrukt uitschakelen
9 berichten
• Pagina 1 van 1
als schakelaar te lang is ingedrukt uitschakelen
beste,
ik heb de fout gemaakt om mijn vrouw in mijn auto te laten rijden (dom dom dom ik weet het) maar mijn auto heeft standaard knipperlichten die 3 maal knipperen als je de hendel even aan raakt mijn vrouw haar auto heeft dat niet en heeft nu dus mij aan het werk gezet.
nu ben ik al een aardig end met de code maar 1 ding lukt met niet: als d hendel langer dan 2 sec actief blijft dat dan het relais niet meer word bekrachtigt.
hier mijn code
wie o wie kan mij hier mee verder helpen?
gr martijn
ik heb de fout gemaakt om mijn vrouw in mijn auto te laten rijden (dom dom dom ik weet het) maar mijn auto heeft standaard knipperlichten die 3 maal knipperen als je de hendel even aan raakt mijn vrouw haar auto heeft dat niet en heeft nu dus mij aan het werk gezet.
nu ben ik al een aardig end met de code maar 1 ding lukt met niet: als d hendel langer dan 2 sec actief blijft dat dan het relais niet meer word bekrachtigt.
hier mijn code
- Code: Alles selecteren
const int knl = 2;
const int knr = 3;
const int knrell = 5;
const int knrelr = 6;
const int rest = 8;
unsigned long starttime = 0;
unsigned long endtime = 0;
unsigned long vertraging = 5000;
unsigned long maxschakeltijd = 1000;
unsigned long duration = 0;
void setup() {
pinMode(knl, INPUT);
pinMode(knr, INPUT);
pinMode(knrell, OUTPUT);
pinMode(knrelr, OUTPUT);
pinMode(rest, OUTPUT);
digitalWrite(knl, HIGH);
digitalWrite(knr, HIGH);
digitalWrite(knrell, HIGH);
digitalWrite(knrelr, HIGH);
digitalWrite(rest, LOW);
Serial.begin(9600);
}
void loop() {
int toetsWaarde = digitalRead(knl);
int toetsWaarde1 = digitalRead(knr);
// if (maxschakeltijd < duration) {
// digitalWrite(8, 1);
// }
//else {
// digitalWrite(8, 0);
// duration = 0;
//}
if (millis() >= endtime || (toetsWaarde == LOW || toetsWaarde1 == LOW) && starttime != 0) {
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
starttime = 0;
}
if (toetsWaarde == 0 && toetsWaarde1 == 1) {
if (starttime == 0) {
starttime = millis();
endtime = starttime + vertraging;
digitalWrite(5, LOW);
// duration =
// duration = pulseIn(digitalRead (2), LOW);
}
}
if (toetsWaarde1 == 0 && toetsWaarde == 1) {
if (starttime == 0) {
starttime = millis();
endtime = starttime + vertraging;
digitalWrite(6, LOW);
//duration = duration + pulseIn(digitalRead (3), LOW);
}
}
Serial.println(digitalRead(8));
/* if (maxschakeltijd > duration) {
Serial.print(" NIETS DOEN ");
bla = 0;
} else {
Serial.print(" IETS DOEN: ");
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
endtime = millis();
starttime = 0;
duration = 0;
Serial.print(endtime);
delay(500);
}
*/
}
wie o wie kan mij hier mee verder helpen?
gr martijn
Advertisement
Re: als schakelaar te lang is ingedrukt uitschakelen
Een Arduino in je auto ? De Arduino is alleen voor prototyping. Volgens mij is het nodig dat de voedingsingang dan bestand is tegen 120V spanningspieken. En als er iets zou gebeuren en de verzekering ziet dat je niet-goedgekeurde en niet-gecertificeerde elektronica hebt, dan kun je het wel vergeten.
De waarde van millis() telt altijd op. Na 0xFFFFFFFF komt 0x00000000. Daarom mag je geen getal bij millis() optellen. Dat heeft te maken met de rekenkundige manier waarop met de 32-bit unsigned long wordt omgegaan. Je mag het huidige tijdstip onthouden (previousMillis = millis()) en je mag het verschil berekenen (millis() - previousMillis).
Om een tijdvertraging te starten gebruik ik daarnaast altijd een tweede variabele (bijvoorbeeld een 'boolean') die aangeeft of de tijdvertraging op dat moment aktief is. Je lijkt nu 'starttime' te gebruiken die aangeeft of de vertraging aktief is, door de waarde nul als niet aktief te beschouwen. Dat kan niet, want millis() wordt ook wel eens nul. Ook al is dat gedurende 1 milliseconde in 50 dagen, het is een verkeerde manier om een programma te schrijven.
Ik heb even snel naar de sketch gegeken, maar ik begrijp de bedoeling niet.
De waarde van millis() telt altijd op. Na 0xFFFFFFFF komt 0x00000000. Daarom mag je geen getal bij millis() optellen. Dat heeft te maken met de rekenkundige manier waarop met de 32-bit unsigned long wordt omgegaan. Je mag het huidige tijdstip onthouden (previousMillis = millis()) en je mag het verschil berekenen (millis() - previousMillis).
Om een tijdvertraging te starten gebruik ik daarnaast altijd een tweede variabele (bijvoorbeeld een 'boolean') die aangeeft of de tijdvertraging op dat moment aktief is. Je lijkt nu 'starttime' te gebruiken die aangeeft of de vertraging aktief is, door de waarde nul als niet aktief te beschouwen. Dat kan niet, want millis() wordt ook wel eens nul. Ook al is dat gedurende 1 milliseconde in 50 dagen, het is een verkeerde manier om een programma te schrijven.
Ik heb even snel naar de sketch gegeken, maar ik begrijp de bedoeling niet.
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: als schakelaar te lang is ingedrukt uitschakelen
Millis() gaat na 49 dagen door 0. Denk jij dat zijn vrouw 49 dagen in die auto rijdt aaneengesloten?
Re: als schakelaar te lang is ingedrukt uitschakelen
je had al gemerkt dat het met pulsein niet werkt.
als een schakelaar aangaat dan een starttijd op de millis() zetten.
als zelfde schakelaar na 2 seconden = 2000 nog aan staat dan realis weer uit.
als een schakelaar aangaat dan een starttijd op de millis() zetten.
als zelfde schakelaar na 2 seconden = 2000 nog aan staat dan realis weer uit.
paul deelen
shooter@home.nl
shooter@home.nl
Re: als schakelaar te lang is ingedrukt uitschakelen
shooter schreef:je had al gemerkt dat het met pulsein niet werkt.
als een schakelaar aangaat dan een starttijd op de millis() zetten.
als zelfde schakelaar na 2 seconden = 2000 nog aan staat dan realis weer uit.
heb jij meschien een voorbeeld code voor me waar ik mee verder kan?\
gr martijn
Re: als schakelaar te lang is ingedrukt uitschakelen
kan iemand mij op weg helpen?
op welke term moet ik zoeken?
gr martijn
op welke term moet ik zoeken?
gr martijn
Re: als schakelaar te lang is ingedrukt uitschakelen
Alles wat met millis() en I2C te maken heeft vind ik leuk, maar ik begrijp echt de bedoeling niet.
Je kunt het eerst met delay() maken en daarna omzetten naar millis().
Je kunt het eerst met delay() maken en daarna omzetten naar millis().
Re: als schakelaar te lang is ingedrukt uitschakelen
sorry voor de late reactie.
de bedoeling is dat er een knopword in gedrukt en dat dan een relais een bepaade tijd actief blijft en na die tijd moet hij uitschakelen ook al is de knop nog in gedrukt.
gr martijn
de bedoeling is dat er een knopword in gedrukt en dat dan een relais een bepaade tijd actief blijft en na die tijd moet hij uitschakelen ook al is de knop nog in gedrukt.
gr martijn
Re: als schakelaar te lang is ingedrukt uitschakelen
Dan is het handig als je het moment weet waarop de knop wordt geactiveerd.
Dat kan met de StateChangeDetection: https://www.arduino.cc/en/Tutorial/StateChangeDetection.
Maar het kan ook met de Bounce2 library : https://github.com/thomasfredericks/Bounce2, omdat die al een state change detection heeft ingebouwd met de functies rose() en fell() (zie de wiki op Github).
Het is niet nodig om een van die twee te gebruiken, je kunt ook zelf een vlag zetten (met een boolean variabele) en die vlag meteen gebruiken om aan te geven dat een software timer actief is. Maar dan heeft die vlag twee functies, en ik hou dat liever apart.
Ik gebruik vaak de term "boolean flag". Dat is een variabele die 'true' of 'false' kan zijn. Het is als het ware alsof iemand een vlag omhoog houdt als het 'true' is, en de vlag laat zakken als het 'false' is.
Als je dat hebt, dan kun je op het moment dat de knop wordt geactiveerd de huidige tijd onthouden en een vlag zetten.
Vervolgens ergens in de loop kijken of de tijd om is:
Dat kan met de StateChangeDetection: https://www.arduino.cc/en/Tutorial/StateChangeDetection.
Maar het kan ook met de Bounce2 library : https://github.com/thomasfredericks/Bounce2, omdat die al een state change detection heeft ingebouwd met de functies rose() en fell() (zie de wiki op Github).
Het is niet nodig om een van die twee te gebruiken, je kunt ook zelf een vlag zetten (met een boolean variabele) en die vlag meteen gebruiken om aan te geven dat een software timer actief is. Maar dan heeft die vlag twee functies, en ik hou dat liever apart.
Ik gebruik vaak de term "boolean flag". Dat is een variabele die 'true' of 'false' kan zijn. Het is als het ware alsof iemand een vlag omhoog houdt als het 'true' is, en de vlag laat zakken als het 'false' is.
Als je dat hebt, dan kun je op het moment dat de knop wordt geactiveerd de huidige tijd onthouden en een vlag zetten.
- Code: Alles selecteren
unsigned long previousMillis();
boolean timerActive = false;
void loop()
{
...
if( knop.fell())
{
// active the relay
digitalWrite( ...);
// start the software timer
previousMillis = millis();
timerActive = true;
}
...
}
Vervolgens ergens in de loop kijken of de tijd om is:
- Code: Alles selecteren
void loop()
{
...
if( timerActive)
{
if( millis() - previousMillis >= 5000)
{
// stop the relay
digitalWrite( ...);
// disable the software timer
timerActive = false;
}
}
...
}
9 berichten
• Pagina 1 van 1
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 12 gasten