als schakelaar te lang is ingedrukt uitschakelen

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 46
Geregistreerd: 13 Okt 2016, 22:25

als schakelaar te lang is ingedrukt uitschakelen

Berichtdoor tijne » 19 Nov 2016, 20:02

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

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

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: als schakelaar te lang is ingedrukt uitschakelen

Berichtdoor Koepel » 19 Nov 2016, 20:27

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.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: als schakelaar te lang is ingedrukt uitschakelen

Berichtdoor nicoverduin » 19 Nov 2016, 20:57

Millis() gaat na 49 dagen door 0. Denk jij dat zijn vrouw 49 dagen in die auto rijdt aaneengesloten?
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: als schakelaar te lang is ingedrukt uitschakelen

Berichtdoor shooter » 19 Nov 2016, 21:21

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.
paul deelen
shooter@home.nl

Berichten: 46
Geregistreerd: 13 Okt 2016, 22:25

Re: als schakelaar te lang is ingedrukt uitschakelen

Berichtdoor tijne » 19 Nov 2016, 21:32

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

Berichten: 46
Geregistreerd: 13 Okt 2016, 22:25

Re: als schakelaar te lang is ingedrukt uitschakelen

Berichtdoor tijne » 27 Nov 2016, 20:11

kan iemand mij op weg helpen?

op welke term moet ik zoeken?
gr martijn

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: als schakelaar te lang is ingedrukt uitschakelen

Berichtdoor Koepel » 27 Nov 2016, 21:43

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().

Berichten: 46
Geregistreerd: 13 Okt 2016, 22:25

Re: als schakelaar te lang is ingedrukt uitschakelen

Berichtdoor tijne » 01 Dec 2016, 20:04

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

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: als schakelaar te lang is ingedrukt uitschakelen

Berichtdoor Koepel » 01 Dec 2016, 20:25

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.
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;
    }
  }
  ...
}

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 12 gasten