// include the library http://arduino.cc/en/Reference/LiquidCrystal
#include <LiquidCrystal.h>
#include <EEPROM.h>
const int StartStopBtnPin = 8; // the pin that the Start Stop Button is attached to
const int ActionBtnPin = 9; // the pin that the Action Button is attached to
const int SetBtnPin = 10; // the pin that the Set Button is attached to
int StartStopBtnCounter = 0; // counter for the number of button presses
int StartStopBtnState = 0; // current state of the button
int StartStopBtnLastState = 0; // previous state of the button
int ActionBtnCounter = 0;
int ActionBtnState = 0;
int ActionBtnLastState = 0;
boolean IsActionBtnActive = true;
int SetBtnCounter = 0;
int SetBtnState = 0;
int SetBtnLastState = 0;
boolean IsSetBtnActive = true;
int Weight = 0;
int Tare = 0;
int WeightTared = 0; //WeightTared = Weight - Tare
int WeightLimit = 1000;
boolean IsWeighting = false;
boolean IsAutofilling = false;
String TempString = "";
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
void WriteToLCD(String line1, String line2){
if (line1 != ""){
lcd.clear();
lcd.setCursor(0, 0);//col,row
lcd.print(line1);
if (line2 != ""){
lcd.setCursor(0, 1);//col,row
lcd.print(line2);
}
} else { // empty first line
lcd.setCursor(0, 1);//col,row
lcd.print(" ");
lcd.setCursor(0, 1);//col,row
lcd.print(line2);
}
}
String StampWeightLimit() {
TempString="Cur.limit ";
TempString=TempString + WeightLimit;
return TempString+"gr";
}
void ModifyWeightLimit(int increment){
int TempWeight;
TempWeight=WeightLimit;
TempWeight=TempWeight+increment;
if (TempWeight<0 || TempWeight>9990){
lcd.noDisplay();
delay(500);
lcd.display();
} else {
WeightLimit=TempWeight;
}
}
String StampTare() {
TempString="Cur. tare ";
TempString=TempString + Tare;
return TempString+"gr";
}
void SaveToEEPROM(unsigned int LimitInGr){
unsigned int wl;
wl=LimitInGr>>8; //8 zeros at beggining
unsigned int wr;
wr=LimitInGr<<8; //8 zeros at end
wr=wr>>8;
EEPROM.write(0,wl);
EEPROM.write(1,wr);
TempString="SAVED ";
TempString=TempString + LimitInGr;
TempString=TempString+"gr";
WriteToLCD("",TempString);
}
void ReadFromEEPROM(){
unsigned int wl;
wl=EEPROM.read(0);
wl=wl<<8;
unsigned int wr;
wr=EEPROM.read(1);
unsigned int w;
w=wl+wr;
if (w==0 || w>9999) {
WeightLimit=1000;
} else {
WeightLimit=w;
}
}
void setup() {
// initialize the StartStopBtnPin pin as a input:
pinMode(StartStopBtnPin, INPUT);
pinMode(ActionBtnPin, INPUT);
pinMode(SetBtnPin, INPUT);
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
//lcd.setCursor(0, 0);//col,row
WriteToLCD(">Stopped","Made By Hw2Sw");
//Read the eeprom and find the latest weight limit
ReadFromEEPROM();
}
void loop() {
// read the start stop input pin:
StartStopBtnState = digitalRead(StartStopBtnPin);
ActionBtnState = digitalRead(ActionBtnPin);
SetBtnState = digitalRead(SetBtnPin);
//////////////////////////////////////////////////
//////////////////////////////////////////////////
//THE START STOP BUTTON
if (StartStopBtnState != StartStopBtnLastState) {
if (StartStopBtnState == HIGH) {
StartStopBtnCounter++;
}
IsWeighting=false;
IsAutofilling=false;
if (StartStopBtnCounter == 0) {
IsActionBtnActive = true;
IsSetBtnActive = true;
WriteToLCD(">Stopped","");
} else if (StartStopBtnCounter == 1) {
IsActionBtnActive = false;
IsSetBtnActive = false;
WriteToLCD(">STARTED","");
} else {
StartStopBtnCounter=0;
}
}
StartStopBtnLastState = StartStopBtnState;
//////////////////////////////////////////////////
//////////////////////////////////////////////////
//THE ACTION BUTTON
if (ActionBtnState != ActionBtnLastState) {
if (IsActionBtnActive==true) {
if (ActionBtnState == HIGH) {
ActionBtnCounter++;
}
IsWeighting=false;
IsAutofilling=false;
if (ActionBtnCounter == 0) {
WriteToLCD(">Stopped","");
} else if (ActionBtnCounter == 1) {
TempString=StampWeightLimit();
WriteToLCD(">AUTOFILL",TempString);
} else if (ActionBtnCounter == 2) {
//Get Weight from the sensor
WriteToLCD(">Weight","");
IsWeighting=true;
} else if (ActionBtnCounter == 3) {
//Get Weight from the sensor
WriteToLCD(">Tare","");
} else if (ActionBtnCounter == 4) {
//Get Weight from the sensor
WriteToLCD(">Untare","");
} else if (ActionBtnCounter == 5) {
TempString=StampWeightLimit();
WriteToLCD(">Change -10gr",TempString);
} else if (ActionBtnCounter == 6) {
TempString=StampWeightLimit();
WriteToLCD(">Change -100gr",TempString);
} else if (ActionBtnCounter == 7) {
TempString=StampWeightLimit();
WriteToLCD(">Change -1000gr",TempString);
} else if (ActionBtnCounter == 8 ) {
TempString=StampWeightLimit();
WriteToLCD(">Change +10gr",TempString);
} else if (ActionBtnCounter == 9) {
TempString=StampWeightLimit();
WriteToLCD(">Change +100gr",TempString);
} else if (ActionBtnCounter == 10) {
TempString=StampWeightLimit();
WriteToLCD(">Change +1000gr",TempString);
} else if (ActionBtnCounter == 11) {
TempString=StampWeightLimit();
WriteToLCD(">Save cur. lim.",TempString);
} else if (ActionBtnCounter == 12) {
TempString=StampWeightLimit();
WriteToLCD(">RESET limit",TempString);
} else {
ActionBtnCounter=0;
}
} else { //IsActionBtnActive==false
WriteToLCD("","Not allowed");
ActionBtnCounter=0;
}
}
ActionBtnLastState = ActionBtnState;
//////////////////////////////////////////////////
//////////////////////////////////////////////////
//THE SET BUTTON
if (SetBtnState != SetBtnLastState) {
if (IsSetBtnActive==true) {
if (SetBtnState == HIGH) {
SetBtnCounter++;
}
if (SetBtnCounter == 0) {
if (ActionBtnCounter == 0) { //stopped
WriteToLCD("","Not allowed");
} else if (ActionBtnCounter == 1) { //autofill
IsAutofilling=not IsAutofilling;
} else if (ActionBtnCounter == 2) { //get weight
//Nothing to do...
} else if (ActionBtnCounter == 3) { //tare
TempString=StampTare();
WriteToLCD("",TempString);
} else if (ActionBtnCounter == 4) { //untare
Tare=0;
TempString=StampTare();
WriteToLCD("",TempString);
} else if (ActionBtnCounter == 5) { //-10gr
ModifyWeightLimit(-10);
TempString=StampWeightLimit();
WriteToLCD("",TempString);
} else if (ActionBtnCounter == 6) { //-100gr
ModifyWeightLimit(-100);
TempString=StampWeightLimit();
WriteToLCD("",TempString);
} else if (ActionBtnCounter == 7) { //-1000gr
ModifyWeightLimit(-1000);
TempString=StampWeightLimit();
WriteToLCD("",TempString);
} else if (ActionBtnCounter == 8 ) { //+10gr
ModifyWeightLimit(10);
TempString=StampWeightLimit();
WriteToLCD("",TempString);
} else if (ActionBtnCounter == 9) { //+100gr
ModifyWeightLimit(100);
TempString=StampWeightLimit();
WriteToLCD("",TempString);
} else if (ActionBtnCounter == 10) { //+1000gr
ModifyWeightLimit(1000);
TempString=StampWeightLimit();
WriteToLCD("",TempString);
} else if (ActionBtnCounter == 11) { //Save weight limit to the eeprom
SaveToEEPROM(WeightLimit);
} else if (ActionBtnCounter == 12) { //Save weight limit to the eeprom
SaveToEEPROM(1000);
}
} else {
SetBtnCounter=0;
}
} else { //IsSetBtnActive==false
WriteToLCD("","Not allowed");
SetBtnCounter=0;
}
}
SetBtnLastState = SetBtnState;
}
As you may notice the LCD is connected at arduino pins 2,3,4,5,6,7 .
The three menu buttons are connected at pins 8,9,10.
The first button (pin 8) is the START/STOP button. This button will open and close the gravity feed valve.
The second button (pin9) is the MENU (action) button. It loops between the various options that liquid filler offers.
The third button is the SET button. Sets/confirms the selected MENU voice.
The void WriteToLCD(String line1, String line2) function help us to print the various options on our LCD.
String StampWeightLimit() prints the weight limit on the screen
void ModifyWeightLimit(int increment) modifies the weight limit of the machine
String StampTare() prints the tare (WeightTared = Weight - Tare)
void SaveToEEPROM(unsigned int LimitInGr) saves the weightlimit
void ReadFromEEPROM() reads and restores the saved weightlimit
The menu is similar to the circular menu presented at the simple circular menu article.