#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C address 0x27, 16 column and 2 rows
#define Detectpin 4
// IR Sensor Variables
int sensorState = 0, lastState = 0;
//Designate each coil output, pushbutton input pins
#define coil_B1Pin 23
#define coil_B2Pin 22
#define coil_A1Pin 25
#define coil_A2Pin 24
//Set delay timer to acheive 5RPM
int timeDelay = 12;
int noCycles = 65; //90 degrees = 64 cycles (+1 fine tune)
const int PotPin = 0;
int PotReading = 0;
float speed = 0;
float lastSpeed=1;
const int ledpin1 = 5;
const int ledpin2 = 6;
const int EnablePin = 10;
const int CWpin = 7; // Output pin on Arduino that connects to pin 7 on L293D for directional rotation control
const int CCWpin = 9;// Output pin on Arduino that connects to pin 2 on L293D for opposite directional rotational control
void setup() {
Serial.begin(9600);
pinMode(PotPin, INPUT); //Set potentiometer as input
pinMode(ledpin2, OUTPUT); //Red light signialing conveyor is off
pinMode(ledpin1, OUTPUT); //Green light signialing conveyor is on
pinMode(EnablePin, OUTPUT);
pinMode(CWpin, OUTPUT);
pinMode(CCWpin, OUTPUT);
digitalWrite(CWpin, HIGH); // CW Pin is always on
pinMode(Detectpin, INPUT);
digitalWrite(Detectpin, HIGH);
//Designate coils as outputs, pushbutton as input
pinMode(coil_B1Pin, OUTPUT);
pinMode(coil_B2Pin, OUTPUT);
pinMode(coil_A1Pin, OUTPUT);
pinMode(coil_A2Pin, OUTPUT);
lcd.init(); // initialize the lcd
lcd.backlight();
lcd.print("SETUP COMPLETE");
delay(1500);
lcd.clear();
}
void loop() {
sensorState = irSensorRead();
lastState = sensorState;
motorRun(sensorState);
switch (sensorState){
case 0:
dispensorRun();
}
}
int irSensorRead() {
// read the state of the pushbutton value:
sensorState = digitalRead(Detectpin);
if (sensorState && !lastState) {
Serial.println(sensorState);
}
if (!sensorState && lastState) {
Serial.println(sensorState);
}
return sensorState;
}
void motorRun(int sensorState) {
PotReading = analogRead(PotPin);
speed = map(PotReading, 0, 1023, 0, 255);
// Serial.println(speed);
digitalRead(Detectpin);
if (speed > 0 )
{
digitalWrite(ledpin1, HIGH);
digitalWrite(ledpin2, LOW);
analogWrite(EnablePin, speed);
if(lastSpeed != speed){
float percent = speed/255*100;
lcd.clear();
lcd.print("Speed: ");
lcd.setCursor(7,0);
lcd.print(percent);
lcd.setCursor(12,0);
lcd.print("%");
lastSpeed = speed;
}
if (sensorState == LOW )
{
digitalWrite(ledpin2, HIGH); // Red light turns on
digitalWrite(ledpin1, LOW); // Green light off
digitalWrite(EnablePin, LOW); // Motor off
}
}
else {
digitalWrite(ledpin2, HIGH);
digitalWrite(ledpin1, LOW);
digitalWrite(EnablePin, LOW);
if(lastSpeed != speed){
lcd.clear();
lcd.print("Conveyor Off");
lastSpeed = speed;
}
}
}
// Run Stepper motor to dispense
void dispensorRun(){
delay(500);
lcd.clear();
lcd.print("Please Wait");
lcd.setCursor(0,1);
lcd.print("Dispensing Now...");
//2048 steps in 360 degrees
for(int n = 0; n < noCycles; n++) {
step4();
delay(timeDelay);
step3();
delay(timeDelay);
step2();
delay(timeDelay);
step1();
delay(timeDelay);
}
delay(1000);
lastSpeed = 300;
motorRun(1);
delay(2000);
}
// Execute Step 1 coil sequence
void step1(){
digitalWrite(coil_A1Pin,0);
digitalWrite(coil_A2Pin,1);
digitalWrite(coil_B1Pin,1);
digitalWrite(coil_B2Pin,0);
}
// Execute Step 2 coil sequence
void step2(){
digitalWrite(coil_A1Pin,0);
digitalWrite(coil_A2Pin,1);
digitalWrite(coil_B1Pin,0);
digitalWrite(coil_B2Pin,1);
}
// Execute Step 3 coil sequence
void step3(){
digitalWrite(coil_A1Pin,1);
digitalWrite(coil_A2Pin,0);
digitalWrite(coil_B1Pin,0);
digitalWrite(coil_B2Pin,1);
}
// Execute Step 4 coil sequence
void step4(){
digitalWrite(coil_A1Pin,1);
digitalWrite(coil_A2Pin,0);
digitalWrite(coil_B1Pin,1);
digitalWrite(coil_B2Pin,0);
}