/*
CAMP-ARDUINO
4 POTs demo
0.01 - Basic setup
0.02 - Stepper test
0.03 - Adding FadePot !MAP
0.04 - Bink millis
0.05 - ddt
0.06 - ServoPot SOMETHING WRONG WITH THE LIBRARI
0.07 - Mode Btn, switch (Modes)++ LCD
*/
float ver = 0.07;
#include <Servo.h>
#include <Stepper.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#define StepperPot A0
#define ServoPot A1
#define ddtPot A2
#define FadePot A3
#define CASP 10 //CampArduinoServoPin
#define fadeLed 9
#define STEP_PIN 8
#define DIR_PIN 7
#define BlinkA 4
#define BlinkB 12
#define Rled 6
#define Gled 5
#define Bled 3
#define btn 2
#define NOS 3600 //Number Of Steps
Servo CAservo; // create servo object to control a servo
LiquidCrystal_I2C lcd(0x27, 16, 2);
int servoRead;
int srvAngle = 90;
int stepperRead;
int fadeRead;
int fadeVal;
int ddtRead;
int ddt=1000; //Dynamic delay time
int stepDT ;
byte edt = 6;
bool pulse = 0; //The beat for blink and !blink
volatile int mods=0;
volatile int modsD=0;
//Millis
unsigned long curT;
unsigned long prvT = 0; // will store the last time the LED was updated
unsigned long DBcurT;
unsigned long DBprvT = 0;
void setup(){
Serial.begin(115200);
Serial.print("CAMP-ARDUINO 4 POTs demo version ");
Serial.println(ver);
lcd.init();
//CAservo.attach(CASP);
lcd.clear();
lcd.backlight();
lcd.setCursor(2, 0);
lcd.print("CAMP-ARDUINO");
lcd.setCursor(0, 1);
lcd.print("POT VER: ");
lcd.setCursor(10, 1);
lcd.print(ver);
pinMode( ServoPot, INPUT);
pinMode( StepperPot, INPUT);
pinMode( ddtPot, INPUT);
pinMode( FadePot, INPUT);
pinMode( btn, INPUT_PULLUP);
pinMode( STEP_PIN, OUTPUT );
pinMode( DIR_PIN, OUTPUT );
pinMode( fadeLed, OUTPUT );
pinMode( BlinkA, OUTPUT );
pinMode( BlinkB, OUTPUT );
pinMode( Rled, OUTPUT );
pinMode( Gled, OUTPUT );
pinMode( Bled, OUTPUT );
digitalWrite(fadeLed, HIGH);
digitalWrite(BlinkA, HIGH);
digitalWrite(BlinkB, HIGH);
digitalWrite(Rled, HIGH);
digitalWrite(Gled, HIGH);
digitalWrite(Bled, HIGH);
delay(300);
digitalWrite(fadeLed, LOW);
digitalWrite(BlinkA, LOW);
digitalWrite(Rled, LOW);
digitalWrite(Gled, LOW);
digitalWrite(Bled, LOW);
delay(1000);
attachInterrupt(digitalPinToInterrupt(btn), FXctrl, FALLING);
lcd.clear();
lcd.noBacklight();
}
void loop(){
switch(mods){
case 0:
ladeFade();
break;
case 1:
tBLINKS();
break;
case 2:
RGBlinks();
break;
case 3:
servoPot();
break;
case 4:
stepper();
break;
}
}
void FXctrl(){
mods++;
if(mods > 4)mods=0;
Serial.println(mods);
}
void stepper(){
//CAservo.detach(CASP);
stepperRead = analogRead(StepperPot);
if(stepperRead > 550){
stepDT = map(stepperRead, 512, 1023, 2000, 20);
digitalWrite(DIR_PIN, HIGH);
digitalWrite( STEP_PIN, HIGH );
delayMicroseconds( stepDT );
digitalWrite( STEP_PIN, LOW );
delayMicroseconds( stepDT );
}
if(stepperRead <= 450){
stepDT = map(stepperRead, 0, 485, 20, 2000);
digitalWrite(DIR_PIN, LOW);
digitalWrite( STEP_PIN, HIGH );
delayMicroseconds( stepDT );
digitalWrite( STEP_PIN, LOW );
delayMicroseconds( stepDT );
}
if(stepperRead > 450 && stepperRead <=550){
digitalWrite( STEP_PIN, LOW );
}
}
void tBLINKS(){
stepperRead = 512;
//CAservo.detach(CASP);
curT = millis(); // get the current time
ddtRead = analogRead(ddtPot);
ddt=map(ddtRead,0, 1023, 2000, 100);
if (curT - prvT >= ddt) {
// save the last time you blinked the LED
prvT = curT;
pulse =! pulse;
bool pulseB =! pulse;
digitalWrite(BlinkA, pulse);
digitalWrite(BlinkB, !pulse);
}
}
void RGBlinks(){
stepperRead = 512;
//CAservo.detach(CASP);
curT = millis(); // get the current time
ddtRead = analogRead(ddtPot);
ddt=map(ddtRead,0, 1023, 2000, 100);
digitalWrite(Rled, LOW);
digitalWrite(Gled, LOW);
digitalWrite(Bled, LOW);
digitalWrite(Rled, HIGH);
delay(ddt);
digitalWrite(Rled, LOW);
delay(ddt);
digitalWrite(Gled, HIGH);
delay(ddt);
digitalWrite(Gled, LOW);
delay(ddt);
digitalWrite(Bled, HIGH);
delay(ddt);
digitalWrite(Bled, LOW);
delay(ddt);
}
void wiper(){
stepperRead = 512;
//CAservo.attach(CASP);
for(int i=0; i<181; i++){
CAservo.write(i);
delay(edt);
}
for(int i=180; i>=0; i--){
CAservo.write(i);
delay(edt);
}
}
void servoPot(){
stepperRead = 512;
//CAservo.attach(CASP);
servoRead=analogRead(servoPot);
srvAngle = map(servoRead, 0, 1023, 0, 180);
CAservo.write(srvAngle);
}
void ladeFade(){
stepperRead = 512;
//CAservo.detach(CASP);
fadeRead=analogRead(FadePot);
fadeVal=(255./1023.)*fadeRead;
analogWrite(fadeLed, fadeVal);
}
void tempDsp(){
String mName;
switch(mods){
case 0:
mName = "FADELADE";
break;
case 1:
mName = "3BLINKS";
break;
case 2:
mName = "RGBlinks";
break;
case 3:
mName = "MstrNsrvR";
break;
case 4:
mName = "MstrNstpR";
break;
}
lcd.clear();
lcd.backlight();
lcd.setCursor(2, 0);
lcd.print("CAMP-ARDUINO");
lcd.setCursor(0, 1);
lcd.print("MODE: ");
lcd.setCursor(7, 1);
lcd.print(mName);
delay(3000);
lcd.clear();
lcd.noBacklight();
}