#include <Adafruit_NeoPixel.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED width, in pixels
#define SCREEN_HEIGHT 64 // OLED height, in pixels
#define SWPIN 4
// create an OLED display object connected to I2C
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
//#define AIN 34
#define NPpin 5
#define NUMPIXELS 24
Adafruit_NeoPixel NPring = Adafruit_NeoPixel(NUMPIXELS, NPpin, NEO_GRB + NEO_KHZ800);
// const int MID_AVAL = 2047;
// const int MAX_AVAL = 4095;
int avalue = 0; // analog value
float speed = 0; // rotation speed 0 - 100%
bool direction = 0; // direction 0 = CW, 1 = CCW
//bool rotate = 0; // 0 = still, 1 = rotate
bool finish = 0; // finish flag
bool start = 0; // start flag
bool printed = 0; // print flag
int pixel_idx = 0; // pixel index
void setup() {
// put your setup code here, to run once:
pinMode(SWPIN, INPUT_PULLUP);
Serial.begin(115200);
NPring.begin();
NPring.show(); // initialize all pixels to 'off'
// initialize OLED display with I2C address 0x3C
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("failed to start SSD1306 OLED"));
while (1);
}
delay(2000); // wait two seconds for initializing
oled.clearDisplay(); // clear display
oled.setTextSize(1); // set text size
oled.setTextColor(WHITE); // set text color
// oled.setCursor(0, 2); // set position to display (x,y)
// oled.println("Robotronix"); // set text
// oled.display(); // display on OLED
}
void loop() {
if (!finish) clear_pixel(pixel_idx); // clear previous pixel
//avalue = analogRead(AIN); // 0 - 4095
// Serial.println(avalue);
if (digitalRead(SWPIN)) {
if (speed != 0) {
speed -= random(3,5);
if (speed<2.0) {
speed = 0;
finish = 1;
direction = !direction; // switch direction for next time
}
}
}
else {
clear_pixel(pixel_idx);
speed = 100;
finish = 0;
printed = 0;
}
if (!finish) {
if (direction) {
pixel_idx--;
if (pixel_idx<0) pixel_idx = 23;
} else {
pixel_idx++;
if (pixel_idx>24) pixel_idx = 0;
}
}
else {
if (!printed) {
Serial.print("Lucky number = ");
Serial.println(pixel_idx);
printed = 1;
}
}
// if (rotate) {
// if (avalue > MID_AVAL) {
// direction = 0;
// speed = (float)(avalue-MID_AVAL)/20;
// pixel_idx++;
// if (pixel_idx>24) pixel_idx = 0;
// } else {
// direction = 1;
// speed = (float)(MID_AVAL - avalue)/20;
// pixel_idx--;
// if (pixel_idx<0) pixel_idx = 23;
// }
set_color_pixel(pixel_idx); // display pixel
// if (abs(MID_AVAL-avalue)<20) {
// rotate = 0; // stop rotation around zero speed cmd
// } else {
// rotate = 1;
// }
// Serial.println(rotate);
// Serial.print("Speed = ");
// Serial.println(speed);
// Serial.print("Direction = ");
// Serial.println(direction);
oled_display();
delay((int)(1000 - 9.9*speed));
}
void clear_pixel(int i) {
NPring.setPixelColor(i,0,0,0);
NPring.show();
}
void set_color_pixel(int i) {
int rval = (int)(speed+100);
int gval = (int)direction*2*(120 - speed);
int bval = (int)(1-direction)*2*(120 - speed);
NPring.setPixelColor(i, rval,gval,bval);
NPring.show();
}
void oled_display() {
oled.clearDisplay();
oled.setCursor(0,0);
oled.print("Speed : ");
oled.println(speed);
oled.setCursor(0,20);
oled.print("Dir : ");
if (direction) oled.println("CCW");
else oled.println("CW");
if (finish) {
oled.setCursor(0,40);
oled.print("Lucky number = ");
oled.println(pixel_idx);
}
oled.display();
}