Led vertraagd uitschakelen

algemene C code
Berichten: 22
Geregistreerd: 02 Dec 2013, 05:52

Led vertraagd uitschakelen

Berichtdoor KRISKRAS9660 » 23 Jan 2014, 01:03

Hallo Wie kan me opweg helpen om vb een led vertraagd te laten uitschakelen zonder gebruik te maken van de" delay "functie
Heeft iemand een voorstel wat ik in de plaats van delay kan gebruiken om mijn led vertraagd uit te schakelen.
ik heb al eens geexpirementeerd met "#metro.h" maar is me niet gelukt.
of eventueel een voorbeeldje???
alvast bedankt voor de reactie.

Code: Alles selecteren
const int buttonPin = 2;     // the number of the pushbutton pin
const int ledPin =  9;      // the number of the LED pin
 
// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status
 

void setup() {

   // initialize the LED pin as an output:
   pinMode(ledPin, OUTPUT);
     
   // initialize the pushbutton pin as an input:
   pinMode(buttonPin, INPUT);     
}
 
void loop(){
   // read the state of the pushbutton value:
   buttonState = digitalRead(buttonPin);
 
  // check if the pushbutton is pressed.
   // if it is, the buttonState is HIGH:

   if (buttonState == HIGH) {     
    // turn LED on:   
     digitalWrite(ledPin, HIGH);
 
     delay (2000);

     // turn LED off:
     digitalWrite(ledPin, LOW);
 }
}

Advertisement

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

Re: Led vertraagd uitschakelen

Berichtdoor nicoverduin » 23 Jan 2014, 08:25

Code: Alles selecteren
// Do not remove the include below
#include "test.h"

#define DELAY_TIME 2000L // delay time before switching led off

const int buttonPin = 2;     // the number of the pushbutton pin
const int ledPin =  9;      // the number of the LED pin
 
// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status
unsigned long ctr = 0L;
 

void setup() {

   // initialize the LED pin as an output:
   pinMode(ledPin, OUTPUT);
     
   // initialize the pushbutton pin as an input:
   pinMode(buttonPin, INPUT);     
}
 
void loop(){
   // read the state of the pushbutton value:
   buttonState = digitalRead(buttonPin);
 
   // check if the pushbutton is pressed.
   // if it is, the buttonState is HIGH:

   if (buttonState == HIGH) {     
    // turn LED on:   
     digitalWrite(ledPin, HIGH);
     //
     // set the timer
     //
     ctr = millis() + DELAY_TIME;
   }
   //
   // is the timer running
   //
   if (ctr != 0 ) {
      if (millis() > ctr) {
            // turn LED off:
            digitalWrite(ledPin, LOW);
           ctr = 0;
   }
   }
}
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 22
Geregistreerd: 02 Dec 2013, 05:52

Re: Led vertraagd uitschakelen

Berichtdoor KRISKRAS9660 » 23 Jan 2014, 18:12

Dag ,
Nico bedankt voor de tip (voorbeeld) maar als ik deze wil testen geeft hij een fout bij het uploaden.
Fout:
In file included from Led_vertraagd_uitschakelen.ino:1:
C:\Users\Laptop K-K\Documents\Arduino\libraries\Test/Test.h:11:24: error: WConstants.h: No such file or directory

ik heb nochthans "#include "test.h" " toegevoegd aan mijn bibliotheek en het programma heropgestart.

Heb er iemand een vermoeden wat ik heb fout gedaan.

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

Re: Led vertraagd uitschakelen

Berichtdoor shooter » 23 Jan 2014, 18:52

die moet dus in de map libraries en dan een map test aanmaken en daar moet dan test.h inkomen.
een andere manier is attach library
kijk maar naar de foutregel in jouw eigen bericht
paul deelen
shooter@home.nl

Berichten: 22
Geregistreerd: 02 Dec 2013, 05:52

Re: Led vertraagd uitschakelen

Berichtdoor KRISKRAS9660 » 25 Jan 2014, 22:17

Dag,
Kan iemand me een tip geven waarom het me niet lukt met dit stukje code om een led vertraagd te laten uitschakelen?
ik zou dit graag onder de knie krijgen...
alvast bedank ...

Code: Alles selecteren

// set pin numbers:
 const int buttonPin = 2;     // the number of the pushbutton pin
 const int ledPin =  9;      // the number of the LED pin
 
// Variables will change:
 int buttonState = 0;         // variable for reading the pushbutton status
 long previousMillis = 0L;        // will store last time LED was updated
 
 unsigned long currentMillis = millis();
 long interval = 2000L;           // interval  (milliseconds)
 
void setup() {
   // initialize the pushbutton pin as an input:
   pinMode(buttonPin, INPUT);     
   // set the digital pin as output:
   pinMode(ledPin, OUTPUT);     
 }
 
void loop()
 {
 // read the state of the pushbutton value:
   buttonState = digitalRead(buttonPin);
   
     // if it is, the buttonState is HIGH:
     //if (buttonState == HIGH) {

             if (digitalRead(buttonPin)==HIGH){
       
     // turn LED off:
     digitalWrite(ledPin, HIGH);
     
      // set the timer
     previousMillis = currentMillis + interval;
   }
      //is the timer running
      if (previousMillis !=0 ){
        if (currentMillis > previousMillis){
         
        // turn LED off:
        digitalWrite(ledPin, LOW);
        previousMillis = 0 ;
   }
 }
 }

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

Re: Led vertraagd uitschakelen

Berichtdoor nicoverduin » 26 Jan 2014, 16:33

currentMillis vul je een keer bij opstarten en daarna niet meer.
Als je currentMillis gewoon de nek omdraait en woon als je een counter wil vergelijk met NU dan gewoon millis() uitvoeren. Het klopt dat je programma het niet doet.

Verder weet ik niet hoe je de LEDS hebt geschakeld. Maar als de LED tussen de pin en GND hangt dan moet je een HIGH schrijven naar de datapin om hem aan te zetten en LOW om hem uit te zetten. En let op de polriteit van de LED.

Daarnaast is het ook van belang hoe je de button hebt aangesloten. Als je een schakelaar hebt die als hij AAN is naar GND sluit, dan moet je OF een weerstand (iets van 4K7- 10K) tussen de datapin en VC aansluiten. Wat ook meestal werkt is pinMode(buttonPin, INPUT_PULLUP); digitalWrite(buttonPin, HIGH). In beide gevallen blijft de datapin ZEKER hoog totdat je de schakelaar indrukt.
Omgekeerd als je een schakelaar hebt die de datapin met VCC verbindt, dan moet je een weerstand verbinden tussen de datapin en GND (wederom iets van 4.7K - 10K).

De reden om dit te doen is om er zeker van de zijn dat je een bekende waarde hebt als hij UIT cq AAN staat. Als je de pin laat "zweven" dan kun je een onverwachte waarde krijgen totdat je de schakelaar hebt ingedrukt.
Verder zou ik bij schakelaars rekening houden met het trillen van de contacten. Asl je een schakelaar aanzet, dan veren de contacten wat na. Wat ik zelf meestal doe is na het lezen van de pin en deze is "AAN" dan wacht ik iets van 10mS en lees nog een keer.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 22
Geregistreerd: 02 Dec 2013, 05:52

Led vertraagd uitschakelen met webpagina

Berichtdoor KRISKRAS9660 » 25 Mrt 2014, 16:11

Dag,
Het is me ondertussen gelukt om simpel weg een led aan te schakelen en die na x aantal tijd te laten uitschakelen met de "elapsedMillis.h" timer.
Hoe pak ik dit aan om hetzelfde te realiseren via een webpagina.
Het is me ondertussen ook gelukt om led's aan en uit te schakelen via de druktoetsen van een webpagina.
Ik zit wat vast omdat het me niet lukt om bv een led aan te schakelen via een druktoets van een webpagina en deze na x aantal tijd te laten uitschakelen.
Kan iemand me op weg helpen ,mijn code eens te bekijken en zeggen wat ik verkeerd doe of wat ik moet doen ;).

een stukje code hier , onderaan staat mijn ganse code
Code: Alles selecteren
void SetLEDs(void)
    {
              elapsedMillis timer0;
              #define interval0 6000        // the interval in mS
              boolean timer0Fired;
   
       //LED 1 (pin 7) VERWARMING_LIVING
     if (StrContains(HTTP_req, "LED1=1")) {                //webdrukknop VERWARMING_LIVING
        timer0Fired = false;
        timer0 = 0; // clear the timer at the end of startup
        LED_state[0] = 1;                                 // VERWARMING_LIVING ingeschakeld
        digitalWrite(7, HIGH);
    }
        else if ((StrContains(HTTP_req, "LED1=0"))||((!timer0Fired) && (timer0 > interval0))){        //webdrukknop VERWARMING_LIVING             
        LED_state[0] = 0;                                 // VERWARMING_LIVING uitgeschakeld
        digitalWrite(7, LOW);
    }


Ganse code
Code: Alles selecteren


/*--------------------------------------------------------------
  Program:      Domotica_server

  Description:  Arduino web server that displays 4 analog inputs,
                7 outputs
               
                The web page is stored on the micro SD card.
 
  Hardware:     Arduino Uno and official Arduino Ethernet
                shield. Should work with other Arduinos and
                compatible Ethernet shields.
                2Gb micro SD card formatted FAT16.
                A2 to A5 analog inputs,
                pins 2, 3 and 5,6,7,8,9 for the switches outputs(LEDs).
               
  Software:     Developed using Arduino 1.0.5 software
                Should be compatible with Arduino 1.0 +
                SD card contains web page called index.htm
 
 

--------------------------------------------------------------*/

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
#include <elapsedMillis.h>

// size of buffer used to capture HTTP requests
#define REQ_BUF_SZ   60

// MAC address from Ethernet shield sticker under board
//byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x94, 0x59 };   //
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0E, 0x0D, 0xC7 };
byte gateway[] = { 192, 168, 0, 1 };                   //
byte subnet[] = { 255, 255, 255, 0 };                  //
IPAddress ip(192, 168, 0, 20); // IP address, may need to change depending on network
EthernetServer server(80);  // create a server at port 80
File webFile;               // the web page file on the SD card
char HTTP_req[REQ_BUF_SZ] = {0}; // buffered HTTP request stored as null terminated string
char req_index = 0;              // index into HTTP_req buffer
boolean LED_state[7] = {0}; // stores the states of the LEDs

void setup()
{
    // disable Ethernet chip
    pinMode(10, OUTPUT);
    digitalWrite(10, HIGH);
   
    Serial.begin(9600);       // for debugging
   
    // initialize SD card
    Serial.println("Initializing SD card...");
    if (!SD.begin(4)) {
        Serial.println("ERROR - SD card initialization failed!");
        return;    // init failed
    }
    Serial.println("SUCCESS - SD card initialized.");
    // check for index.htm file
    if (!SD.exists("index.htm")) {
        Serial.println("ERROR - Can't find index.htm file!");
        return;  // can't find index file
    }
    Serial.println("SUCCESS - Found index.htm file.");
    // switches on pins 2, 3 and 5
   
    pinMode(0, INPUT);
    pinMode(1, INPUT);
    // LEDs   
    pinMode(2, OUTPUT);
    pinMode(3, OUTPUT);
    //pin 4 for SD card
    pinMode(5, OUTPUT);
    pinMode(6, OUTPUT);
    pinMode(7, OUTPUT);
    pinMode(8, OUTPUT);
    pinMode(9, OUTPUT);
    // pin 10,11,12,13 for ethernet
    // A0 = pin16  ->is hier digitaal ingesteld
    // A1 analoge ingang 1
    // A2 analoge ingang 2
    // A3 analoge ingang 3
    // A4 analoge ingang 4
    // A5 analoge ingang 5
       
    Ethernet.begin(mac, ip);  // initialize Ethernet device
    server.begin();           // start to listen for clients
}

void loop()
{
    EthernetClient client = server.available();  // try to get client

    if (client) {  // got client?
        boolean currentLineIsBlank = true;
        while (client.connected()) {
            if (client.available()) {   // client data available to read
                char c = client.read(); // read 1 byte (character) from client
                // limit the size of the stored received HTTP request
                // buffer first part of HTTP request in HTTP_req array (string)
                // leave last element in array as 0 to null terminate string (REQ_BUF_SZ - 1)
                if (req_index < (REQ_BUF_SZ - 1)) {
                    HTTP_req[req_index] = c;          // save HTTP request character
                    req_index++;
                }
                // last line of client request is blank and ends with \n
                // respond to client only after last line received
                if (c == '\n' && currentLineIsBlank) {
                    // send a standard http response header
                    client.println("HTTP/1.1 200 OK");
                    // remainder of header follows below, depending on if
                    // web page or XML page is requested
                    // Ajax request - send XML file
                    if (StrContains(HTTP_req, "ajax_inputs")) {
                        // send rest of HTTP header
                        client.println("Content-Type: text/xml");
                        client.println("Connection: keep-alive");
                        client.println();
                        SetLEDs();
                        // send XML file containing input states
                        XML_response(client);
                    }
                    else {  // web page request
                        // send rest of HTTP header
                        client.println("Content-Type: text/html");
                        client.println("Connection: keep-alive");
                        client.println();
                        // send web page
                        webFile = SD.open("index.htm");        // open web page file
                        if (webFile) {
                            while(webFile.available()) {
                                client.write(webFile.read()); // send web page to client
                            }
                            webFile.close();
                        }
                    }
                    // display received HTTP request on serial port
                    Serial.print(HTTP_req);
                    // reset buffer index and all buffer elements to 0
                    req_index = 0;
                    StrClear(HTTP_req, REQ_BUF_SZ);
                    break;
                }
                // every line of text received from the client ends with \r\n
                if (c == '\n') {
                    // last character on line of received text
                    // starting new line with next character read
                    currentLineIsBlank = true;
                }
                else if (c != '\r') {
                    // a text character was received from client
                    currentLineIsBlank = false;
                }
            } // end if (client.available())
        } // end while (client.connected())
        delay(1);      // give the web browser time to receive the data
        client.stop(); // close the connection
    } // end if (client)
}

// checks if received HTTP request is switching on/off LEDs
// also saves the state of the LEDs
void SetLEDs(void)
    {
              elapsedMillis timer0;
              #define interval0 6000        // the interval in mS
              boolean timer0Fired;


   
       //LED 1 (pin 7) VERWARMING_LIVING
     if (StrContains(HTTP_req, "LED1=1")) {                //webdrukknop VERWARMING_LIVING
        timer0Fired = false;
        timer0 = 0; // clear the timer at the end of startup
        LED_state[0] = 1;                                 // VERWARMING_LIVING ingeschakeld
        digitalWrite(7, HIGH);
    }
        if ((!timer0Fired) && (timer0 > interval0)){        //webdrukknop VERWARMING_LIVING             
        LED_state[0] = 0;                                 // VERWARMING_LIVING uitgeschakeld
        digitalWrite(7, LOW);
    }


     // LED 2 (pin 8) VERWARMING_BADKAMER
     if (StrContains(HTTP_req, "LED2=1")){                //webdrukknop VERWARMING_BADKAMER     
        LED_state[1] = 1;                                 // VERWARMING_BADKAMER ingeschakeld
        digitalWrite(8, HIGH);
    }
        else if (StrContains(HTTP_req, "LED2=0")){        //webdrukknop VERWARMING_BADKAMER             
        LED_state[1] = 0;                                 // VERWARMING_BADKAMER uitgeschakeld
        digitalWrite(8, LOW);
    }
   
      // LED 3 (pin 9)BOILER
        int Boilerknop = 0;
        Boilerknop = digitalRead(16);                      // read the input pin A2 alarm drukknop
     if ((StrContains(HTTP_req, "LED3=1"))||((LED_state[0] == 0)&&(Boilerknop == HIGH))){       //webdrukknop BOILER     
        LED_state[2] = 1;                                 // BOILER ingeschakeld
        digitalWrite(9, HIGH);
    }
        else if ((StrContains(HTTP_req, "LED3=0"))||((LED_state[0] == 1)&&(Boilerknop == HIGH))){   //webdrukknop BOILER             
        LED_state[2] = 0;                                 // BOILER uitgeschakeld
        digitalWrite(9, LOW);
    }

}

// send the XML file with analog values, switch status
//  and LED status
void XML_response(EthernetClient cl)
{
    int analog_val;            // stores value read from analog inputs
    int count;                 // used by 'for' loops
   
    cl.print("<?xml version = \"1.0\" ?>");
    cl.print("<inputs>");
    // read analog inputs
    for (count = 2; count <= 5; count++) { // A2 to A5
        analog_val = analogRead(count);
        cl.print("<analog>");
        cl.print(analog_val);
        cl.println("</analog>");
    }
   

     
     
     
     
    // read switches

    // checkbox LED states

    // button LED states
   
    // LED1
    cl.print("<LED>");
    if (LED_state[0]) {
        cl.print("on");
    }
    else {
        cl.print("off");
    }
    cl.println("</LED>");
    // LED2
    cl.print("<LED>");
    if (LED_state[1]) {
        cl.print("on");
    }
    else {
        cl.print("off");
    }
    cl.println("</LED>");
    // LED3
    cl.print("<LED>");
    if (LED_state[2]) {
        cl.print("on");
    }
    else {
        cl.print("off");
    }
    cl.println("</LED>");
   
    cl.print("</inputs>");
}

// sets every element of str to 0 (clears array)
void StrClear(char *str, char length)
{
    for (int i = 0; i < length; i++) {
        str[i] = 0;
    }
}

// searches for the string sfind in the string str
// returns 1 if string found
// returns 0 if string not found
char StrContains(char *str, char *sfind)
{
    char found = 0;
    char index = 0;
    char len;

    len = strlen(str);
   
    if (strlen(sfind) > len) {
        return 0;
    }
    while (index < len) {
        if (str[index] == sfind[found]) {
            found++;
            if (strlen(sfind) == found) {
                return 1;
            }
        }
        else {
            found = 0;
        }
        index++;
    }

    return 0;
}

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

Re: Led vertraagd uitschakelen

Berichtdoor nicoverduin » 25 Mrt 2014, 20:46

logisch:
Dit gaat sowieso fout :
Code: Alles selecteren
void SetLEDs(void) {
   elapsedMillis timer0;
#define interval0 6000        // the interval in mS
   boolean timer0Fired;


De 3 regels na de functie definitie zijn local. Met andere woorden die worden elke keer opnieuw gecreëerd als de functie wordt aangeroepen. Dus heb je hem net gezet bij het aanroepen van die functie, ben je de setting weer kwijt zodra de functie is afgelopen.
Probeer het eens door ze voor de allereerste functie te zetten. Bijvoorbeeld net na de include statements. En gelijk verwijderen uit de functie zelf anders gaat het nog steeds niet goed.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 22
Geregistreerd: 02 Dec 2013, 05:52

Re: Led vertraagd uitschakelen

Berichtdoor KRISKRAS9660 » 26 Mrt 2014, 13:21

merci Nico voor de tip.
het is me uiteindelijk gelukt...

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 19 gasten