ik heb onderstaande code. hij werkt alleen lukt het me niet de uren en minuten te verstellen
is een arduino uno met een ds3231 en 60 ws2812b leds
weet iemand wat er fout gaat in de code.C:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 #include <Adafruit_NeoPixel.h> #include <Wire.h> #include "RTClib.h" // Definieer het aantal LED's en de pin waarop de LED-strip is aangesloten #define LED_PIN 6 #define LED_COUNT 60 // Definieer de pinnen voor de schakelaars #define SET_MINUTES_PIN 5 // Schakelaar om minuten in te stellen #define INCREASE_PIN 3 // Schakelaar om uren/minuten te verhogen #define SET_HOURS_PIN 4 // Schakelaar om uren in te stellen // Initialiseer de LED-strip Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800); // Initialiseer de DS3231 RTC RTC_DS3231 rtc; // Variabelen voor handmatige tijdinstelling unsigned long manualTimeSetMillis = 0; // Tijdstip waarop de handmatige tijd is ingesteld int manualHours = -1; int manualMinutes = -1; int manualSeconds = -1; // Variabelen voor het instellen van uren en minuten bool settingHours = false; // Geeft aan of we uren instellen bool settingMinutes = false; // Geeft aan of we minuten instellen unsigned long lastBlinkMillis = 0; // Tijdstip van de laatste knipperactie bool blinkState = false; // Huidige knipperstatus (aan/uit) void setup() { // Start de seriële communicatie voor debugging Serial.begin(9600); // Initialiseer de LED-strip strip.begin(); strip.show(); // Zet alle LED's uit strip.setBrightness(5); // Stel de helderheid in (0-255) // Initialiseer de RTC if (!rtc.begin()) { Serial.println("Kon RTC niet vinden!"); while (1); } // Als de RTC geen tijd heeft, stel dan de tijd handmatig in if (rtc.lostPower()) { Serial.println("RTC heeft geen stroom gehad, stel de tijd in!"); rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); } // Stel de schakelaarpinnen in als invoer pinMode(SET_MINUTES_PIN, INPUT_PULLUP); pinMode(INCREASE_PIN, INPUT_PULLUP); pinMode(SET_HOURS_PIN, INPUT_PULLUP); // Instructies voor de seriële monitor Serial.println("Gebruik de schakelaars om uren/minuten in te stellen:"); Serial.println("- Pin 5: Minuten instellen (knipperen)"); Serial.println("- Pin 4: Uren instellen (knipperen)"); Serial.println("- Pin 3: Verhoog uren/minuten"); } void loop() { // Controleer of er invoer is op de seriële monitor if (Serial.available()) { String input = Serial.readStringUntil('\n'); if (input.length() == 8 && input.charAt(2) == ':' && input.charAt(5) == ':') { manualHours = input.substring(0, 2).toInt(); manualMinutes = input.substring(3, 5).toInt(); manualSeconds = input.substring(6, 8).toInt(); manualTimeSetMillis = millis(); // Sla het tijdstip van instellen op Serial.println("Tijd ingesteld op: " + input); } else { Serial.println("Ongeldige invoer. Gebruik het formaat HH:MM:SS."); } } // Controleer de schakelaars if (digitalRead(SET_MINUTES_PIN) == LOW) { settingMinutes = true; settingHours = false; } else if (digitalRead(SET_HOURS_PIN) == LOW) { settingHours = true; settingMinutes = false; } else { settingHours = false; settingMinutes = false; } // Verhoog uren of minuten als de verhoog-schakelaar is ingedrukt if (digitalRead(INCREASE_PIN) == LOW) { if (settingHours) { manualHours = (manualHours + 1) % 12; // Verhoog uren (modulo 12 voor 12-uursformaat) delay(200); // Debounce } else if (settingMinutes) { manualMinutes = (manualMinutes + 1) % 60; // Verhoog minuten (modulo 60) delay(200); // Debounce } // Wacht tot de knop is losgelaten om herhaaldelijk verhogen te voorkomen while (digitalRead(INCREASE_PIN) == LOW) { delay(10); } } // Bereken de huidige tijd (handmatig of van de RTC) int hours, minutes, seconds; if (manualHours != -1 && manualMinutes != -1 && manualSeconds != -1) { // Gebruik handmatige tijd en laat deze doortellen unsigned long elapsedSeconds = (millis() - manualTimeSetMillis) / 1000; seconds = manualSeconds + elapsedSeconds; minutes = manualMinutes + seconds / 60; hours = manualHours + minutes / 60; seconds %= 60; minutes %= 60; hours %= 12; // Gebruik modulo 12 voor 12-uursformaat } else { // Gebruik RTC-tijd DateTime now = rtc.now(); hours = now.hour(); minutes = now.minute(); seconds = now.second(); } // Zet alle LED's uit for (int i = 0; i < LED_COUNT; i++) { strip.setPixelColor(i, strip.Color(0, 0, 0)); // Uit } // Toon de uren (groen) int hourLED = (hours * 5) % LED_COUNT; // Verdeel de uren over 60 LED's for (int i = 0; i < 3; i++) { if (!settingHours || blinkState) { // Knipperen als uren worden ingesteld strip.setPixelColor((hourLED + i) % LED_COUNT, strip.Color(0, 255, 0)); // Groen } } // Toon de minuten (rood) int minuteLED = minutes % LED_COUNT; // Verdeel de minuten over 60 LED's if (!settingMinutes || blinkState) { // Knipperen als minuten worden ingesteld strip.setPixelColor(minuteLED, strip.Color(255, 0, 0)); // Rood (eerste LED) strip.setPixelColor((minuteLED + 1) % LED_COUNT, strip.Color(255, 0, 0)); // Rood (tweede LED) } // Toon de seconden (blauw) int secondLED = seconds % LED_COUNT; // Verdeel de seconden over 60 LED's strip.setPixelColor(secondLED, strip.Color(0, 0, 255)); // Blauw // Update de LED-strip strip.show(); // Knipperlogica if (millis() - lastBlinkMillis >= 500) { // Knipper elke 500 ms blinkState = !blinkState; lastBlinkMillis = millis(); } // Toon de tijd en LED-status in de seriële monitor Serial.print("Tijd: "); Serial.print(hours); Serial.print(":"); Serial.print(minutes); Serial.print(":"); Serial.print(seconds); Serial.print(" | Uren LED's: "); Serial.print(hourLED); Serial.print(", "); Serial.print((hourLED + 1) % LED_COUNT); Serial.print(", "); Serial.print((hourLED + 2) % LED_COUNT); Serial.print(" | Minuten LED's: "); Serial.print(minuteLED); Serial.print(", "); Serial.print((minuteLED + 1) % LED_COUNT); Serial.print(" | Seconden LED: "); Serial.println(secondLED); delay(100); // Korte vertraging voor betere responsiviteit }
is een arduino uno met een ds3231 en 60 ws2812b leds
[ Voor 0% gewijzigd door SA007 op 22-02-2025 20:40 ]