#include <EEPROM.h>
#include <LiquidCrystal_I2C.h> // Library for LCD
unsigned long current, previous;
const long interval = 2000;
int button1 = 10;
int button2 = 11;
int led = 9;
const int clockPin = 3;
const int countPin = 4;
const int resetPin = 5;
const int rotation = 20;
const int address = 50;
long bit_inc = 0, counter;
String counter_s;
float RPM = 0.0;
int en1 = 0, en2 = 0, en3 = 0;
LiquidCrystal_I2C lcd(0x27, 20, 4); // I2C address 0x27, 16 column and 2 rows
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
lcd.init(); //initialize the lcd
lcd.backlight(); //open the backlight
lcd.clear();
lcd.clear();
lcd.setCursor (0,1);
lcd.print(" PH +91 9825440537");
lcd.setCursor (0,0);
lcd.print("C-TEX INDUSTRIES");
lcd.setCursor(0,3);
lcd.print(" Version 1.0");
lcd.setCursor(0,2);
lcd.print(" AHMEDABAD.INDIA");
delay(2000);
current = millis();
previous = millis();
pinMode(led, OUTPUT);
pinMode(button1, INPUT_PULLUP);
pinMode(button2, INPUT_PULLUP);
pinMode(clockPin, INPUT);
pinMode(countPin, INPUT);
pinMode(resetPin, INPUT);
// counter = EEPROM.read(address);
counter_s = readStringFromEEPROM(address);
counter = (counter_s.toInt()/10);
// // for simulation only***********
// if (counter == 255){
// counter = 0;
// EEPROM.write(address, counter);
// }
// //*******************************
Serial.println("Program start:");
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("RPM: ");
lcd.setCursor(5, 1);
lcd.print(RPM);
lcd.setCursor(0, 0);
lcd.print("Total Knots:");
lcd.setCursor(14, 0);
lcd.print(counter);
}
void loop() {
// put your main code here, to run repeatedly:
int button1_state = digitalRead(button1);
int button2_state = digitalRead(button2);
if (button1_state == 0)
{
//LED ON
digitalWrite(led, LOW);
}
if (button2_state == 0)
{
//LED OFF
digitalWrite(led, HIGH);
}
current = millis();
if (current - previous >= interval){
previous = millis();
// Serial.println("bit_inc for 2 sec: " + String(bit_inc));
bit_inc = bit_inc *60;
// Serial.println("bit_inc for 1 min: " + String(bit_inc));
RPM = bit_inc/1;
Serial.println("Counter: " + String(counter));
Serial.println("RPM: " + String(RPM));
lcd.setCursor(0, 1);
lcd.print("RPM: ");
lcd.setCursor(5, 1);
lcd.print(RPM);
bit_inc = 0;
}
if (digitalRead(clockPin) == 0 and en1 == 1){
en1 = 0;
bit_inc++;
}
if (digitalRead(clockPin) == 1 and en1 == 0){
en1 = 1;
}
if (digitalRead(countPin) == 0 and en2 == 0){
en2 = 1;
}
if (digitalRead(countPin) == 1 and en2 == 1){
en2 = 0;
counter++;
if (counter >= 999999){
counter = 999999;
}
writeStringToEEPROM(address, String(counter));
lcd.setCursor(0, 0);
lcd.print("Total Knots:");
lcd.setCursor(14, 0);
lcd.print(counter);
lcd.setCursor (0,2);
lcd.print("--------------------");
lcd.setCursor (0,3);
lcd.print("* C-TEX INDUSTRIES *");
}
if (digitalRead(resetPin) == 0 and en2 == 0){
en3 = 1;
}
if (digitalRead(resetPin) == 1 and en2 == 1){
en3 = 0;
counter = 0;
writeStringToEEPROM(address, String(counter));
lcd.setCursor(0, 0);
lcd.print("Total Knots:");
lcd.setCursor(14, 0);
lcd.print(counter);
lcd.setCursor(14, 0);
lcd.print(" ");
}
}
void writeStringToEEPROM(int addrOffset, const String &strToWrite)
{
byte len = strToWrite.length();
EEPROM.write(addrOffset, len);
for (int i = 0; i < len; i++)
{
EEPROM.write(addrOffset + 1 + i, strToWrite[i]);
}
}
String readStringFromEEPROM(int addrOffset)
{
int newStrLen = EEPROM.read(addrOffset);
char data[newStrLen + 1];
for (int i = 0; i < newStrLen; i++)
{
data[i] = EEPROM.read(addrOffset + 1 + i);
}
data[newStrLen] = '\ 0'; // !!! NOTE !!! Remove the space between the slash "/" and "0" (I've added a space because otherwise there is a display bug)
return String(data);
}