#include <Servo.h>
#include <Adafruit_NeoPixel.h>
// Pin määrittelyt
#define BUTTON_1_PIN 2
#define BUTTON_2_PIN 4
#define BUTTON_3_PIN 7 // Vasen 1 painike
#define RESET_BUTTON_PIN 8
#define EYE_RED_PIN 3
#define EYE_GREEN_PIN 5
#define EYE_BLUE_PIN 6
#define NEOPIXEL_PIN 11
#define SERVO_POWER_PIN 12 // Servon virtapiirin ohjauspinni
// Servo-oliot
Servo servo1;
Servo servo3;
// Neopixel-olion luonti
#define NUM_PIXELS 1
Adafruit_NeoPixel pixels(NUM_PIXELS, NEOPIXEL_PIN, NEO_GRB + NEO_KHZ800);
// Painikkeiden tilamuuttujat
bool button1State = false;
bool button2State = false;
bool button3State = false; // Vasen 1 painike
bool resetButtonState = false;
// Servo-asentojen vakiot
#define CLOSED_POSITION 90
#define OPEN_POSITION 180
// Neopixel-värimuuttujat
#define PIXEL_COLOR_SPEED 10
#define FRIEND_ZONE_DURATION 180000 // 3 minuuttia
unsigned long friendZoneTimer = 0;
// Muuttuja servojen tilan seuraamiseen
bool servosOpen = false;
void setup() {
// Servojen alustus
servo1.attach(9);
servo3.attach(10);
// Neopixelin alustus
pixels.begin();
pixels.setBrightness(255); // Säädä kirkkautta tarvittaessa
// Painikkeiden määrittelyt
pinMode(BUTTON_1_PIN, INPUT_PULLUP);
pinMode(BUTTON_2_PIN, INPUT_PULLUP);
pinMode(BUTTON_3_PIN, INPUT_PULLUP); // Vasen 1 painike
pinMode(RESET_BUTTON_PIN, INPUT_PULLUP);
pinMode(SERVO_POWER_PIN, OUTPUT);
// Servon virtapiirin alustus
digitalWrite(SERVO_POWER_PIN, HIGH); // Servo päällä oletuksena
// Silmien ja siipien oletusasennot
servo1.write(CLOSED_POSITION);
servo3.write(CLOSED_POSITION);
analogWrite(EYE_RED_PIN, 255);
analogWrite(EYE_GREEN_PIN, 255);
analogWrite(EYE_BLUE_PIN, 0); // Alkuarvo: Keltainen
// Neopixelin alustus alkutilaan
pixels.setPixelColor(0, pixels.Color(255, 255, 0)); // Alkuarvo: Keltainen
pixels.show();
}
void loop() {
// Luetaan painikkeiden tilat
button1State = digitalRead(BUTTON_1_PIN);
button2State = digitalRead(BUTTON_2_PIN);
button3State = digitalRead(BUTTON_3_PIN); // Vasen 1 painike
resetButtonState = digitalRead(RESET_BUTTON_PIN);
// Tarkistetaan reset-painikkeen tila
if (resetButtonState == LOW) {
// Irrotetaan servot
servo1.detach();
servo3.detach();
// Sammutetaan servojen virtapiiri
digitalWrite(SERVO_POWER_PIN, LOW);
// Lopetetaan looppi
return;
}
// Tila 1: Ruuhkainen
if (button1State == LOW) {
servo1.write(CLOSED_POSITION);
servo3.write(CLOSED_POSITION);
analogWrite(EYE_RED_PIN, 255); // Punainen
analogWrite(EYE_GREEN_PIN, 0);
analogWrite(EYE_BLUE_PIN, 0);
pixels.setPixelColor(0, pixels.Color(255, 0, 0)); // Punainen
pixels.show();
servosOpen = false;
}
// Tila 2: Tilaa on
else if (button2State == LOW) {
servo1.write(-OPEN_POSITION);
servo3.write(OPEN_POSITION);
analogWrite(EYE_RED_PIN, 0);
analogWrite(EYE_GREEN_PIN, 255); // Vihreä
analogWrite(EYE_BLUE_PIN, 0);
pixels.setPixelColor(0, pixels.Color(0, 255, 0)); // Vihreä
pixels.show();
servosOpen = true;
}
// Tila 3: Ystävä alueella
else if (button3State == LOW) { // Vasen 1 painike
// Keltainen väri RGB LEDiin
analogWrite(EYE_RED_PIN, 0);
analogWrite(EYE_GREEN_PIN, 0);
analogWrite(EYE_BLUE_PIN, 255); // Sininen
pixels.setPixelColor(0, pixels.Color(0, 0, 255)); // Sininen
pixels.show();
// Toista avaus- ja sulkemisliike 1000 kertaa
for (int i = 0; i < 1000; i++) {
if (servosOpen) {
servo1.write(CLOSED_POSITION);
servo3.write(CLOSED_POSITION);
pixels.setPixelColor(0, pixels.Color(255, 0, 0)); // Punainen
pixels.show()
servosOpen = false;
} else {
servo1.write(-OPEN_POSITION);
servo3.write(OPEN_POSITION);
pixels.setPixelColor(0, pixels.Color(0, 255, 0)); // Vihreä
pixels.show()
servosOpen = true;
}
delay(1000); // Lyhyt viive siipien välillä
}
}
}