#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SD.h>
const int buttonPin = A0;
const int resetBtn = A1;
int buttonState = 0;
int lastButtonState = 0;
int pigeonCount = 0;
int numBoxes = 0;
// define file name for data storage
const char* dataFile = "data.txt";
const int chipSelect = 10;
LiquidCrystal_I2C lcd(0x27, 16, 2);
String amateurName = "";
String basketNumber = "";
String gender = "";
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Pigeon Counter");
lcd.setCursor(0, 1);
lcd.print("by OpenAI");
delay(2000);
lcd.clear();
Serial.begin(9600);
while (!Serial) {
Serial.print("SERIAL");
}
if (!SD.begin(chipSelect)) {
lcd.print("SD card");
lcd.setCursor(0, 1);
lcd.print("initialization");
delay(2000);
lcd.clear();
return;
}
lcd.print("SD card");
lcd.setCursor(0, 1);
lcd.print("initialized");
delay(2000);
lcd.clear();
// open file for writing
File data = SD.open(dataFile, FILE_WRITE);
if (!data) {
lcd.print("Error opening");
lcd.setCursor(0, 1);
lcd.print("pigeonData.txt");
delay(2000);
lcd.clear();
return;
}
data.println("Pigeon Data:");
data.close();
}
void loop() {
buttonState = digitalRead(buttonPin);
if (buttonState != lastButtonState) {
if (buttonState == LOW) {
pigeonCount++;
lcd.setCursor(0, 0);
lcd.print("Pigeon Count:");
lcd.setCursor(0, 1);
lcd.print(pigeonCount);
}
delay(50);
}
lastButtonState = buttonState;
byte ResetBtnState = digitalRead(resetBtn);
if (ResetBtnState == LOW){
pigeonCount = 0; // reset pigeon counter
//lcd.clear(); // clear LCD screen
}
if (pigeonCount == 10 ) {
while (!Serial.available()) {
char c = Serial.read();
if (isdigit(c)) {
numBoxes = c - '0';
}
}
amateurName = Serial.readStringUntil('\n');
while (!Serial.available()) {
;
}
basketNumber = Serial.readStringUntil('\n');
while (!Serial.available()) {
;
}
gender = Serial.readStringUntil('\n');
// open file for writing
File data = SD.open(dataFile, FILE_WRITE);
if (data) {
data.print("Pigeons: ");
data.print(pigeonCount);
data.print(", Amateur Name: ");
data.print(amateurName);
data.print(", Basket Number: ");
data.print(basketNumber);
data.print(", Gender: ");
data.println(gender);
data.close();
lcd.print("Data saved to");
lcd.setCursor(0, 1);
lcd.print("SD card");
delay(2000);
lcd.clear();
} else {
lcd.print("Error saving to");
lcd.setCursor(0, 1);
lcd.print("SD card");
delay(2000);
lcd.clear();
}
pigeonCount = 0;
}
}