Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| fablab:battlebot:arena [16.12.2024 10:05] – angelegt christian.prim | fablab:battlebot:arena [17.12.2024 09:56] (aktuell) – [Arduino-Programm] christian.prim | ||
|---|---|---|---|
| Zeile 4: | Zeile 4: | ||
| {{ : | {{ : | ||
| + | |||
| + | ===== Arduino-Programm ===== | ||
| + | |||
| + | Folgender Code für den '' | ||
| + | |||
| + | <file c arena.ino> | ||
| + | // Antweight-Arena | ||
| + | // Kantonsschule Zürich Nord | ||
| + | |||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | #define NEOPIXEL_PIN | ||
| + | #define LIFT_PIN1 9 | ||
| + | #define LIFT_PIN2 10 | ||
| + | #define BUMPER_PIN 7 | ||
| + | #define START_PIN 3 | ||
| + | #define BUMPER_LED_PIN 4 | ||
| + | |||
| + | #define PIT_PIXEL_START 0 | ||
| + | #define PIT_PIXEL_END 4 | ||
| + | #define CLOCK_PIXEL_START 4 | ||
| + | #define CLOCK_PIXEL_END 34 | ||
| + | #define ARENA_PIXEL_START 34 | ||
| + | #define ARENA_PIXEL_END 91 // Popular NeoPixel ring size | ||
| + | |||
| + | Adafruit_NeoPixel pixels(ARENA_PIXEL_END, | ||
| + | Buzzer buzzer(11); | ||
| + | |||
| + | bool not_started = true; | ||
| + | bool pit_not_released = true; | ||
| + | bool release_time = false; | ||
| + | bool pit_dark = false; | ||
| + | int clock = 1; | ||
| + | |||
| + | void nothing() {} | ||
| + | |||
| + | auto timer = timer_create_default(); | ||
| + | auto pit_blink_task = timer.in(240*1000, | ||
| + | auto pit_task = timer.in(240*1000, | ||
| + | |||
| + | void setup() { | ||
| + | pinMode(LIFT_PIN1, | ||
| + | pinMode(LIFT_PIN2, | ||
| + | pinMode(BUMPER_LED_PIN, | ||
| + | pinMode(BUMPER_PIN, | ||
| + | pinMode(START_PIN, | ||
| + | pixels.begin(); | ||
| + | pixels.clear(); | ||
| + | pixels.show(); | ||
| + | digitalWrite(BUMPER_LED_PIN, | ||
| + | reset_platform(); | ||
| + | arenaWhite(); | ||
| + | clockstart(); | ||
| + | } | ||
| + | |||
| + | bool led_clock(void *) { | ||
| + | if (clock==30) { | ||
| + | for (int i=CLOCK_PIXEL_START; | ||
| + | // pixels.Color() takes RGB values, from 0,0,0 up to 255,255,255 | ||
| + | // Here we're using a moderately bright green color: | ||
| + | pixels.setPixelColor(i, | ||
| + | } | ||
| + | } else if (clock==60) { | ||
| + | for (int i=CLOCK_PIXEL_START; | ||
| + | // pixels.Color() takes RGB values, from 0,0,0 up to 255,255,255 | ||
| + | // Here we're using a moderately bright green color: | ||
| + | pixels.setPixelColor(i, | ||
| + | } | ||
| + | } else { | ||
| + | pixels.setPixelColor(CLOCK_PIXEL_END-(clock % 30), pixels.Color(0, | ||
| + | } | ||
| + | pixels.show(); | ||
| + | clock++; | ||
| + | return true; | ||
| + | } | ||
| + | |||
| + | |||
| + | bool toggle_pit(void *) { | ||
| + | if (pit_dark) { | ||
| + | for(int i=PIT_PIXEL_START; | ||
| + | // pixels.Color() takes RGB values, from 0,0,0 up to 255,255,255 | ||
| + | // Here we're using a moderately bright green color: | ||
| + | pixels.setPixelColor(i, | ||
| + | } | ||
| + | pixels.show(); | ||
| + | pit_dark = false; | ||
| + | } | ||
| + | else { | ||
| + | for(int i=PIT_PIXEL_START; | ||
| + | // pixels.Color() takes RGB values, from 0,0,0 up to 255,255,255 | ||
| + | // Here we're using a moderately bright green color: | ||
| + | pixels.setPixelColor(i, | ||
| + | } | ||
| + | pixels.show(); | ||
| + | pit_dark = true; | ||
| + | } | ||
| + | return true; | ||
| + | } | ||
| + | |||
| + | void pit_red(void *) { | ||
| + | timer.cancel(pit_task); | ||
| + | for(int i=PIT_PIXEL_START; | ||
| + | // pixels.Color() takes RGB values, from 0,0,0 up to 255,255,255 | ||
| + | // Here we're using a moderately bright green color: | ||
| + | pixels.setPixelColor(i, | ||
| + | } | ||
| + | pixels.show(); | ||
| + | } | ||
| + | |||
| + | void arenaWhite() { | ||
| + | for(int i=ARENA_PIXEL_START; | ||
| + | |||
| + | // pixels.Color() takes RGB values, from 0,0,0 up to 255,255,255 | ||
| + | // Here we're using a moderately bright green color: | ||
| + | pixels.setPixelColor(i, | ||
| + | } | ||
| + | pixels.show(); | ||
| + | } | ||
| + | |||
| + | void clockstart() { | ||
| + | pixels.setPixelColor(CLOCK_PIXEL_END-1, | ||
| + | pixels.show(); | ||
| + | } | ||
| + | |||
| + | void clockend() { | ||
| + | pixels.setPixelColor(CLOCK_PIXEL_END-1, | ||
| + | pixels.show(); | ||
| + | } | ||
| + | |||
| + | void reset_platform() { | ||
| + | digitalWrite(LIFT_PIN1, | ||
| + | digitalWrite(LIFT_PIN2, | ||
| + | } | ||
| + | |||
| + | void start() { | ||
| + | buzzer.begin(100); | ||
| + | // Rot | ||
| + | for(int j=0; j<250; j++) { | ||
| + | for(int i=CLOCK_PIXEL_START; | ||
| + | pixels.setPixelColor(i, | ||
| + | }; | ||
| + | pixels.show(); | ||
| + | delay(1); | ||
| + | }; | ||
| + | buzzer.sound(NOTE_D7, | ||
| + | for(int j=249; j>=0; j--) { | ||
| + | for(int i=CLOCK_PIXEL_START; | ||
| + | pixels.setPixelColor(i, | ||
| + | }; | ||
| + | pixels.show(); | ||
| + | delay(1); | ||
| + | }; | ||
| + | // Gelb | ||
| + | for(int j=0; j<250; j++) { | ||
| + | for(int i=CLOCK_PIXEL_START; | ||
| + | pixels.setPixelColor(i, | ||
| + | }; | ||
| + | pixels.show(); | ||
| + | delay(1); | ||
| + | }; | ||
| + | buzzer.sound(NOTE_D7, | ||
| + | for(int j=249; j>=0; j--) { | ||
| + | for(int i=CLOCK_PIXEL_START; | ||
| + | pixels.setPixelColor(i, | ||
| + | }; | ||
| + | pixels.show(); | ||
| + | delay(1); | ||
| + | }; | ||
| + | // Grün | ||
| + | for(int j=0; j<250; j++) { | ||
| + | for(int i=CLOCK_PIXEL_START; | ||
| + | pixels.setPixelColor(i, | ||
| + | }; | ||
| + | pixels.show(); | ||
| + | delay(1); | ||
| + | }; | ||
| + | buzzer.sound(NOTE_G7, | ||
| + | arenaWhite(); | ||
| + | timer.in(180000, | ||
| + | timer.in(60000, | ||
| + | timer.every(2000, | ||
| + | } | ||
| + | |||
| + | void start_pit(void *) { //activate pit button and signal it with flashing LED | ||
| + | release_time = true; | ||
| + | timer.cancel(pit_blink_task); | ||
| + | pit_blink_task = timer.every(900, | ||
| + | } | ||
| + | |||
| + | bool toggle_led(void *) { | ||
| + | digitalWrite(BUMPER_LED_PIN, | ||
| + | return true; | ||
| + | } | ||
| + | |||
| + | void end_game(void *) { | ||
| + | pixels.clear(); | ||
| + | timer.cancel(); | ||
| + | for(int j=0; j<2; j++) { //some LED-show | ||
| + | for(int i=CLOCK_PIXEL_START; | ||
| + | pixels.setPixelColor(i, | ||
| + | } | ||
| + | pixels.show(); | ||
| + | buzzer.sound(NOTE_E7, | ||
| + | delay(200); | ||
| + | for(int i=CLOCK_PIXEL_START; | ||
| + | pixels.setPixelColor(i, | ||
| + | } | ||
| + | pixels.show(); | ||
| + | buzzer.sound(NOTE_E7, | ||
| + | delay(200); | ||
| + | }; | ||
| + | arenaWhite(); | ||
| + | clockend(); | ||
| + | while (true) { //do nothing more until reset | ||
| + | delay(1000); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | void release_pit(void *) { //drops the pi with some LED-show down | ||
| + | pit_task = timer.every(900, | ||
| + | timer.in(6000, | ||
| + | digitalWrite(BUMPER_LED_PIN, | ||
| + | digitalWrite(LIFT_PIN1, | ||
| + | digitalWrite(LIFT_PIN2, | ||
| + | } | ||
| + | |||
| + | void loop() { | ||
| + | timer.tick(); | ||
| + | delay(5); | ||
| + | if (digitalRead(START_PIN)==LOW && not_started) { | ||
| + | not_started = false; | ||
| + | start(); | ||
| + | } | ||
| + | if (digitalRead(BUMPER_PIN)==LOW && release_time && pit_not_released) { | ||
| + | pit_not_released = false; | ||
| + | timer.cancel(pit_blink_task); | ||
| + | digitalWrite(BUMPER_LED_PIN, | ||
| + | timer.in(5000, | ||
| + | }; | ||
| + | } | ||
| + | </ | ||
| + | |||
