#include "Windkraftwerk.h" #define SERVO_PIN 5 #define LED_YELLOW 7 #define LED_RED_1 6 #define LED_RED_2 8 #define SPEED_LEVEL_FAST 1 #define SPEED_LEVEL_SLOW 0 // ===== KONFIGURATION FÜR VARIABLEN ===== // // LCD-Display LiquidCrystal_I2C lcd(0x27, 16, 2); // IR-Receiver uint16_t command = 0x404; // Servo Motor Servo servo_motor; // Schrittmotor const int steps_per_revolution = 1; // Schritte pro Umdrehung volatile bool motor_running = false; unsigned long speed_intervals_ms[] = {100, 20}; volatile int motor_speed_level; // Index für das speed_intervals_ms array Stepper stepper(2048, 4, 1, 2, 0); // LED volatile bool led_yellow_enabled = false; // LED per default aus volatile bool led_red_enabled = false; const int led_interval_ms = 800; bool led_state = false; // false == off true == on // millis() unsigned long previous_millis_stepper = 0; unsigned long previous_millis_led = 0; //IR IRrecv irrecv(IR_PIN); decode_results results; void handle_ir_command() { if (IrReceiver.decode()) { IrReceiver.resume(); if (IrReceiver.decodedIRData.address != IR_ADDRESS) return; command = IrReceiver.decodedIRData.command; Serial.println(IrReceiver.decodedIRData.command); } switch(command) { case COMMAND_SPEED_OFF: motor_running = false; lcd.clear(); lcd.setCursor(0, 1); lcd.print("MOTOR OFF"); break; case COMMAND_SPEED_SLOW: motor_running = true; motor_speed_level = SPEED_LEVEL_SLOW; lcd.clear(); lcd.setCursor(0, 1); lcd.print("MOTOR SLOW"); break; case COMMAND_SPEED_FAST: motor_running = true; motor_speed_level = SPEED_LEVEL_FAST; lcd.clear(); lcd.setCursor(0, 1); lcd.print("MOTOR FAST"); break; case COMMAND_DIRECTION_LEFT: servo_motor.write(0); lcd.clear(); lcd.setCursor(0, 1); lcd.print("DIRECTION LEFT"); break; case COMMAND_DIRECTION_CENTER: servo_motor.write(90); lcd.clear(); lcd.setCursor(0, 1); lcd.print("DIRECTION CENTER"); break; case COMMAND_DIRECTION_RIGHT: servo_motor.write(180); lcd.clear(); lcd.setCursor(0, 1); lcd.print("DIRECTION RIGHT"); break; case COMMAND_LM_OFF: led_yellow_enabled = false; led_red_enabled = false; lcd.clear(); lcd.setCursor(0, 1); lcd.print("LIGHT OFF"); break; case COMMAND_LM_NORMAL: led_yellow_enabled = true; led_red_enabled = false; lcd.clear(); lcd.setCursor(0, 1); lcd.print("LIGHT NORMAL"); break; case COMMAND_LM_EMERGENCY: led_yellow_enabled = true; led_red_enabled = true; lcd.clear(); lcd.setCursor(0, 1); lcd.print("LIGHT EMERGENCY"); break; default: return; break; } } void handle_stepper(unsigned long current_millis) { if (motor_running == false) { return; } unsigned long motor_interval_ms = speed_intervals_ms[motor_speed_level]; if (current_millis - previous_millis_stepper >= motor_interval_ms ) { previous_millis_stepper = current_millis; stepper.step(1); } } void handle_led(unsigned long current_millis) { if (led_yellow_enabled == false) { return; } if (current_millis - previous_millis_led >= led_interval_ms) { previous_millis_led = current_millis; if(led_state == true) { digitalWrite(LED_YELLOW, LOW); digitalWrite(LED_RED_1, LOW); digitalWrite(LED_RED_2, LOW); led_state = false; } else { led_state = true; digitalWrite(LED_YELLOW, HIGH); if (led_red_enabled == true) { digitalWrite(LED_RED_1, HIGH); digitalWrite(LED_RED_2, HIGH); } } } } void setup() { Serial.begin(9600); servo_motor.attach(SERVO_PIN); servo_motor.write(90); //LED pinMode(LED_YELLOW, OUTPUT); pinMode(LED_RED_1, OUTPUT); pinMode(LED_RED_2, OUTPUT); digitalWrite(LED_YELLOW, LOW); digitalWrite(LED_RED_1, LOW); digitalWrite(LED_RED_2, LOW); //IR IrReceiver.begin(IR_PIN); //LCD lcd.init(); lcd.backlight(); lcd.setCursor(0, 0); stepper.setSpeed(20); lcd.print("ANLAGE STARTET"); } void loop(){ unsigned long current_millis = millis(); handle_stepper(current_millis); handle_led(current_millis); handle_ir_command(); }