netjes programmeren.

Arduino specifieke Software
Berichten: 9
Geregistreerd: 06 Sep 2016, 20:56

netjes programmeren.

Berichtdoor Arrie » 02 Okt 2016, 15:27

Er zit nog al wat verschil met wat ik denk te programmeren en wat het resultaat is


const int buttonPin = 2; // nummer drukknop ingang pin
const int ledPin1 = 13; // nummer uitgang pin
const int ledPin2 = 12; // nummer uitgang pin

int buttonState = 0; // variable voor het lezen van ingang status

void setup() {

pinMode(ledPin1, OUTPUT); // gebruik pin 13 als led uitgang
pinMode(ledPin2, OUTPUT); // gebruik pin 12 als led uitgang


pinMode(buttonPin, INPUT); // gebruik pin 2 als ingang
}

void loop() {

buttonState = digitalRead(buttonPin); // lees status drukknop,


if (buttonState == HIGH) { // controleer of de drukkopbediend is

digitalWrite(ledPin1, HIGH); // zet led 13 aan
} else {

digitalWrite(ledPin1, LOW); // anders zet 13 uit

}
if (buttonState == HIGH) { // controleer of de drukkop bediend is

delay(1000); // vertaagt insckakelen
digitalWrite(ledPin2, HIGH); // zet led 12 aan
} else {

delay(1000); // vertaagt uitschakelen
digitalWrite(ledPin2, LOW); // anders zet 12 uit

}
}


ik denk button op 2 schakelt direct led 13 in en direct bij loslaten led 13 uit

button op 2 schakelt led op 12 met 1 seconde vertraagt in en bij loslaten 1 seconde vertraagt led 12 uit.

maar de timers die ik gebruik met de led 12 hebben invloed op het led 13 als in dat led 13 pas na 1 seconde aan gaat bij het drukken op de drukknop.


ben heel benieuwd wat er fout gaat.

Advertisement

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

Re: netjes programmeren.

Berichtdoor Koepel » 02 Okt 2016, 16:25

Hallo, ik beantwoord graag vragen over millis() en I2C, en ik ruik hier een millis() ;)

Je wilt de led op pin 13 al uit doen, terwijl de led op pin 12 nog bezig is met de vertraging.
Dat lukt niet, want de delay() houdt de hele sketch op, pas een seconde later gaat het weer verder en dan wordt pas weer de button ingelezen en de led op pin 13 aan of uit gezet.

Kun je vertellen waar het voor is, en wat je wilt ?

Als je echt pin 13 wilt laten meegaan met de knop, en pin 12 datzelfde met vertraging, dan wil je twee dingen tegelijk doen.
Dat kan. Met millis().
Begin hier : https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay.
Je kunt meerdere van dergelijke constructies gebruiken (elk met een eigen previousMillis variabele) om meerdere dingen tegelijk te doen. Jouw ledjes is dan geen probleem, en je kunt tegelijkertijd bijvoorbeeld ook nog een melodie laten spelen, en sensors inlezen, dingen op een scherm schrijven, commando's lezen van de seriele poort, enzovoorts.

De Blink_Without_Delay gebruikt millis() met een interval, maar millis() kan ook gebruikt worden als een enkele timer, dus alleen om de led weer uit te zetten na een seconde.

Berichten: 9
Geregistreerd: 06 Sep 2016, 20:56

Re: netjes programmeren.

Berichtdoor Arrie » 03 Okt 2016, 18:49

Koepel schreef:Hallo, ik beantwoord graag vragen over millis() en I2C, en ik ruik hier een millis() ;)

Je wilt de led op pin 13 al uit doen, terwijl de led op pin 12 nog bezig is met de vertraging.
Dat lukt niet, want de delay() houdt de hele sketch op, pas een seconde later gaat het weer verder en dan wordt pas weer de button ingelezen en de led op pin 13 aan of uit gezet.


Ja dat heb ik gemerkt dacht dat delay als een timer (opkom vertraagt is wel de meest gebruikte in relais schakelingen plc techniek) zou werken maar het is gewoon een pauze in het programma. raar.

Als je echt pin 13 wilt laten meegaan met de knop, en pin 12 datzelfde met vertraging, dan wil je twee dingen tegelijk doen.
Dat kan. Met millis().


De Blink_Without_Delay gebruikt millis() met een interval, maar millis() kan ook gebruikt worden als een enkele timer, dus alleen om de led weer uit te zetten na een seconde.


Dank je wel voor je reactie, ga met millis aan de slag.

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

Re: netjes programmeren.

Berichtdoor nicoverduin » 03 Okt 2016, 23:00

Een Arduino is geen PLC.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

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

Re: netjes programmeren.

Berichtdoor Koepel » 04 Okt 2016, 18:25

Nu ik er over nadenk, is het voor mij niet duidelijk wat je wilt. Zou je dat precies willen omschrijven ?

Als de button 100ms aan is, wil je dan de led met een vertraging van 1 seconde ook 100ms aan laten gaan ?
Als er een soort morse code met de button wordt gedaan, wil je dan hele puls trein herhalen met 1 seconde vertraging ? Ook als die pulsen continue door blijven gaan ?

Met twee previousMillis variabelen en twee boolean variabelen is er iets te maken.
Ik gebruikte ook dit voorbeeld : https://www.arduino.cc/en/Tutorial/StateChangeDetection.

Code: Alles selecteren
// Delayed led.
// Delay to turn on, delay to turn off.
// But not repeating a pulse train.
//
// The button pressed for led off.
// The button released for led on.
//
// 4 okt 2016
// Arduino.cc 1.6.12, using an Arduino Uno.


const int ledPin = 13;    // onboard led of Arduino Uno, HIGH is on.
const int buttonPin = 2;  // a button to GND

unsigned long previousMillisOn;
unsigned long previousMillisOff;

const int delayOn = 1000;
const int delayOff = 1000;

boolean OnDelayActive = false;
boolean OffDelayActive = false;

int lastButtonState;

void setup()
{
//  Serial.begin( 9600);
//  Serial.print( "Started");

  pinMode( buttonPin, INPUT_PULLUP);
  pinMode( ledPin, OUTPUT);

  // set initial value for the led.
  lastButtonState = digitalRead( buttonPin);
  digitalWrite( ledPin, lastButtonState);
}

void loop()
{
  unsigned long currentMillis = millis();

  // ------------------------------------
  // check if something needs to be done.
  // ------------------------------------
  if( OnDelayActive)
  {
    if( currentMillis - previousMillisOn >= delayOn)
    {
      digitalWrite( ledPin, HIGH);    // led on
      OnDelayActive = false;        // disable this delay
    }
  }

  if( OffDelayActive)
  {
    if( currentMillis - previousMillisOff >= delayOff)
    {
      digitalWrite( ledPin, LOW);        // led off
      OffDelayActive = false;            // disable this delay
    }
  }

  // ------------------------------------
  // Read a change of the button.
  // ------------------------------------
  int buttonState = digitalRead( buttonPin);

  if( buttonState != lastButtonState)
  {
    if( buttonState == HIGH)
    {
      // The button is turned on at this very moment.
      previousMillisOn = currentMillis;  // timestamp this moment.
      OnDelayActive = true;              // enable this delay
    }
    else
    {
      // The button is turned off.
      previousMillisOff = currentMillis; // timestamp this moment.
      OffDelayActive = true;             // enable this delay
    }

    lastButtonState = buttonState;
  }

  // This delay is needed.
  // Without delay and with bouncing of the button, the on and off time
  // could be the same, resulting in a led that stays off, while the
  // button is released.
  delay( 10);
}

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 97 gasten