Switch case vraagje

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 59
Geregistreerd: 19 Mrt 2015, 01:17

Re: Switch case vraagje

Berichtdoor hazanovo » 13 Okt 2016, 22:43

Ik heb al met blink without delay geknutselt in het begin. Is me niet bevallen. Omdat de waardes niet LIVE waren. maar stillstonden.
En bijv iets doen elke 1000millis
en tegelijkertijd iets doen bij 2000 millis lukte ook niet.
Het was de 1 of de ander. Nu loopt mijn code vloeiend door en zie ik alles LIVE ipv een waarde hoe die was wanneer de millis werd geactiveerd.
Bijv op mijn lcd moest er elke 4000millis de tijd verschijnen voor 2000millis. Die verscheen ook, maar de seconden stonden stil dat bedoel ik met niet LIVE. Ze moeten door tikken, net als de temperatuur en de rest van de machine.

Advertisement

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

Re: Switch case vraagje

Berichtdoor nicoverduin » 13 Okt 2016, 22:47

hazanovo schreef:Ik heb al met blink without delay geknutselt in het begin. Is me niet bevallen. Omdat de waardes niet LIVE waren. maar stillstonden.
En bijv iets doen elke 1000millis
en tegelijkertijd iets doen bij 2000 millis lukte ook niet.
Het was de 1 of de ander. Nu loopt mijn code vloeiend door en zie ik alles LIVE ipv een waarde hoe die was wanneer de millis werd geactiveerd.
Bijv op mijn lcd moest er elke 4000millis de tijd verschijnen voor 2000millis. Die verscheen ook, maar de seconden stonden stil dat bedoel ik met niet LIVE. Ze moeten door tikken, net als de temperatuur en de rest van de machine.
Duidelijk nog niet begrepen.....
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 59
Geregistreerd: 19 Mrt 2015, 01:17

Re: Switch case vraagje

Berichtdoor hazanovo » 13 Okt 2016, 22:48

Nico nog niet maar alles valt te leren :)


dit is de code van wat ik bedoel met die millis...





cpp code
#include <LiquidCrystal.h>


#include <Time.h>
#include <TimeAlarms.h>
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(12, 11, 6, 5, 4, 3);
unsigned long previousMillis = 0;

int ventState=LOW;


int ledState = LOW;
int ledState2 = LOW;
unsigned long previousMillis1 = 0;
unsigned long previousMillis2 = 0;
long OnTime = 40000;
long OffTime = 19012;
long OnTime2 = 5555;
long OffTime2 = 4900;

const int systeemAan = 49; //output
const int rela1 = 31; //output
const int rela2 = 33; //output
const int rela3 = 35; //output
const int rela4 = 37; //output
const int ventilator = 41; //output
const int tempHome = 50; //input
const int alarm = 26; //input
const int systeemUit = 39;
int systemDown;//mbt systeemUit
const int tempRise = 51; //input
int Temp;
int Vocht;
int systemOn;

int tempRise1;
int tempHome1;

int buttonPushCounter = 25;
int buttonState = 0;
int lastButtonState = 0;

int temp20; //high or low mbt encoder0Pos

int tempSwitch; //kan gebruikt worden
int alarmData; //signaal als de CO2 sensor afgaat

//millis vertragign
long tijdVertragingLamp = 2000;


void setup()
{

Serial.begin(9600);

setTime(6, 30, 0, 1, 1, 11); // set time to Saturday 6:30:00am Jan 1 2011
lcd.begin(16, 2);

// Alarm.alarmRepeat(dowSaturday,8,30,30,WeeklyAlarm);
unsigned long currentMillis = millis();
pinMode(rela1, OUTPUT); //LAMP
pinMode(rela2, OUTPUT); //WATERPOMP
pinMode(rela3, OUTPUT); //OPTIONEEL
pinMode(rela4, OUTPUT); //BLUS SYSTEEM

pinMode(systeemAan, OUTPUT);
pinMode(ventilator, OUTPUT);
pinMode(tempHome, INPUT);
pinMode(tempRise, INPUT);
pinMode(alarm, INPUT);
pinMode(systeemUit, INPUT);
digitalWrite(systeemAan, HIGH);
digitalWrite(tempHome, HIGH);
digitalWrite(tempRise, HIGH);
digitalWrite(alarm, HIGH);
digitalWrite(systeemUit, HIGH);
digitalWrite(ventilator, LOW);
digitalWrite(rela1, HIGH);
digitalWrite(rela2, HIGH);
digitalWrite(rela3, HIGH);
digitalWrite(rela4, HIGH);

Serial.println("Waazzzaaap");


lcd.setCursor(6, 0);
lcd.print("Gegevens Ophalen.....");



for (int positionCounter = 0; positionCounter < 22; positionCounter++) {

lcd.scrollDisplayLeft();
delay(250);
}
dht.begin();

//Alarm.timerRepeat(, geefWater); // elke 5 minuten aan

Alarm.timerOnce(60, geefWater); // called once after 5 minutes
}

void loop() {

systemDown = digitalRead(systeemUit);
systemOn = digitalRead(systeemAan);
alarmData = digitalRead(alarm);
tempHome1 = digitalRead(tempHome);









if (alarmData == LOW) {
Serial.println("");
Serial.println("");
Serial.println("");
smokeDetected();
}
else if (systemDown == LOW) {
digitalWrite(systeemAan, LOW);
}
else if (systemDown == HIGH) {
digitalWrite(systeemAan, HIGH);
}







Alarm.alarmRepeat(6, 33, 0, MorningAlarm);
Alarm.alarmRepeat(00, 27, 0, EveningAlarm);
int tempWaarde;
unsigned int tempPlus = 20;
digitalWrite(rela2, LOW);
digitalWrite(rela4, HIGH);

long tijdVertragingCheck = 2000;
unsigned long previousMillis = 0;
unsigned long currentMillis = millis();

float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = true)
float f = dht.readTemperature(true);


// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}

// Compute heat index in Fahrenheit (the default)
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahreheit = false
float hic = dht.computeHeatIndex(t, h, false);


tempRise1 = digitalRead(tempRise); //lees de tempratuurknop
tempHome1 = digitalRead(tempHome);
tempWaarde = t; //tempratuur getal


if (tempHome1 == LOW) {
delay(300);
buttonPushCounter = 23;
Serial.println(buttonPushCounter);

}


else if (tempWaarde >= buttonPushCounter) { //ventilator aan wanneer tempratuur hoger is dan aangegeven
digitalWrite(ventilator, HIGH);
ventState=HIGH;
}
else if (tempWaarde <= buttonPushCounter) { //andersom
digitalWrite(ventilator, LOW);
ventState=LOW;
}

buttonState = digitalRead(tempRise);

// compare the buttonState to its previous state
if (buttonState != lastButtonState) {
// if the state has changed, increment the counter
if (buttonState == HIGH) {
// if the current state is HIGH then the button
// wend from off to on:
buttonPushCounter++;
Serial.println("");
Serial.print("Tempratuur nieuwe waarde: ");
Serial.println(buttonPushCounter);
delay(300);
}
// save the current state as the last state,
//for next time through the loop
lastButtonState = buttonState;
}




if ((ledState == HIGH) && (currentMillis - previousMillis1 >= OnTime))
{
ledState = LOW;
previousMillis1 = currentMillis;
lcd.clear();
lcd.setCursor(16, 0);
lcd.print("Made By I.Z.");
for (int positionCounter = 0; positionCounter < 29; positionCounter++) {

lcd.scrollDisplayLeft();
delay(250);

}
}
else if ((ledState == LOW) && (currentMillis - previousMillis1 >= OffTime))
{
ledState = HIGH;
previousMillis1 = currentMillis;

lcd.clear();


if (ventState==HIGH){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Systeem Bezig");
lcd.setCursor(0,1);
lcd.print("ventilator aan");
}
else if (ventState==LOW){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Systeem Stabiel");
lcd.setCursor(0,1);
lcd.print("ventilator uit");

}




}

else if ((ledState2 == HIGH) && (currentMillis - previousMillis2 >= OnTime2))
{
ledState2 = LOW;
previousMillis2 = currentMillis;
float t = dht.readTemperature();
float h = dht.readHumidity();
Temp=t;
Vocht=h;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp Vocht");
lcd.setCursor(0, 1);
lcd.print(t);
lcd.setCursor(7,1);
lcd.print(h);

}
else if ((ledState2 == LOW) && (currentMillis - previousMillis2 >= OffTime2))
{
ledState2 = HIGH;
previousMillis2 = currentMillis;


Alarm.delay(1000); // wait one second between clock display
digitalClockDisplay();
}


}

// functions to be called when an alarm triggers:
void MorningAlarm() {
lcd.setCursor(2, 1);
lcd.print("Lamp Aan");
digitalWrite(rela1, LOW);
delay(500);
lcd.clear();
}

void EveningAlarm() {
lcd.setCursor(2, 1);
lcd.print("Lamp Uit");
digitalWrite(rela1, HIGH);
delay(500);
lcd.clear();
}

void WeeklyAlarm() {
Serial.println("Alarm: - its Monday Morning");
}

void ExplicitAlarm() {
Serial.println("Alarm: - this triggers only at the given date and time");
}

void geefWater() {
lcd.clear();
delay(20);
lcd.setCursor(2, 1);
lcd.print("Waterpomp Aan");
digitalWrite(rela2, HIGH);
delay(6000);
lcd.clear();
}





void OnceOnly() {
Serial.println("Full Automatic Mode Activated. Schakel de apparaat niet uit.");
}

void digitalClockDisplay()
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tijd Status");

lcd.setCursor(1, 1);
lcd.print(hour());
printDigits(minute());
printDigits(second());
lcd.setCursor(10,1);
lcd.print("Auto");

}








void printDigits(int digits)
{
lcd.print(":");
if (digits < 10)
lcd.print('0');
lcd.print(digits);

}

void smokeDetected() {
int alarmState;
Serial.println("");
Serial.println("Er is CO2/Rook gedetecteerd, blus systeem is operationeel");
alarmState=LOW;
lcd.clear();
lcd.setCursor(0,1);
lcd.print("Alarm");
lcd.setCursor(1,0);
lcd.print(alarmState);


alarmData=digitalRead(alarm);
tempHome1 = digitalRead(tempHome);
digitalWrite(systeemAan, LOW);
digitalWrite(rela1, HIGH);
digitalWrite(rela2, HIGH);
digitalWrite(rela3, HIGH);
digitalWrite(rela4, HIGH);
digitalWrite(ventilator, LOW);


while (alarmState=LOW) {

if (alarmData==LOW){
digitalClockDisplay();
}


}

}

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

Re: Switch case vraagje

Berichtdoor Koepel » 14 Okt 2016, 10:54

Je gebruikt millis() op een manier die 75% delay() is en 25% millis(). De bedoeling is dat je millis() voor de volle 100% als millis() gebruikt ;)

Kijk eens naar de BlinkWithoutDelay: https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
Er zijn maar een paar manieren waarop millis() goed werkt :!:

Probeer deze sketch eens:
cpp code
// Blink without Delay, with three software timers.
// Look at the led and the serial monitor.
// Blink without Delay : https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
// Tested with Arduino.cc IDE 1.6.12 and Arduino Uno


const int ledPin = 13; // the number of the LED pin

unsigned long previousMillisLed;
unsigned long previousMillisCounter;
unsigned long previousMillisBeep;

long counter;

void setup()
{
Serial.begin( 9600);
Serial.println(F( "Started"));

pinMode( ledPin, OUTPUT);

// When the setup() takes a long time, set the previousMillis at the end of setup()
previousMillisLed = millis();
previousMillisCounter = millis();
previousMillisBeep = millis();
}


void loop()
{
// A single 'currentMillis' for the whole loop
unsigned long currentMillis = millis();


// --------------------------------------------
// First software timer for the led
// --------------------------------------------
if (currentMillis - previousMillisLed >= 456)
{
previousMillisLed = currentMillis;

// Toggle the Led
digitalWrite( ledPin, digitalRead( ledPin) == HIGH ? LOW : HIGH);
}


// --------------------------------------------
// Second software timer for the counter
// --------------------------------------------
if (currentMillis - previousMillisCounter >= 1234)
{
previousMillisCounter = currentMillis;

// Increment a counter and show it in the serial monitor.
counter++;
Serial.println( counter);
}


// --------------------------------------------
// Third software timer for the 'beep'
// --------------------------------------------
if (currentMillis - previousMillisBeep >= 5432)
{
previousMillisBeep = currentMillis;

// Print a 'beep'
Serial.println(F( "Beep!"));
}
}


De millis() geeft de tijd terug in milliseconden. Het is de bedoeling dat de loop() heel snel achter elkaar wordt uitvoerd, omdat er meestal niets te doen is. Pas als millis() zover is dat een software timer aktief wordt, dan wordt dat stukje uitgevoerd.

Dus met millis() wordt er gekeken of het tijd is om iets te gaan doen.

Als je jouw hele sketch wilt omzetten naar millis(), dan zouden die delays voor het display ook naar millis() omgezet kunnen worden. Een enkele delay werkt een beetje anders, omdat het geen software timer is met een vast interval. Ik gebruik dan meestal een boolean variable om aan te geven dat de delay aktief is. Ik schreef daarvan een voorbeeld op dit forum, maar dat kan ik even niet vinden.

Zodra je iets toevoegt, zoals "unsigned long previousMillis = 0" in de loop(), dan werkt het niet meer. Ook als je "if (ledState == HIGH)" toevoegd aan de millis() constructie, dan werkt het niet meer.

Stel dat je een langzaam display hebt, waarbij 5 keer per seconde updaten voldoende is. Dan kun bijvoorbeeld een temperatuur 5 keer per seconde naar het display sturen.

Stel dat je eens in de vier seconden de temperatuur naar de seriële monitor wilt sturen. Dat kan met een eigen software timer met millis().

Ik dacht dat een DTH22 maar eens in de twee seconden opgevraagd kan worden. Ik weet niet of dat in de library zit die je gebruikt of dat je dat zelf moet doen.

Berichten: 59
Geregistreerd: 19 Mrt 2015, 01:17

Re: Switch case vraagje

Berichtdoor hazanovo » 14 Okt 2016, 19:58

Koepel hartelijk dank voor deze duidelijke en goed opgebouwde informatie. Hier heb ik tenminste wat aan! Waren er maar meer zoals jij hier op dit forum eh Nico.

Berichten: 59
Geregistreerd: 19 Mrt 2015, 01:17

Re: Switch case vraagje

Berichtdoor hazanovo » 17 Okt 2016, 23:52

Nog 1 vraagje. Is er een limiet aan hoe vaak je millis gebruikt?

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

Re: Switch case vraagje

Berichtdoor nicoverduin » 18 Okt 2016, 07:37

Nope.... Je loopt alleen kans dat als je een paar 1000 keer millis() gebruikt voor timers, ze altijd al verlopen zijn omdat je de vorige verlopen timer nog aan het afwikkelen bent.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

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

Re: Switch case vraagje

Berichtdoor Koepel » 19 Okt 2016, 10:51

Sorry, een correctie :oops: Ik schreef "Ook als je "if (ledState == HIGH)" toevoegd aan de millis() constructie, dan werkt het niet meer", en nu heb ik zelf een voorbeeld gemaakt die dat wel doet : http://arduinoforum.nl/viewtopic.php?f=8&t=2054&p=15167#p15167.
Het kan dus wel degelijk.

Hoe is het mogelijk dat jij hetzelfde hebt als win2584 ? (http://arduinoforum.nl/viewtopic.php?f=8&t=2054&p=15167#p15164). Met ledState, OnTime en OffTime en dezelfde soort code ? Is er ergens een voorbeeld dat het op die manier doet ?

Vorige

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 15 gasten