#define Rel 2
#define led1 3
#define led2 4
#define led3 5
unsigned int reload = 0xF424;
unsigned int Timer = 0 ;
unsigned int minn , maxn , setn ;
unsigned int stander ;
boolean timer_led = LOW ;
volatile boolean timer_help = LOW ;
boolean voltage_high = LOW ;
unsigned int set_value = 0 ;
unsigned long currentMillis ;
unsigned long perviousMillis = 0 ;
boolean voltage_low = LOW ;
unsigned int max_value = 0 ;
unsigned int min_value = 0 ;
//unsigned int set_value = 0 ;
boolean adc = LOW ;
boolean direction = LOW ;
unsigned int INTMAX ;
unsigned int INTMIN ;
byte number_of_min = 1 ;
boolean min_help = LOW ;
int flow_count ;
volatile boolean print_help = LOW ;
int prev_value = 0 ;
int count ;
#include <limits.h>
int values[10] ={} ;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
pinMode(Rel, OUTPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
INTMIN =analogRead(A0) ;
INTMAX = INTMIN ;
timer1_activate();
startprogram();
if(INTMIN<350) direction = LOW;
else direction = HIGH ;
//prev_value = stander ;
//if(stander > 511) {max_value =818 ; min_value = 511 ; }
//else if(stander < 511) { max_value = 511 ; min_value = 204 ; }
}
ISR(TIMER1_COMPA_vect)
{
count++;
gauge_timer(number_of_min ) ;
//timer4();
}
void startprogram (void )
{
while(timer_help == LOW){
if(min_help ==HIGH)
{
min_help =LOW ;
number_of_min ++ ;
}
}
//}
}
void gauge_timer(int min_num)
{
static int sec ;
static int minn ;
timer_led = !timer_led ;
if(count<11) {
digitalWrite(Rel , timer_led);
int read_value = analogRead(A0) ;
values[count -1] = read_value ;
}
else if(count>=11 && sec<1)
{
min_help = LOW ;
int N = sizeof(values) / sizeof(values[0]);
findMinimumMaximum(values ,N , &INTMIN , &INTMAX ) ;
{
Serial.print("the min value is : ");
Serial.println(INTMIN) ;
Serial.print("the max value is : ");
Serial.println(INTMAX);
if((INTMAX-INTMIN)>150)
{
timer_help = HIGH ;
digitalWrite(led1 , HIGH);
Serial.println("I'm exit form timer ");
deactivate_timer1() ;
}
}
sec++ ;
}
else sec ++ ;
if(sec == 60 )
{
minn++ ;
count= 0 ;
sec = 0 ;
}
//}
if(minn> min_num)
{
minn = 0 ;
sec = 0 ;
count = 0 ;
min_help =HIGH ;
}
}
void loop() {
set_value = ((INTMAX - INTMIN)/3)*2 +INTMIN ;
// currentMillis = millis() ; // used to read from adc ;
currentMillis = millis() ;
if(currentMillis -perviousMillis >2000)
{
int value1 = analogRead(A0) ;
perviousMillis = currentMillis ;
if(direction == LOW)
{
if(value1<set_value){
values[flow_count] =value1 ;
flow_count ++ ;
if(flow_count >=10) {
flow_count = 0 ;
int N = sizeof(values) / sizeof(values[0]);
findMinimumMaximum(values ,N , &INTMIN , &INTMAX ) ;
}
}
}
else if(direction ==HIGH)
{
if(value1>set_value){
values[flow_count] =value1 ;
flow_count ++ ;
if(flow_count >=10) {
flow_count = 0 ;
int N = sizeof(values) / sizeof(values[0]);
findMinimumMaximum(values ,N , &INTMIN , &INTMAX ) ;
}
}
}
Serial.print("value of adc from main program is : ");
Serial.println(value1);
Serial.print("value of max from main program is : ");
Serial.println(INTMAX);
Serial.print("vlaue of min value form main program is : ");
Serial.println(INTMIN) ;
Serial.print("value of set is : ");
Serial.println(set_value);
}
/*if(timer_help ==LOW)
{
timer_help =HIGH ;
timer1_activate();
}*/
/*
if(adc == LOW)
{
stander = analogRead(A0) ;
delay(200);
}
if(prev_value == stander && timer_help==LOW && adc ==LOW) {
timer1_activate() ;
adc = HIGH ;
timer_help = HIGH;
}
if(print_help == HIGH)
{
print_help = LOW ;
Serial.print("value of max from main program is : ");
Serial.println(INTMAX);
Serial.print("vlaue of min value form main program is : ");
Serial.println(INTMIN) ;
digitalWrite(led1 , HIGH);
}*/
}
void timer1_activate()
{
count = 0 ;
TCCR1A = 0;
TCCR1B = (1<<WGM12) | (1<<CS12);
OCR1A = reload;
TIMSK1 |= (1 << OCIE1A);
}
void deactivate_timer1()
{
count = 0 ;
TCCR1A = 0; // Clear Timer/Counter Control Register A
TCCR1B = 0; // Clear Timer/Counter Control Register B
TIMSK1 = 0; // Disable all Timer1 interrupts
}
/*
void timer4(void)
{
static int sec ;
static int minn ;
//count++ ;
stander = analogRead(A0) ;
// Serial.print("the value of stander is : ") ;
// Serial.println(stander);
values[count-1] = stander ;
// Serial.println(count);
timer_led = !timer_led ;
if (count<11 && minn<1)
{
digitalWrite(Rel , timer_led);
}
else if(count>=11 and sec<1)
{
int N = sizeof(values) / sizeof(values[0]);
findMinimumMaximum(values ,N , &INTMIN , &INTMAX ) ;
sec++ ;
if(sec == 60 )
{
minn++ ;
count= 0 ;
sec = 0 ;
}
}
else {
digitalWrite(Rel , LOW);
sec++ ;
if(sec == 60 )
{
minn++ ;
count= 0 ;
sec = 0 ;
}
}
if(minn >=1)
{
minn = 0 ;
sec = 0 ;
timer_help = LOW ;
print_help = HIGH;
Serial.println("Hello Im herer");
adc=LOW;
//deactivate_timer();
}
}\*/
/*
void timer_max()
{
static int sec ;
sec ++ ;
int value = analogRead(A0) ;
if(value > max_value ) max_value = value;
if(sec == 60 )
deactivate_timer1();
}*/
/*
void timer_min(){
static int sec ;
sec ++ ;
int value = analogRead(A0)
if(value < min_value )min_value = value ;
if(sec == 60 ) deactivate_timer1() ;
}
*/
void findMinimumMaximum(int arr[], int N , int* mint , int* maxt)
{
int i;
// variable to store the minimum
// and maximum element
//int minE = INT_MAX, maxE = INT_MIN;
// unsigned int minE=808 , maxE=200 ;
// Traverse the given array
for (i = 0; i < N; i++) {
// If current element is smaller
// than minE then update it
if (arr[i] < *mint) {
*mint= arr[i];
}
// If current element is greater
// than maxE then update it
if (arr[i] > *maxt) {
*maxt = arr[i];
}
}
// Print the minimum and maximum element
for(int j = 0 ; j<N ; j++)
{
// Serial.println(arr[j]);
}
Serial.print("The minimum element is ");
Serial.println(*mint);
Serial.print("The maximum element is ");
Serial.println((*maxt));
return;
}
/*
if(timer_led == HIGH ) {
int value = analogRead(A0) ;
if(value > stander) // min const and max varible
{
digitalWrite(led1 , HIGH);digitalWrite(led2 , LOW); digitalWrite(led3 , LOW);
min_value = value ;
timer_max();
Timer = 1 ;
}
if(value<stander ) //max const and min varible
{
digitalWrite(led1 , LOW);digitalWrite(led2 , HIGH); digitalWrite(led3 , LOW);
max_value = value ;
timer_min() ;
Timer = 2 ;
}
if(value ==stander )// I do not have any flow
{
digitalWrite(led1 , LOW);digitalWrite(led2 , LOW); digitalWrite(led3 , HIGH) ;
}
}else{digitalWrite(led1 , LOW);digitalWrite(led2 , LOW); digitalWrite(led3 , LOW) ;}
*/
/* Serial.println(value);
if(value > 500) {voltage_high(value) ; }
if(value<500) {voltage_low() ;}
/* digitalWrite(Rel , LOW);
delay(1000);
digitalWrite(Rel , HIGH);
delay(1000) ;
*/
// put your main code here, to run repeatedly:
//}
/*
void voltage_high(int value ){
//float y =0.004887 * value ;
// if(minn<value)
//Serial.print("the value of voltage is :") ;
//Serial.println(y , 3);
//float x = (y-2.5)/0.00326 ;
//Serial.print("the value of x is : ") ;
//Serial.println(x , 3 );
}*/
/*
void voltage_low(){
}*/