Project description:
I am working on a hobby project in which I had made a timer circuit using standalone arduino IC. In this project there are two push buttons among which one is for setting minutes and the other one is for starting timer after setting minutes. And its basic function is whatever time we will set in minutes, a relay connecting to one of the micro controller pin will be energized and particular device connected to that relay will be ON for defined minutes.
Problem:
So problem is I am not able to get accurate timing to switch OFF relay. I am currently using method of checking time by millis function and comparing it with entered (value601000) milliseconds.
What can be done to get accurate timings ?
Thanks in advance !
Here's my code:
#include<LiquidCrystal.h>
LiquidCrystal lcd(A5,A4,A3,A2,A1,A0);
unsigned long currentMilli = 0;
unsigned long waitIntervalMilli = 0;
unsigned long count = 0;
byte mark=0;
//float minutes;
const int set_minutes = 8;
const int start_timer = 7;
const int device_pin = 11;
void setup() {
// put your setup code here, to run once:
initializeInterrupts();
lcd.begin(16,2);
pinMode(set_minutes,INPUT);
pinMode(start_timer,INPUT);
pinMode(device_pin,OUTPUT);
}
void initializeInterrupts()
{
cli();
PCICR = 0x05 ;
PCMSK0 = 0b00000001;
PCMSK2 = 0b10000000;
sei();
}
ISR(PCINT0_vect)
{
if(digitalRead(set_minutes)== HIGH && mark == 0)
{
count = count + 5;//counting in minutes
if(count > 360)
{
count = 0;
}
lcd.clear();
lcd.print("Minutes: ");
lcd.setCursor(0,1);
lcd.print(count);
waitIntervalMilli = count * 60 * 1000; //converting entered value to milliseconds
}
}
ISR(PCINT2_vect)
{
if(count != 0 && digitalRead(start_timer) == HIGH)
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Minutes Left:");
digitalWrite(device_pin,HIGH);
currentMilli = 0;
mark = 1;
}
}
void loop() {
currentMilli = millis();
if((waitIntervalMilli-currentMilli) <= 0 && mark == 1)
{
mark = 0;
count = 0;
digitalWrite(device_pin,LOW);
}
}
Please use code tags (</> button on the toolbar) when you post code or warning/error messages. The reason is that the forum software can interpret parts of your code as markup, leading to confusion, wasted time, and a reduced chance for you to get help with your problem. This will also make it easier to read your code and to copy it to the IDE or editor. If your browser doesn't show the posting toolbar then you can just manually add the code tags: [code]`` [color=blue]// your code is here[/color] ``[/code]
Using code tags and other important information is explained in the How to use this forum post. Please read it.
You have all the wrong code inside your ISRs. Especially you should not be doing any printing. The ISR code should be something as simple as
ISR(PCINT0_vect)
{
change0triggered = true;
}
and the rest of the code should be elsewhere.
But you really don't need interrupts at all to detect SLOOOOWWWW humans pressing buttons. Polling and digitalRead() will be plenty fast enough and much simpler.
your timer starts with reset of Arduino, not when you stop pressing the button. the sketch compares the interval with millis from the start of Arduino.
Ohh! thanks Juraj for pointing it out then i tried other way too like this
unsigned long previousMilli = 0;
unsigned long currentMilli = 0;
unsigned long interval = //whatever value there will be according to above code
void loop()
{
currentMilli = millis();
if((currentMilli - previousMilli) >= interval)
{
digitalWrite(device_pin,LOW);
previousMilli = currentMilli;
}
}
this way also if i set timer for one minute it switches off device before time
here are some values taken by me repeatedly (input time 1 minute and device stops at following time)