I have made Sensor-valve-LCD-Keypad system.
if I input an weight of water of a height of water using keypad, arduino control the amount of water using sensor.
but code is not operated well, if i compile the code, there is no error.
#include <LiquidCrystal.h>//LCD Header file load
const int sensorIR=0;//IR sensor
const int sensorUS=1;//Ultrasonic sensor
const int sensorRC=2;
const int numRows = 4;//the number of Rows
const int numCols = 4;// The number of Col
const int debounceTime = 30;//pushing time
const int valve=13;
const int threshold = 1;
LiquidCrystal lcd(22,26,30,34,38,42); //lcd number 4, 6, 11, 12, 13, 14
const char keymap[numRows][numCols] = {
{ '1', '2', '3', 'q' },
{ '4', '5', '6', 'w' },
{ '7', '8', '9', 'e' },
{ '*', '0', '#', 'r' }
};
const int rowPins[numRows] = {6, 7, 8, 9}; //keypad sw4,5,6,7
const int colPins[numCols] = {2, 3, 4, 5}; //keypad sw0,1,2,3
//===================set up=====================================//
void setup() {
pinMode(valve,OUTPUT);// valve
//lcd.begin(8,2);//lcd setup
Serial.begin(9600);
for (int row = 0; row < numRows; row++)//keypad setup
{
pinMode(rowPins[row], INPUT);
digitalWrite(rowPins[row], HIGH);
}
for(int column = 0; column < numCols; column++)
{
pinMode(colPins[column], OUTPUT);
digitalWrite(colPins[column], HIGH);
}
Serial.println("MODE");//print on LCD
}
// ===========grobal constant==========
char attempt[4]; // char of inputs
int ans[4],data; // int of inputs
int z=0;
//=====================getKey====================
char getKey()// getting key from key pad
{
char key = 0;
for (int column = 0; column < numCols; column++)
{
digitalWrite(colPins[column], LOW);
for(int row = 0; row < numRows; row++)
{
if(digitalRead(rowPins[row]) == LOW)
{
delay(debounceTime);
while(digitalRead(rowPins[row])==LOW)
;
key = keymap[row][column];
}
}
digitalWrite(colPins[column], HIGH);
}
return key;
}
//============correctpin==================================
void correctPIN() // do this if correct PIN entered
{
Serial.println("* ok *");
data=1000*ans[0]+100*ans[1]+10*ans[2]+ans[3];
//lcd.setCursor(0,1); // the lcd cursor moves to the second line
Serial.print(data);
delay(1000);
for(int zzz;zzz<z;zzz++)
{
ans[zzz]=0;
}
}
//===============incorrect pin ================
void incorrectPIN() // do this if incorrect PIN entered
{
Serial.print("TryAgain");
delay(1000);
Serial.print("MODE");
}
//================ check pin====================
void checkPIN()
{
for (int zz=0; zz<z; zz++) // wipe attempt
{
ans[zz]=int(attempt[zz])-48;
attempt[zz]=0;
}
correctPIN();
}
//===================readKeypad===========================
void readKeypad()// Keypad read
{
char key1 = getKey();
Serial.print("press *");
if (key1 != 0) [b] //[color=red]========> not operate[/color]
{[/b]
switch(key1)
{
case '*'://turn on getting keypad system
z=0;
//lcd.setCursor(0,1);
Serial.print(key1);
break;
case '#':// turn off getting keypad system
delay(100); // for extra debounce
if (z!=4)
{
incorrectPIN();//check 4 digits number
}
else
{checkPIN();}//move to checkPIN function
break;
default:
attempt[z]=key1;//displace component of array from keypad
//lcd.setCursor(0,1);
Serial.print(attempt[z]);// print key on lcd
z++;
}
}
}
//=======================ultrasonic====================
float ultrasonic()//Ultrasonic sensor code
{
int valueUS=analogRead(sensorUS);//receive data from sensor
float rangeUS=valueUS/3.8+25;//change data to mm unit
delay(10);//10ms delay
return rangeUS;// return data to height function
}
//====================IRsensor===========================
float IRsensor()// IR sensor
{
float valueIR = analogRead(sensorIR);//receive data from sensor
float rangeIR;
if (valueIR>threshold)
{
rangeIR=((2914/(valueIR+5))-1)*10;//chagne to data to mm unit
}
return rangeIR;//return data to height function
}
//=============================Height function==================//
void height()//height control system
{
readKeypad();// get data from keypad
digitalWrite(valve,HIGH);// open valve
while(1)// infinite loop to close valve
{
float IRdata =IRsensor();//get data from IRsensor
float USdata = ultrasonic();//get data from US sensor
if((data-2+USdata<=IRdata)&&(IRdata<=USdata+data+2))
{
digitalWrite(valve,LOW);//close valve
break;//break while(1)
}
}
}
/*void weight()
{
readKeypad();
digitalWrite(valve,HIGH);
while(1)
{
flaot rangeRC =loadcell();
if(data-2<rangeRC<data-2)
{
digitalWrite(valve,LOW)
break;
}
}
}
float loadcell()
{
float valRC=analogRead(2);
return valRC;
}
*/
//======================= main function======================//
void loop() {
char key = getKey();// get key from keypad
if (key != 0)
{
switch(key)
{
case 'q':// calling height function
height();
break;
case 'r':
// weight();
break;
}
}
}
====
my code is not perfect because i didn't program for loadcell. but I made a code for height mode.
the algorithm
1.select mode in void loop(using get key function)
2. height fuction
3. readkeypad ( problem occurs in this fuction. the screen shows "press *" after that there is no response. no progression. if I push q button , "press *" show on screen again.
4. check key or incollect key
5. collect key
6. get data from collect key function.
7. compare 'data' with sensors data
8. close valve.
Pleas help me. I spent so much time to solve this problem. but i couldn't find out the solution.