timer starten met knop ?
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: timer starten met knop ?
Range veranderen in 150 tot 350 en dan delen door 10.
Advertisement
Re: timer starten met knop ?
hoi nico
ik ben weer bezig met dit project waarbij ik een lcd scherm (20x4) heb toegevoegd
echter loop ik tegen een probleem aan wat ik niet begrijp
het lijkt in de harware te zitten en niet zozeer in de software
ik heb het lcd scherm werkend maar de waardes beïnvloeden elkaar te veel
het probleem (de uitdaging )
als het programma start krijg ik op het lcd scherm de waarden te staan van lm35 1 met daaronder de gewenste waarde van potmeter 1
daaronder krijg ik dan lm35 2 met daaronder weer de gewenste waarde van potmeter 2
lcd rij 1 lm35 1 ( waarde 22 )
lcd rij 2 gewenste waarde potmeter 1 (waarde 15 )
lcd rij 3 lm35 2 ( waarde 22)
lcd rij 4 gewenste waarde potmeter 2 ( waarde 15)
als ik nu aan potmeter 1 draai en de waarde wordt 35 dan gaat alles goed en werkt alles naar wens
maar als ik aan potmeter 2 draai dan verander ook de waarde van lm35 1 op de lcd deze loopt op tot 41 en loopt mee terug als ik de potmeter terug draai
waar gaat ik nu fout
hier onder de code die ik hiervoor heb gemaakt
verder kan ik de A4 ingang van mijn arduino uno niet gebruiken ter vervanging van A3 want dan loopt het lcd scherm vast
komt dit door dat het lcd scherm deze toch gebruikt ?
lcd scherm heb ik aan gesloten op SCL en SDA
ik hoop dat iemand me verder kan helpen om dit op te lossen
groet dirk ambu
ik ben weer bezig met dit project waarbij ik een lcd scherm (20x4) heb toegevoegd
echter loop ik tegen een probleem aan wat ik niet begrijp
het lijkt in de harware te zitten en niet zozeer in de software
ik heb het lcd scherm werkend maar de waardes beïnvloeden elkaar te veel
het probleem (de uitdaging )
als het programma start krijg ik op het lcd scherm de waarden te staan van lm35 1 met daaronder de gewenste waarde van potmeter 1
daaronder krijg ik dan lm35 2 met daaronder weer de gewenste waarde van potmeter 2
lcd rij 1 lm35 1 ( waarde 22 )
lcd rij 2 gewenste waarde potmeter 1 (waarde 15 )
lcd rij 3 lm35 2 ( waarde 22)
lcd rij 4 gewenste waarde potmeter 2 ( waarde 15)
als ik nu aan potmeter 1 draai en de waarde wordt 35 dan gaat alles goed en werkt alles naar wens
maar als ik aan potmeter 2 draai dan verander ook de waarde van lm35 1 op de lcd deze loopt op tot 41 en loopt mee terug als ik de potmeter terug draai
waar gaat ik nu fout
hier onder de code die ik hiervoor heb gemaakt
- Code: Alles selecteren
/**
* @mainpage Timerswitch program
* \n This program has relays that can be switched on and off based on
* a switch status or time limit.
* \n The time limit is currently set for 1 hour but my be extended with
* 15 minutes under the condition that a button corresponding to a relay is
* not pressed for longer than 5 seconds. If the button is pushed for more than
* 5 seconds, the timer is reset and switched off.
* @author dirk ambu
* @date 25-9-2013
*/
/**
* Revision control
* Revision : $Revision$
* Author : $Author$
* Date : $Date$
*
*/
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#define I2C_ADDR 0x27 // Define I2C Address where the PCF8574A is
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
int n = 1;
LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
//
// global variables
//
unsigned long timer1Counter; // timer 1
unsigned long timer2Counter; // timer 2
unsigned long temp1Counter; // timer 1 for temperature
unsigned long temp2Counter; // timer 2 for temperature
float temperatureSensor1; // temperature sensor 1
float temperatureSensor2; // temperature sensor 2
unsigned int setTemperature1; // set temperature 1
unsigned int setTemperature2; // set temperature 2
unsigned int tempReading1; // temperature from LM35 1
unsigned int tempReading2; // temperature from LM35 2
float convertedTemp1; // temperature in degrees 1
float convertedTemp2; // temperature in degrees 2
//
// arduino pins
//
// porten die nog vrij zijn 0 1 8 13 A4 A5 icsp
#define RELAY1 7 // pin 4
#define RELAY2 4 // pin 5
//#define RELAY3 5 // pin 6
//#define RELAY4 6 // pin 7
#define LEDPIN1 9 //pin 9
#define LEDPINN2 10 // pin 10
#define LEDPIN3 11 //pin 11
#define LEDPINN4 12 //pin 12
#define SWITCH1 2 // pin 2
#define SWITCH2 3 // pin 3
#define TEMP_SENSOR1 A0 // analog pin A0 Sensor1
#define TEMP_SENSOR2 A1 // analog pin A1 Sensor2
#define TEMP_SET1 A2 // analog pin A2 set temp 1
#define TEMP_SET2 A3 // analog pin A3 set temp 2
//
// other settings
//
#define ON LOW // on/off
#define OFF HIGH
#define TIME_TO_PRESS 3000L // time to push button for reset 5000L
#define HOUR 3600000L // 3.6 million milliseconds in hour 3600000L
#define QUARTER 900000L // 900000 millsecs in 15 minutes 900000L
#define FIVESECONDS 5000L // 5 minutes period 300000L 100000L
#define DEBOUNCE_TIME 100 // 100 mSec debounce time 100
/**
* @name setup()
* Initializes the IO ports and resets any variables
*/
void setup()
{
lcd.begin (20,4,LCD_5x8DOTS);
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); // init the backlight
//lcd.setBacklight(HIGH); // Backlight on
//
// set pins input output. analog pins do not need to be setup
//
pinMode(RELAY1, OUTPUT);
pinMode(RELAY2, OUTPUT);
//pinMode(RELAY3, OUTPUT);
// pinMode(RELAY4, OUTPUT);
pinMode(LEDPIN1, OUTPUT);
pinMode(LEDPINN2, OUTPUT);
pinMode(LEDPIN3, OUTPUT);
pinMode(LEDPINN4, OUTPUT);
pinMode(SWITCH1, INPUT);
pinMode(SWITCH2, INPUT);
//
// pull up resistors
//
digitalWrite(SWITCH1, HIGH);
digitalWrite(SWITCH2, HIGH);
//
// make sure relays are switched off
//
digitalWrite(RELAY1, LOW);
digitalWrite(RELAY2, LOW);
//digitalWrite(RELAY3, LOW);
//digitalWrite(RELAY4, LOW);
//
// test led,s
//
digitalWrite(LEDPIN1, HIGH); //make sure led works
delay (200);
digitalWrite(LEDPIN1, LOW); //make sure led works
delay (200);
digitalWrite(LEDPINN2, HIGH); //make sure led works
delay (2000);
digitalWrite(LEDPINN2, LOW); //make sure led works
delay (200);
digitalWrite(LEDPIN3, HIGH); //make sure led works
delay (200);
digitalWrite(LEDPIN3, LOW); //make sure led works
delay (200);
digitalWrite(LEDPINN4, HIGH); //make sure led works
delay (200);
digitalWrite(LEDPINN4, LOW); //make sure led works
delay (200);
digitalWrite(LEDPIN1, HIGH); //make sure led works
delay (200);
digitalWrite(LEDPIN1, LOW); //make sure led works
delay (200);
digitalWrite(LEDPINN2, HIGH); //make sure led works
delay (200);
digitalWrite(LEDPINN2, LOW); //make sure led works
delay (200);
digitalWrite(LEDPIN3, HIGH); //make sure led works
delay (200);
digitalWrite(LEDPIN3, LOW); //make sure led works
delay (200);
digitalWrite(LEDPINN4, HIGH); //make sure led works
delay (200);
digitalWrite(LEDPINN4, LOW); //make sure led works
delay (1000);
//
// other variables
//
timer1Counter = 0L; // timer counters
timer2Counter = 0L;
//
//
//
}
/**
* @name Loop()
* continues to loop through this routine until Arduino is switched off
* This routine just processes each timer in sequence
*/
void loop()
{
// unsigned int tempReading1; // temperature from LM35
// unsigned int tempReading2; // temperature from LM35
//float convertedTemp1; // temperature in degrees
//float convertedTemp2; // temperature in degrees
tempReading1 = analogRead(TEMP_SENSOR1);
tempReading2 = analogRead(TEMP_SENSOR2);
convertedTemp1 = (5.0 * tempReading1 *35.0)/1024.0;
convertedTemp2 = (5.0 * tempReading2 *35.0)/1024.0;
int value1 = map(analogRead(TEMP_SET1), 0, 1023, 1500 ,3500 );
int value2 = map(analogRead(TEMP_SET2), 0, 1023, 1500 ,3500 );
int value = analogRead(TEMP_SENSOR1);
float millivolts1 = (value / 1024.0) * 5000;
float celsius1 = millivolts1 / 10;
int value3 = analogRead(TEMP_SENSOR2);
float millivolts2 = (value3 / 1024.0) * 5000;
float celsius2 = millivolts2 / 10;
int value5 = (analogRead(TEMP_SET1), 0, 1023, 1500 ,3500 );
float millivolts5 = (value1 / 10);
float celsius5 = millivolts5 / 10;
int value6 = (analogRead(TEMP_SET2), 0, 1023, 1500 ,3500 );
float millivolts6 = (value2 / 10);
float celsius6 = millivolts6 / 10;
lcd.home (); // go home
lcd.print("Woonkamer");
lcd.setCursor ( 13, 0 ); // go to the next line
lcd.print(celsius1);
lcd.setCursor ( 13, 1 ); // go to the next line
lcd.print(celsius5);
lcd.setCursor ( 0, 1 ); // go to the next line
lcd.print("Gewenst temp");
lcd.setCursor ( 13, 2 ); // go to the next line
lcd.print(celsius2);
lcd.setCursor ( 13, 3 ); // go to the next line
lcd.print(celsius6);
lcd.setCursor ( 0, 2 ); // go to the next line
lcd.print("Slaapkamers");
lcd.setCursor (0, 3 ); // go to the next line
lcd.print("Gewenst temp");
lcd.setBacklight(HIGH); // Backlight on
//lcd.on(); // Switch fully on the LCD (backlight and LCD)
//
// read temperature settings from potmeters
//
setTemperature1 = map(analogRead(TEMP_SET1), 0, 1023, 15,35);
setTemperature2 = map(analogRead(TEMP_SET2), 0, 1023, 15,35);
//
// process timers
//
timer1Counter = processTimer(SWITCH1, RELAY1, LEDPIN1, LEDPINN2, timer1Counter);
timer2Counter = processTimer(SWITCH2, RELAY2, LEDPIN3, LEDPINN4, timer2Counter);
//
// process temperature
//
temp1Counter = processTemperature(RELAY1, LEDPIN1, LEDPINN2, TEMP_SENSOR1, setTemperature1, temp1Counter, timer1Counter);
temp2Counter = processTemperature(RELAY2, LEDPIN3, LEDPINN4, TEMP_SENSOR2, setTemperature2, temp2Counter, timer2Counter);
}
/**
* @name long procesTimer(int button, int relay, int setTemp, long counter)
* @param button button to process
* @param relay relay to process
* @param counter timer value to compare to millis
* @return long with new timer value
*
* this routine receives the timer value, button and relay.
* \n It tests if the button is pressed. If so:
* \n a) it just keeps counting time until the button is released.
* \n b) it checks how long the button was pressed:
* \n - if more (or equal to) than TIME_TO_PRESS, rest counter and relay
* \n - if not check if the counter was running:
* \n * if so Add 15 minutes
* \n * if not start the timer at one hour
* \n If button not pressed:
* \n a) if current time is greater(or equal to) timer value:
* \n - Reset the timer
* \n - Switch relay off
*
*/
long processTimer(int button, int relay, int ledpin, int ledpinn, unsigned long counter){
unsigned long returnCounter; // return value
unsigned long localCounter; // counter for pressed time
returnCounter = counter; // if unchanged we have the right value
//
// check if a button is pressed
// if so check if it is a TIME_TO_PRESS press
//
if (deBounce(button) == ON){
//
// button is pressed. No see for how long
//
localCounter = millis();
//
// now wait until button is released so don't forget to let go :)
//
while(1) {
//
// check if button is released
//
if (deBounce(button) == OFF){
//
// yes so quit this loop
//
break;
}
}
//
// the button is released check if we are passed the time limit
// the time is corrected for 2 x the DEBOUNCE_TIME as this time is
// already lost in the deBounce routine.
//
if ((millis() - localCounter) >= (TIME_TO_PRESS - (DEBOUNCE_TIME * 2))) {
//
// yes so switch the relay off
//
returnCounter = 0L;
digitalWrite(relay, LOW);
digitalWrite(ledpinn,LOW);
} else {
//
// The time pressed was less than the TIME_TO_PRESS so check
// if we have to switch the relay on for one hour or add 15 minutes
//
if (returnCounter == 0L) {
//
// No it wasn't so switch the relay on and set the timer
//
returnCounter = millis() + HOUR;
//
} else {
//
// it was already running so just add 15 minutes
//
returnCounter += QUARTER;
}
}
} else {
//
// no button was pressed so just check the timer
//
if (millis() >= returnCounter) {
//
// yes so switch off the relay and the timer
//
returnCounter = 0L;
digitalWrite(relay, LOW);
digitalWrite(ledpinn, LOW);
digitalWrite(ledpin, LOW);
}
}
return returnCounter;
}
/**
* @name deBounce(int button)
* @param button button pin to read and do debouncing
* @returns state of button
*
* Reads a button and waits DEBOUNCE_TIME mSec and tests again
* Returns read if value unchanged and zero if it has changed for
* DEBOUNCE_TIME time
*/
int deBounce(int button) {
int state; // value of pin
//
// read the button
//
state = digitalRead(button);
delay(DEBOUNCE_TIME); // now wait a little time
//
// now check if it has changed
//
if (digitalRead(button) != state) {
return OFF; // the state has changed so consider it off
// if it went on halfway this routine it will
// have stabilized by the next time we read here
} else {
//
// return the button value
//
return state;
}
}
/**
* @name long processTemperature(int relay , int sensor, int tempSet, long tempCtr, long timerCtr)
* @param relay relay pin
* @param sensor sensor pin
* @param tempSet Set temperature as int value
* @param tempCtr 5 minute counter for temp readings
* @param timerCtr Main timer counter. If not 0 this timer is active
* @return long with new timer value for temperature readings
*
* this routine checks the timer counter. If non zeroe this timer is active.
* next check if the temp ctr has passed 5 minutes. If so check the temperature.
* \n Next check if the temperature is higher than the set temperature. If so
* switch the relay on. If it is below then the relay will be switched off.
*/
long processTemperature(int relay , int ledpin , int ledpinn, int sensor, int tempSet, unsigned long tempCtr, unsigned long timerCtr){
unsigned int tempReading; // temperature from LM35
float convertedTemp; // temperature in degrees
//
// first check if a counter is running and if not if it should be running
//
if (timerCtr != 0L) {
//
// there is a timer running so let's see if we need to read the temperature
//
if (millis() >= tempCtr) {
//
// yes so let's read the sensor
//
tempReading = analogRead(sensor);
//
// and convert it to a temperature
//
convertedTemp = (5.0 * tempReading *35.0)/1024.0;
// hier nog wat veranderen //////////////////////////////////////////////////////////////////
int value = analogRead(TEMP_SENSOR1);
float millivolts1 = (value / 1024.0) * 5000;
float celsius1 = millivolts1 / 10;
//
// now check if we are above the set temperature
//
if (convertedTemp > tempSet) {
//
// switch the relay on
//
digitalWrite(relay, HIGH); // relay is aan
digitalWrite(ledpinn, LOW); // rode led is uit
digitalWrite(ledpin, HIGH); // groene led is aan
} else {
//
// switch the relay off
//
digitalWrite(relay, LOW); // relay is uit
digitalWrite(ledpinn, HIGH); // rode led is aan
digitalWrite(ledpin, LOW); // groene led is uit
}
//
// set the temperature for the next sensing period
//
tempCtr = millis() + FIVESECONDS;
}
} else {
//
// no activity so reset the tempCtr timer
//
tempCtr = 0L;
}
//
// and hand the timer back
//
return tempCtr;
}
verder kan ik de A4 ingang van mijn arduino uno niet gebruiken ter vervanging van A3 want dan loopt het lcd scherm vast
komt dit door dat het lcd scherm deze toch gebruikt ?
lcd scherm heb ik aan gesloten op SCL en SDA
ik hoop dat iemand me verder kan helpen om dit op te lossen
groet dirk ambu
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: timer starten met knop ?
Mijn eerste reactie zou zijn:
Waarom gebruik je LCD I2C (is een 2 wire verbinding) en gaat vervolgens parallel aansturen???????
Waarom gebruik je LCD I2C (is een 2 wire verbinding) en gaat vervolgens parallel aansturen???????
Re: timer starten met knop ?
hoi nico
ik maak gebruik van sda en scl
de library die ik heb gevonden stuurt het zo aan
hij werk met alleen een plus een min en sda scl
waar maakt jij uit op dat ik het parallel aanstuur als ik vragen mag
want dan weet ik mischien waar het fout gaat
ik maak gebruik van sda en scl
de library die ik heb gevonden stuurt het zo aan
hij werk met alleen een plus een min en sda scl
waar maakt jij uit op dat ik het parallel aanstuur als ik vragen mag
want dan weet ik mischien waar het fout gaat
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: timer starten met knop ?
LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
En als ik dit bekijk : https://bitbucket.org/fmalpartida/new-l ... /wiki/Home
zou je3 dit moeten hebben:
LiquidCrystal_I2C lcd(I2C_ADDR); // Set the LCD I2C address
En hier heb je besloten om de "MAP" maar geheel weg te laten:
En wat netter programmeren zou ook geen kwaad kunnen. Heb ik je een prachtig gedocumenteerd programma gegeven, laat je de stijl al gelijk weer los...... niet handig.
En als ik dit bekijk : https://bitbucket.org/fmalpartida/new-l ... /wiki/Home
zou je3 dit moeten hebben:
LiquidCrystal_I2C lcd(I2C_ADDR); // Set the LCD I2C address
En hier heb je besloten om de "MAP" maar geheel weg te laten:
- Code: Alles selecteren
int value5 = (analogRead(TEMP_SET1), 0, 1023, 1500 ,3500 );
float millivolts5 = (value1 / 10);
float celsius5 = millivolts5 / 10;
int value6 = (analogRead(TEMP_SET2), 0, 1023, 1500 ,3500 );
En wat netter programmeren zou ook geen kwaad kunnen. Heb ik je een prachtig gedocumenteerd programma gegeven, laat je de stijl al gelijk weer los...... niet handig.
Re: timer starten met knop ?
je heb helemaal gelijk dat ik er een rommeltje van maakt
maar het valt niet mee om netje een programma te maken zoals je zelf ook zeg een werkt programma is nog geen goed programma
ik heb gewoon te veel haast om het werkt te krijgen en dan wordt ik slordig
en dat kosten me net 1 arduino uno
waar ik achter ben is dat enkelen versie,s terug werkten het nog wel
er gaat dus iets fout vanaf het moment dat ik de gewensten temperatuur wil berekenen achter de komma
ik ga even kijken of dat komt door het weglaten van de map
dat LiquidCrystal_I2C lcd(I2C_ADDR); // Set the LCD I2C address begrijp ik niet omdat mijn lcd geen address heeft
de versie die ik heb daarvan kan je er volgens internet ook geen 2 achter elkaar plaatsen met verschillenden teksten
omdat ze geen vast adres hebben zoiets heb ik begrepen
maar het valt niet mee om netje een programma te maken zoals je zelf ook zeg een werkt programma is nog geen goed programma
ik heb gewoon te veel haast om het werkt te krijgen en dan wordt ik slordig
en dat kosten me net 1 arduino uno
waar ik achter ben is dat enkelen versie,s terug werkten het nog wel
er gaat dus iets fout vanaf het moment dat ik de gewensten temperatuur wil berekenen achter de komma
ik ga even kijken of dat komt door het weglaten van de map
dat LiquidCrystal_I2C lcd(I2C_ADDR); // Set the LCD I2C address begrijp ik niet omdat mijn lcd geen address heeft
de versie die ik heb daarvan kan je er volgens internet ook geen 2 achter elkaar plaatsen met verschillenden teksten
omdat ze geen vast adres hebben zoiets heb ik begrepen
Re: timer starten met knop ?
beste nico
met wat zoeken en veranderen is het mij gelukt om er voor te zorgen dat de potmeter de lm35 niet meer beïnvloed
maar nu heb ik het volgende probleem
het lukt mij niet om de instel waarde tussen de 15.00 en 35.00 graden te krijgen
hij regelt nu van 0 naar 35.00
het lijkt erop dat hij dit nu alleen doet op het lcd scherm want er schakelt nu niets meer
de code ziet er nu zo uit
wat doe ik allemaal fout
of heb ik het op een verkeerde manier geprobeerd op te lossen
ik hoor het graag
met wat zoeken en veranderen is het mij gelukt om er voor te zorgen dat de potmeter de lm35 niet meer beïnvloed
maar nu heb ik het volgende probleem
het lukt mij niet om de instel waarde tussen de 15.00 en 35.00 graden te krijgen
hij regelt nu van 0 naar 35.00
het lijkt erop dat hij dit nu alleen doet op het lcd scherm want er schakelt nu niets meer
de code ziet er nu zo uit
- Code: Alles selecteren
/**
* @mainpage Timerswitch program
* \n This program has relays that can be switched on and off based on
* a switch status or time limit.
* \n The time limit is currently set for 1 hour but my be extended with
* 15 minutes under the condition that a button corresponding to a relay is
* not pressed for longer than 5 seconds. If the button is pushed for more than
* 5 seconds, the timer is reset and switched off.
* @author dirk ambu
* @date 21-6-2013
*/
/**
* Revision control
* Revision : $Revision$
* Author : $Author$
* Date : $Date$
*
*/
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#define I2C_ADDR 0x27 // Define I2C Address where the PCF8574A is
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
int n = 1;
LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
//
// global variables
//
unsigned long timer1Counter; // timer 1
unsigned long timer2Counter; // timer 2
unsigned long temp1Counter; // timer 1 for temperature
unsigned long temp2Counter; // timer 2 for temperature
float temperatureSensor1; // temperature sensor 1
float temperatureSensor2; // temperature sensor 2
unsigned int setTemperature1; // set temperature 1
unsigned int setTemperature2; // set temperature 2
//unsigned int tempReading1; // temperature from LM35 1
//unsigned int tempReading2; // temperature from LM35 2
//float convertedTemp1; // temperature in degrees 1
//float convertedTemp2; // temperature in degrees 2
//
// arduino pins
//
// porten die nog vrij zijn 0 1 8 13 A4 A5 icsp
#define RELAY1 7 // pin 4
#define RELAY2 4 // pin 5
//#define RELAY3 5 // pin 6
//#define RELAY4 6 // pin 7
#define LEDPIN1 9 //pin 9
#define LEDPINN2 10 // pin 10
#define LEDPIN3 11 //pin 11
#define LEDPINN4 12 //pin 12
#define SWITCH1 2 // pin 2
#define SWITCH2 3 // pin 3
#define TEMP_SENSOR1 A0 // analog pin A0 Sensor1
#define TEMP_SENSOR2 A1 // analog pin A1 Sensor2
#define TEMP_SET1 A2 // analog pin A2 set temp 1
#define TEMP_SET2 A3 // analog pin A3 set temp 2
//
// other settings
//
#define ON LOW // on/off
#define OFF HIGH
#define TIME_TO_PRESS 3000L // time to push button for reset 5000L
#define HOUR 3600000L // 3.6 million milliseconds in hour 3600000L
#define QUARTER 900000L // 900000 millsecs in 15 minutes 900000L
#define FIVESECONDS 5000L // 5 minutes period 300000L 100000L
#define DEBOUNCE_TIME 100 // 100 mSec debounce time 100
/**
* @name setup()
* Initializes the IO ports and resets any variables
*/
void setup()
{
lcd.begin (20,4,LCD_5x8DOTS);
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); // init the backlight
//lcd.setBacklight(HIGH); // Backlight on
//
// set pins input output. analog pins do not need to be setup
//
pinMode(RELAY1, OUTPUT);
pinMode(RELAY2, OUTPUT);
//pinMode(RELAY3, OUTPUT);
// pinMode(RELAY4, OUTPUT);
pinMode(LEDPIN1, OUTPUT);
pinMode(LEDPINN2, OUTPUT);
pinMode(LEDPIN3, OUTPUT);
pinMode(LEDPINN4, OUTPUT);
pinMode(SWITCH1, INPUT);
pinMode(SWITCH2, INPUT);
//
// pull up resistors
//
digitalWrite(SWITCH1, HIGH);
digitalWrite(SWITCH2, HIGH);
//
// make sure relays are switched off
//
digitalWrite(RELAY1, LOW);
digitalWrite(RELAY2, LOW);
//digitalWrite(RELAY3, LOW);
//digitalWrite(RELAY4, LOW);
//
// test led,s
//
digitalWrite(LEDPIN1, HIGH); //make sure led works
delay (200);
digitalWrite(LEDPIN1, LOW); //make sure led works
delay (200);
digitalWrite(LEDPINN2, HIGH); //make sure led works
delay (2000);
digitalWrite(LEDPINN2, LOW); //make sure led works
delay (200);
digitalWrite(LEDPIN3, HIGH); //make sure led works
delay (200);
digitalWrite(LEDPIN3, LOW); //make sure led works
delay (200);
digitalWrite(LEDPINN4, HIGH); //make sure led works
delay (200);
digitalWrite(LEDPINN4, LOW); //make sure led works
delay (200);
digitalWrite(LEDPIN1, HIGH); //make sure led works
delay (200);
digitalWrite(LEDPIN1, LOW); //make sure led works
delay (200);
digitalWrite(LEDPINN2, HIGH); //make sure led works
delay (200);
digitalWrite(LEDPINN2, LOW); //make sure led works
delay (200);
digitalWrite(LEDPIN3, HIGH); //make sure led works
delay (200);
digitalWrite(LEDPIN3, LOW); //make sure led works
delay (200);
digitalWrite(LEDPINN4, HIGH); //make sure led works
delay (200);
digitalWrite(LEDPINN4, LOW); //make sure led works
delay (1000);
//
// other variables
//
timer1Counter = 0L; // timer counters
timer2Counter = 0L;
//
//
//
}
/**
* @name Loop()
* continues to loop through this routine until Arduino is switched off
* This routine just processes each timer in sequence
*/
void loop()
{
unsigned int tempReading1; // temperature from LM35
unsigned int tempReading2; // temperature from LM35
float convertedTemp1; // temperature in degrees
float convertedTemp2; // temperature in degrees
tempReading1 = analogRead(TEMP_SENSOR1);
tempReading2 = analogRead(TEMP_SENSOR2);
convertedTemp1 = (5.0 * tempReading1 *35.0)/1024.0;
convertedTemp2 = (5.0 * tempReading2 *35.0)/1024.0;
int value = analogRead(TEMP_SENSOR1);
float millivolts1 = (value / 1024.0) * 5000;
float celsius1 = millivolts1 / 10;
int value3 = analogRead(TEMP_SENSOR2);
float millivolts2 = (value3 / 1024.0) * 5000;
float celsius2 = millivolts2 / 10;
int value4 = analogRead(TEMP_SET1);//, 0, 1023, 1500 ,3500 );
float millivolts3 = (value4 / 1024.0) * 350;
float celsius3 = millivolts3 / 10;
int value5 = analogRead(TEMP_SET2);//, 0, 1023, 1500 ,3500 );
float millivolts4 = (value5 / 1024.0) * 350;
float celsius4 = millivolts4 / 10;
int value1 = map(analogRead(TEMP_SENSOR1), 0, 1023, 1500 ,3500 );
int value2 = map(analogRead(TEMP_SENSOR2), 0, 1023, 1500 ,3500 );
int value6 = map(analogRead(TEMP_SET1), 0, 1023, 1500 ,3500 );
int value7 = map(analogRead(TEMP_SET2), 0, 1023, 1500 ,3500 );
lcd.home (); // go home
lcd.print("Woonkamer");
lcd.setCursor ( 13, 0 ); // go to the next line
lcd.print(celsius1);
lcd.setCursor ( 13, 1 ); // go to the next line
lcd.print(celsius3);
lcd.setCursor ( 0, 1 ); // go to the next line
lcd.print("Gewenst temp");
lcd.setCursor ( 13, 2 ); // go to the next line
lcd.print(celsius2);
lcd.setCursor ( 13, 3 ); // go to the next line
lcd.print(celsius4);
lcd.setCursor ( 0, 2 ); // go to the next line
lcd.print("Slaapkamers");
lcd.setCursor (0, 3 ); // go to the next line
lcd.print("Gewenst temp");
lcd.setBacklight(HIGH); // Backlight on
//lcd.on(); // Switch fully on the LCD (backlight and LCD)
//
// read temperature settings from potmeters
//
setTemperature1 = map(analogRead(TEMP_SET1), 0, 1023, 15,35);
setTemperature2 = map(analogRead(TEMP_SET2), 0, 1023, 15,35);
//
// process timers
//
timer1Counter = processTimer(SWITCH1, RELAY1, LEDPIN1, LEDPINN2, timer1Counter);
timer2Counter = processTimer(SWITCH2, RELAY2, LEDPIN3, LEDPINN4, timer2Counter);
//
// process temperature
//
temp1Counter = processTemperature(RELAY1, LEDPIN1, LEDPINN2, TEMP_SENSOR1, setTemperature1, temp1Counter, timer1Counter);
temp2Counter = processTemperature(RELAY2, LEDPIN3, LEDPINN4, TEMP_SENSOR2, setTemperature2, temp2Counter, timer2Counter);
}
/**
* @name long procesTimer(int button, int relay, int setTemp, long counter)
* @param button button to process
* @param relay relay to process
* @param counter timer value to compare to millis
* @return long with new timer value
*
* this routine receives the timer value, button and relay.
* \n It tests if the button is pressed. If so:
* \n a) it just keeps counting time until the button is released.
* \n b) it checks how long the button was pressed:
* \n - if more (or equal to) than TIME_TO_PRESS, rest counter and relay
* \n - if not check if the counter was running:
* \n * if so Add 15 minutes
* \n * if not start the timer at one hour
* \n If button not pressed:
* \n a) if current time is greater(or equal to) timer value:
* \n - Reset the timer
* \n - Switch relay off
*
*/
long processTimer(int button, int relay, int ledpin, int ledpinn, unsigned long counter){
unsigned long returnCounter; // return value
unsigned long localCounter; // counter for pressed time
returnCounter = counter; // if unchanged we have the right value
//
// check if a button is pressed
// if so check if it is a TIME_TO_PRESS press
//
if (deBounce(button) == ON){
//
// button is pressed. No see for how long
//
localCounter = millis();
//
// now wait until button is released so don't forget to let go :)
//
while(1) {
//
// check if button is released
//
if (deBounce(button) == OFF){
//
// yes so quit this loop
//
break;
}
}
//
// the button is released check if we are passed the time limit
// the time is corrected for 2 x the DEBOUNCE_TIME as this time is
// already lost in the deBounce routine.
//
if ((millis() - localCounter) >= (TIME_TO_PRESS - (DEBOUNCE_TIME * 2))) {
//
// yes so switch the relay off
//
returnCounter = 0L;
digitalWrite(relay, LOW);
digitalWrite(ledpinn,LOW);
} else {
//
// The time pressed was less than the TIME_TO_PRESS so check
// if we have to switch the relay on for one hour or add 15 minutes
//
if (returnCounter == 0L) {
//
// No it wasn't so switch the relay on and set the timer
//
returnCounter = millis() + HOUR;
//
} else {
//
// it was already running so just add 15 minutes
//
returnCounter += QUARTER;
}
}
} else {
//
// no button was pressed so just check the timer
//
if (millis() >= returnCounter) {
//
// yes so switch off the relay and the timer
//
returnCounter = 0L;
digitalWrite(relay, LOW);
digitalWrite(ledpinn, LOW);
digitalWrite(ledpin, LOW);
}
}
return returnCounter;
}
/**
* @name deBounce(int button)
* @param button button pin to read and do debouncing
* @returns state of button
*
* Reads a button and waits DEBOUNCE_TIME mSec and tests again
* Returns read if value unchanged and zero if it has changed for
* DEBOUNCE_TIME time
*/
int deBounce(int button) {
int state; // value of pin
//
// read the button
//
state = digitalRead(button);
delay(DEBOUNCE_TIME); // now wait a little time
//
// now check if it has changed
//
if (digitalRead(button) != state) {
return OFF; // the state has changed so consider it off
// if it went on halfway this routine it will
// have stabilized by the next time we read here
} else {
//
// return the button value
//
return state;
}
}
/**
* @name long processTemperature(int relay , int sensor, int tempSet, long tempCtr, long timerCtr)
* @param relay relay pin
* @param sensor sensor pin
* @param tempSet Set temperature as int value
* @param tempCtr 5 minute counter for temp readings
* @param timerCtr Main timer counter. If not 0 this timer is active
* @return long with new timer value for temperature readings
*
* this routine checks the timer counter. If non zeroe this timer is active.
* next check if the temp ctr has passed 5 minutes. If so check the temperature.
* \n Next check if the temperature is higher than the set temperature. If so
* switch the relay on. If it is below then the relay will be switched off.
*/
long processTemperature(int relay , int ledpin , int ledpinn, int sensor, int tempSet, unsigned long tempCtr, unsigned long timerCtr){
unsigned int tempReading; // temperature from LM35
float convertedTemp; // temperature in degrees
//
// first check if a counter is running and if not if it should be running
//
if (timerCtr != 0L) {
//
// there is a timer running so let's see if we need to read the temperature
//
if (millis() >= tempCtr) {
//
// yes so let's read the sensor
//
tempReading = analogRead(sensor);
//
// and convert it to a temperature
//
convertedTemp = (5.0 * tempReading *35.0)/1024.0;
// hier nog wat veranderen //////////////////////////////////////////////////////////////////
int value = analogRead(TEMP_SENSOR1);
float millivolts1 = (value / 1024.0) * 350;
float celsius = millivolts1 / 10;
//
// now check if we are above the set temperature
//
if (convertedTemp > tempSet) {
//
// switch the relay on
//
digitalWrite(relay, HIGH); // relay is aan
digitalWrite(ledpinn, LOW); // rode led is uit
digitalWrite(ledpin, HIGH); // groene led is aan
} else {
//
// switch the relay off
//
digitalWrite(relay, LOW); // relay is uit
digitalWrite(ledpinn, HIGH); // rode led is aan
digitalWrite(ledpin, LOW); // groene led is uit
}
//
// set the temperature for the next sensing period
//
tempCtr = millis() + FIVESECONDS;
}
} else {
//
// no activity so reset the tempCtr timer
//
tempCtr = 0L;
}
//
// and hand the timer back
//
return tempCtr;
}
wat doe ik allemaal fout
of heb ik het op een verkeerde manier geprobeerd op te lossen
ik hoor het graag
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: timer starten met knop ?
Een paar dingen die mij opvallen die mogelijk de oorzaak kunnen zijn:
- Je alloceert variabelen elke keer opnieuw in de routines. In loop maak je elke keer weer nieuwe door ze als int .... = functie uit te voeren. Dat gaat niet goed. De functie loop wordt niet beindigd dus het zou best kunnen dat je door je ram geheugen gaat.
- Je moet variabelen die je in een loop gebruikt gewoon bovenin de functie maken of global maken .
- Je alloceert variabelen elke keer opnieuw in de routines. In loop maak je elke keer weer nieuwe door ze als int .... = functie uit te voeren. Dat gaat niet goed. De functie loop wordt niet beindigd dus het zou best kunnen dat je door je ram geheugen gaat.
- Je moet variabelen die je in een loop gebruikt gewoon bovenin de functie maken of global maken .
Re: timer starten met knop ?
hoi nico
ik denk dat ik het probleem heb gevonden waardoor hij niet meer schakelt
als via print serial kijk dan kloppen de waardes niet
dit is wat ik krijg via print serial
boven in het programma heb ik gezegd dat de waarde tussen 0.00 en de 35.00 mag zijn
onder in het programma heb ik gezegd dat de waarde tussen de 15 en 35 moet zijn
daarnaast klopt de waarde van convertedTemp niet deze zegt nu dat het 8,54 is terwijl het hoger in het programma 24 is
ik ga dus even zoeken waar ik de berekening verkeerd heb ingevoerd
ik denk dat ik het probleem heb gevonden waardoor hij niet meer schakelt
als via print serial kijk dan kloppen de waardes niet
- Code: Alles selecteren
convertedTemp = (5.0 * tempReading *35.0)/1024.0;
// hier nog wat veranderen //////////////////////////////////////////////////////////////////
int value = analogRead(TEMP_SENSOR1);
float millivolts1 = (value / 1024.0) * 350;
float celsius = millivolts1 / 10;
//
// now check if we are above the set temperature
//
Serial.println(convertedTemp);
Serial.println(tempSet);
if (convertedTemp > tempSet) {
dit is wat ik krijg via print serial
- 8.37
15
8.54
15
8.54
15
8.54
35 potmeter naar maximaal gedraaid
8.37
35
8.54
35
8.37
35
8.37
35
8.54
35
8.54
35
8.54
35
8.54
35
8.37
35
8.54
35
boven in het programma heb ik gezegd dat de waarde tussen 0.00 en de 35.00 mag zijn
onder in het programma heb ik gezegd dat de waarde tussen de 15 en 35 moet zijn
daarnaast klopt de waarde van convertedTemp niet deze zegt nu dat het 8,54 is terwijl het hoger in het programma 24 is
ik ga dus even zoeken waar ik de berekening verkeerd heb ingevoerd
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: timer starten met knop ?
Ik zou het begrip "casting" in de C taal eens googelen
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 17 gasten