#include <Stepper.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <Wire.h>
// Define stepper motor parameters
const int stepsPerRevolution = 2048; // Change this value according to your stepper motor specifications
// Pins for stepper motors
//const int stepper1Pins[] = {22, 23, 24, 25}; // Pins for stepper motor 1
const int stepper1Pins[] = {26, 27, 28, 29}; // Pins for stepper motor 2
const int stepper2Pins[] = {30, 31, 32, 33}; // Pins for stepper motor 3
const int stepper3Pins[] = {34, 35, 36, 37}; // Pins for stepper motor 4
// Define keypad layout
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {A0, A1, A2, A3};
byte colPins[COLS] = {A4, A5, A6, A7};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// Pins for LCD screen
const int lcdAddress = 0x27; // Address of the LCD screen
const int lcdCols = 20; // Number of columns in the LCD screen
const int lcdRows = 4; // Number of rows in the LCD screen
LiquidCrystal_I2C lcd(lcdAddress, lcdCols, lcdRows);
// Pins for GSM module (SoftwareSerial)
const int gsmRxPin = 10; // Rx pin of GSM module connected to Arduino pin 10
const int gsmTxPin = 11; // Tx pin of GSM module connected to Arduino pin 11
// Global variables
Stepper stepper1(stepsPerRevolution, stepper1Pins[0], stepper1Pins[1], stepper1Pins[2], stepper1Pins[3]);
Stepper stepper2(stepsPerRevolution, stepper2Pins[0], stepper2Pins[1], stepper2Pins[2], stepper2Pins[3]);
Stepper stepper3(stepsPerRevolution, stepper3Pins[0], stepper3Pins[1], stepper3Pins[2], stepper3Pins[3]);
//Stepper stepper4(stepsPerRevolution, stepper4Pins[0], stepper4Pins[1], stepper4Pins[2], stepper4Pins[3]);
// Define maximum number of slots
const int maxSlots = 10;
int totalRotations = 0;
// Define states
enum State {
INITIAL,
FEVER_OPTIONS,
COLD_OPTIONS,
NAUSEOUSNESS_OPTIONS,
ENO_OPTIONS,
BOTH_OPTIONS,
MEDICINE_OPTIONS,
PHONE_NUMBER_INPUT
};
State currentState = PHONE_NUMBER_INPUT;
String phoneNumber = ""; // To store the phone number
void setup()
{
// Set up stepper motors
stepper1.setSpeed(5); // Adjust speed as needed
stepper2.setSpeed(5);
stepper3.setSpeed(5);
//stepper4.setSpeed(5);
// Initialize LCD screen
lcd.begin(lcdCols, lcdRows);
lcd.backlight();
lcd.print("Enter phone number");
lcd.setCursor(0, 1);
lcd.print("using keypad:");
}
void loop()
{
char key = keypad.getKey();
if (key != NO_KEY) {
switch (currentState) {
case PHONE_NUMBER_INPUT:
if (key == '#') { // Check if user has finished entering the phone number
lcd.clear();
lcd.print("Phone number saved:");
lcd.setCursor(0, 1);
lcd.print(phoneNumber);
delay(2000);
currentState = INITIAL; // Go back to initial state after saving phone number
lcd.clear();
lcd.print("Select an option");
lcd.setCursor(0, 1);
lcd.print("1.Fever 4.Multiple");
lcd.setCursor(0, 2);
lcd.print("2. Cold ");
lcd.setCursor(0, 3);
lcd.print("3. Nauseousness");
lcd.setCursor(0, 0);
}
else if (key == '*') { // Backspace functionality
if (phoneNumber.length() > 0) {
phoneNumber.remove(phoneNumber.length() - 1);
lcd.setCursor(phoneNumber.length(), 2);
lcd.print(" "); // Clear the character from LCD
}
}
else if (key >= '0' && key <= '9') { // Check if key pressed is a digit
if (phoneNumber.length() < 10) { // Limiting phone number to 10 digits
phoneNumber += key; // Append the digit to the phone number string
lcd.setCursor(phoneNumber.length() - 1, 2); // Set cursor position for displaying entered digits
lcd.print(key); // Print the entered digit
}
}
break;
case INITIAL:
if (key == '1') {
lcd.clear();
lcd.print("Fever ");
lcd.setCursor(0, 1);
lcd.print("1. Paracetamol");
currentState = FEVER_OPTIONS;
}
else if (key == '2') {
currentState = COLD_OPTIONS;
lcd.clear();
lcd.print("Cold");
lcd.setCursor(0, 1);
lcd.print("1. Citirizene");
}
else if (key == '3') {
currentState = NAUSEOUSNESS_OPTIONS;
lcd.clear();
lcd.print("Nauseousness");
lcd.setCursor(0, 1);
lcd.print("1. Ondansetron");
}
/*else if (key == '4') {
currentState = ENO_OPTIONS;
lcd.clear();
lcd.print("Gastric");
lcd.setCursor(0, 1);
lcd.print("1. Eno");
}*/
else if (key == '4') {
currentState = BOTH_OPTIONS;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("1. Fever, Cold");
lcd.setCursor(0, 1);
lcd.print("2.Cold,Nauseousness");
lcd.setCursor(0, 2);
lcd.print("3.Fever,Nauseousness");
lcd.setCursor(0, 3);
lcd.print("4.All three");
}
break;
case FEVER_OPTIONS:
if (key == '1') {
lcd.clear();
lcd.print("Dispensing Paracetamol");
if (moveStepper(stepper1, 2048)) { // Adjust steps as needed
delay(2000);
phoneNumber = "";
currentState = PHONE_NUMBER_INPUT;
lcd.clear();
lcd.print("Enter phone number");
lcd.setCursor(0, 1);
lcd.print("using keypad:");
}
}
break;
case COLD_OPTIONS:
if (key == '1') {
lcd.clear();
lcd.print("Dispensing Citirizene");
if (moveStepper(stepper2, 2048)) { // Adjust steps as needed
delay(2000);
phoneNumber = "";
currentState = PHONE_NUMBER_INPUT;
lcd.clear();
lcd.print("Enter phone number");
lcd.setCursor(0, 1);
lcd.print("using keypad:");
}
}
break;
case NAUSEOUSNESS_OPTIONS:
if (key == '1') {
lcd.clear();
lcd.print("Dispensing Ondansetron");
if (moveStepper(stepper3, 2048)) { // Adjust steps as needed
delay(2000);
phoneNumber = "";
currentState = PHONE_NUMBER_INPUT;
lcd.clear();
lcd.print("Enter phone number");
lcd.setCursor(0, 1);
lcd.print("using keypad:");
}
}
break;
/*case ENO_OPTIONS:
if (key == '1') {
lcd.clear();
lcd.print("Dispensing Eno");
if (moveStepper(stepper4, 2048)) { // Adjust steps as needed
delay(2000);
phoneNumber = "";
currentState = PHONE_NUMBER_INPUT;
lcd.clear();
lcd.print("Enter phone number");
lcd.setCursor(0, 1);
lcd.print("using keypad:");
}
}
break;*/
case BOTH_OPTIONS:
if (key == '1') {
lcd.clear();
lcd.print("Dispensing Paracetamol");
if (moveStepper(stepper1, 2048)) { // Adjust steps as needed
delay(1000);
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Dispensing Citirizene");
if (moveStepper(stepper2, 2048)) { // Adjust steps as needed
delay(2000);
phoneNumber = "";
currentState = PHONE_NUMBER_INPUT;
lcd.clear();
lcd.print("Enter phone number");
lcd.setCursor(0, 1);
lcd.print("using keypad:");
}
}
}
else if (key == '2') {
lcd.clear();
lcd.print("Dispensing Citirizene");
if (moveStepper(stepper2, 2048)) { // Adjust steps as needed
delay(1000);
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Dispensing Ondansetron");
if (moveStepper(stepper3, 2048)) { // Adjust steps as needed
delay(2000);
phoneNumber = "";
currentState = PHONE_NUMBER_INPUT;
lcd.clear();
lcd.print("Enter phone number");
lcd.setCursor(0, 1);
lcd.print("using keypad:");
}
}
}
else if (key == '3') {
lcd.clear();
lcd.print("Dispensing Paracetamol");
if (moveStepper(stepper1, 2048)) { // Adjust steps as needed
delay(1000);
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Dispensing Ondansetron");
if (moveStepper(stepper3, 2048)) { // Adjust steps as needed
delay(2000);
phoneNumber = "";
currentState = PHONE_NUMBER_INPUT;
lcd.clear();
lcd.print("Enter phone number");
lcd.setCursor(0, 1);
lcd.print("using keypad:");
}
}
}
else if (key == '4') {
lcd.clear();
lcd.print("Dispensing Paracetamol");
if (moveStepper(stepper1, 2048)) { // Adjust steps as needed
delay(1000);
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Dispensing Citirizene");
if (moveStepper(stepper2, 2048)) { // Adjust steps as needed
delay(1000);
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Dispensing Ondansetron");
if (moveStepper(stepper3, 2048)) { // Adjust steps as needed
delay(2000);
phoneNumber = "";
currentState = PHONE_NUMBER_INPUT;
lcd.clear();
lcd.print("Enter phone number");
lcd.setCursor(0, 1);
lcd.print("using keypad:");
}
}
}
}
break;
}
}
}
bool moveStepper(Stepper stepper, int steps)
{
stepper.step(steps);
totalRotations += abs(steps) / stepsPerRevolution; // Increment total rotations
if (totalRotations >= maxSlots) {
totalRotations = 0; // Reset total rotations if maximum slots reached
}
delay(2000);
return true;
}