#include <Servo.h>
// Define pin connections & motor's steps per revolution
const int dirPin_X = 2;
const int stepPin_X = 3;
const int dirPin_Z = 4;
const int stepPin_Z = 5;
const int sprayer_led = 13;
Servo spray_control;
const int stepDelay = 250;
const int steps_X_1mm = 25; // find and fill
const int steps_Z_1mm = 94;
const int spray_X_mm = 110;
const int limit_X = 330;
const int limit_Z = 180;
int steps_taken_X = 0;
int steps_taken_Z = 0;
const int number_of_coatings = 3;
void setup(){
// Declare pins as Outputs
pinMode(dirPin_X, OUTPUT);
pinMode(stepPin_X, OUTPUT);
pinMode(dirPin_Z, OUTPUT);
pinMode(stepPin_Z, OUTPUT);
// LED as Sprayer
pinMode(sprayer_led, OUTPUT);
// Servo Sprayer
spray_control.attach(11);
}
void sprayer_on_off(boolean spray){
if (spray == true){
digitalWrite(sprayer_led, HIGH);
spray_control.write(90);
}
else{
digitalWrite(sprayer_led, LOW);
spray_control.write(0);
}
}
void set_direction_X(boolean direction){
if (direction==true){
digitalWrite(dirPin_X, HIGH);
}
else{
digitalWrite(dirPin_X, LOW);
}
}
void move_horizontal(int distance,boolean spray,boolean direction){
sprayer_on_off(spray);
set_direction_X(direction);
for(int x = 0; x < steps_X_1mm * distance; x++){
digitalWrite(stepPin_X, HIGH);
delayMicroseconds(stepDelay);
digitalWrite(stepPin_X, LOW);
delayMicroseconds(stepDelay);
}
// Sprayer off
sprayer_on_off(false);
// Caluculate steps taken in vertical direction
if (direction==true){
steps_taken_X = steps_taken_X + steps_X_1mm * distance;
}
else{
steps_taken_X = steps_taken_X - steps_X_1mm * distance;
}
}
void set_direction_Z(boolean direction){
if (direction==true){
digitalWrite(dirPin_Z, HIGH);
}
else{
digitalWrite(dirPin_Z, LOW);
}
}
void move_vertical(int distance,boolean spray,boolean direction){
sprayer_on_off(spray);
set_direction_Z(direction);
for(int z = 0; z < steps_Z_1mm * distance; z++){
digitalWrite(stepPin_Z, HIGH);
delayMicroseconds(stepDelay);
digitalWrite(stepPin_Z, LOW);
delayMicroseconds(stepDelay);
}
// Sprayer off
sprayer_on_off(false);
// Caluculate steps taken in vertical direction
if (direction==true){
steps_taken_Z = steps_taken_Z + steps_Z_1mm * distance;
}
else{
steps_taken_Z = steps_taken_Z - steps_Z_1mm * distance;
}
}
void return_home(){
digitalWrite(dirPin_X, LOW);
for(int x = 0; x < steps_taken_X; x++){
digitalWrite(stepPin_X, HIGH);
delayMicroseconds(stepDelay);
digitalWrite(stepPin_X, LOW);
delayMicroseconds(stepDelay);
}
delay(1000);
digitalWrite(dirPin_Z, LOW);
for(int z = 0; z < steps_taken_Z; z++){
digitalWrite(stepPin_Z, HIGH);
delayMicroseconds(stepDelay);
digitalWrite(stepPin_Z, LOW);
delayMicroseconds(stepDelay);
}
steps_taken_X = 0;
steps_taken_Z = 0;
}
void traverse_wall(){
for(int s = 0; s < limit_X / spray_X_mm; s++){
if (s%2==0){
move_vertical(limit_Z,true,true);
}
else{
move_vertical(limit_Z,true,false);
}
delay(1000);
if (s!=(limit_X / spray_X_mm) - 1){
move_horizontal(spray_X_mm,false,true);
}
delay(1000);
}
delay(5000);
return_home();
delay(5000);
}
void loop(){
for(int c = 0; c < number_of_coatings; c++){
traverse_wall();
}
exit(0);
}