/* Dit moet een stroboscoop worden */ #define RoteryCodeA 6 #define RoteryCodeB 7 #define RoteryPush 8 #define ledPin 9 #define debug false // include the library codes: #include // initialize the library by associating any needed LCD interface pin // with the arduino pin number it is connected to const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2; LiquidCrystal lcd(rs, en, d4, d5, d6, d7); /*int ledPin = 13; // LED verbonden met digital pin 13 int rechts_boven = 7; // drukknop toerental int rechts_beneden = 8; // drukknop toerental int links_boven = 9; // drukknop toerental int links_beneden = 10; // drukknop toerental */ int cursor_positie; // gebruikt voor LCD digit int knoppen_lees_periode = 10000; // 1000000/waarde aantal keer per seconde /*boolean rechts_boven_ingedrukt = false; boolean rechts_beneden_ingedrukt = false; boolean links_boven_ingedrukt = false; boolean links_beneden_ingedrukt = false; */ unsigned long periode_tijd, licht_aan_tijd, licht_uit_tijd, huidige_tijd, knoppen_lees_tijd; unsigned long loop_teller, loop_teller_oud, loop_teller_tijd; long TPM, TPM_oud; float TPS; long TPM_stap; boolean input_enabled; boolean RoteryPush_enabled; // boolean debug = true; void setup() { lcd.begin(16, 2); // set up the LCD's number of columns and rows: lcd.print("Toerental (TPM) "); // Print a message to the LCD. lcd.setCursor(cursor_positie,1); lcd.cursor(); Serial.begin(115200); // setup serial pinMode(ledPin, OUTPUT); pinMode(RoteryCodeA, INPUT); pinMode(RoteryCodeB, INPUT); pinMode(RoteryPush, INPUT); // pinMode(rechts_beneden, INPUT); loop_teller = 0; TPM = 6000; // startwaarde toerental TPM_stap = 1000; // startwaarde toerental stap cursor_positie = 3; // startwaarde cursor_positie knoppen_lees_tijd = 10000; // startwaarde TPS = (float)TPM / 60; // startwaarde periode_tijd = 1000000/ TPS; // startwaarde licht_aan_tijd = periode_tijd / 10; // startwaarde licht_uit_tijd = periode_tijd - licht_aan_tijd; // startwaarde input_enabled = true; RoteryPush_enabled = true; } void loop() { /********************************************************** * hier onder moet je de regels coderen om de drukknoppen uit te lezen en daarmee * de variable TPM een nieuwe waarde geven. De drukknoppen hebben de naam "rechts_boven", * "rechts_beneden", "links_boven" en "links_beneden". * * In de setup() heeft de variabele TPM (Toeren Per Minuut) een begin waarde van 6000 gekregen. * Als de TPM ingesteld is, kan je bepalen wat "TPS" (Toeren Per Seconde) is. Daarna kan je berekenen * wat de "periode_tijd" is en wat de waarde van "licht_aan_tijd" en "licht_uit_tijd" moeten zijn. * De variabelen "periode_tijd", "licht_aan_tijd" en "licht_uit_tijd" zijn al gedeclareerd. * Zorg er voor dat de duty cycle (duty cycle is behandeld in les#8) 10% is, * dus 1/10 van de tijd aan en 9/10 van de tijd uit. De LED wordt aangestuurd met de pin: ledPin. */ loop_teller++; // hiermee gaan we bepalen hoevaak het programma per seconde wordt uitgevoerd. // Lees buttons *********************************** // bereken TPS, periode_tijd, licht_aan_tijd en licht_uit_tijd // Laat de LED de "licht_aan_tijd" branden en de "licht_uit_tijd" niet branden. if (input_enabled) { // If the current state becomes false, that means a Pulse has occured if (!digitalRead(RoteryCodeA)) { // If the outputB state is true, that means the encoder is rotating clockwise, else counter clockwise if (digitalRead(RoteryCodeB)) TPM = TPM + TPM_stap; else if (TPM - TPM_stap > 60 ) TPM = TPM - TPM_stap; else TPM = 60; input_enabled = false; } } else { if (digitalRead(RoteryCodeA)) { input_enabled = true; } } huidige_tijd = micros(); if (huidige_tijd > knoppen_lees_tijd) // proces die de knoppen leest en nieuwe TPM weergeeft { knoppen_lees_tijd += knoppen_lees_periode; if (RoteryPush_enabled) // knop was laatste keer niet ingedrukt { if (!digitalRead(RoteryPush)) // knop ingedruk? { RoteryPush_enabled = false; if (TPM_stap > 1) { TPM_stap = TPM_stap / 10; cursor_positie += 1; } else { TPM_stap = 10000; cursor_positie += -4; } lcd.setCursor(cursor_positie, 1); if (debug) { Serial.print("kleinere TPM_stap = "); Serial.println(TPM_stap); } } } else if (digitalRead(RoteryPush)) // knop niet meer ingedrukt RoteryPush_enabled = true; // Deze functie print de waarde TPM als de nieuwe waarde TPM anders is dan de oude waarde TPM. if ( TPM != TPM_oud ) { TPM_oud = TPM; TPS = (float)TPM / 60; periode_tijd = 1000000/ TPS; licht_aan_tijd= huidige_tijd + periode_tijd / 10; licht_uit_tijd = huidige_tijd + periode_tijd; lcd.setCursor(1, 1); // set the cursor to column 0, line 1 if (TPM <100000) lcd.print(" "); if (TPM <10000) lcd.print("0"); if (TPM <1000) lcd.print("0"); if (TPM <100) lcd.print("0"); lcd.print(TPM); lcd.setCursor(cursor_positie, 1); if (debug) { Serial.print(" toerental = "); Serial.println(TPM); Serial.print(" TPS = "); Serial.print(TPS); Serial.print(" periode tijd = "); Serial.print(periode_tijd); Serial.print(" licht_aan_tijd = "); Serial.print(licht_aan_tijd); Serial.print(" licht_uit_tijd = "); Serial.print(licht_uit_tijd); Serial.print(" loop_teller = "); Serial.print(loop_teller); Serial.print(" loops per seconde = "); Serial.println((long)((((float)loop_teller-loop_teller_oud)*1000000)/(huidige_tijd-loop_teller_tijd))); } loop_teller_oud = loop_teller; loop_teller_tijd = huidige_tijd; } } // hieronder wordt de LED uit en aan gezet als de desbetreffende tijd verstreken is if ( huidige_tijd > licht_aan_tijd) // tijd verstreken --> LED uit { digitalWrite(ledPin, LOW); licht_aan_tijd = licht_aan_tijd + periode_tijd; } if ( huidige_tijd > licht_uit_tijd) { digitalWrite(ledPin, HIGH); // tijd verstreken --> LED aan licht_uit_tijd = licht_uit_tijd + periode_tijd; } }