Dersom du har planer om å lære deg karakteristikkene på lys på sjøen, kan jeg anbefale å lage et slikt treningsfyr. Det har de fleste blinkene som er vanlig langs den norske kysten. Lykten styres av en fjernkontroll, og koster under 100 kr å bygge dersom du har en 3D printer.
I forhold til fjernkontrollen har knappene følgende funksjon:
1 – Hurtigblink serien (Q, VQ, UQ)
2 – ISO serien (ISO2, ISO 4, ISO 6, ISO 8)
3 – FM serien (Oc6s, Oc2 8s, Oc 3 8s)
4 – Blink serien (Fl 4s, Fl 6s, Lfl 10s, Fl(2) 6s, Fl(3) 6s)
5 – Kardinal serien (Q, VQ(3)5s, VQ(6)+Lfl 10s, VQ(9)10s)
6 – Morse (SOS)
7 – Fast
8 – Fast
9 – Fast
* – Av
# – Tilfeldig
Pil opp – Veksle blink kategori –
Pil ned – Veksle blink kategori +
Pil venstre – Veksle blink karakteristikk –
Pil høyde – Veksle blink karakteristikk +
OK – AV/PÅ
Delene som er brukt (Lenker til AliExpress):
1 x Arduino Nano
1 x Green LED 5mm
1 x Red LED 5mm
1 x White LED 5mm
1 x IR Remote control module
20 cm ledning
Printede deler (lastes ned fra Thingiverse):
Koblingsskjema:
Koden:
// Include IR Remote Library by Ken Shirriff #include // Define sensor pin const int RECV_PIN = 4; const int ledPin1 = A0; const int ledPin2 = A1; long previousMillis = 0; long previousMillis2 = 0; int ledState = LOW; // Define IR Receiver and Results Objects IRrecv irrecv(RECV_PIN); decode_results results; int verdi2 = 0; int verdi1 = 0; void setup(){ // Serial Monitor @ 9600 baud Serial.begin(9600); // Enable the IR Receiver irrecv.enableIRIn(); pinMode (ledPin1, OUTPUT); pinMode (ledPin2, OUTPUT); } void loop(){ unsigned long currentMillis = millis(); if (irrecv.decode(&results)){ // Print Code in HEX // Serial.println(results.value, HEX); switch(results.value) { case 0xFFA25D: Serial.println("Quick Serien"); verdi1 = 1; break; case 0xFF629D: Serial.println("ISO"); verdi1 = 2; break; case 0xFFE21D: Serial.println("FM"); verdi1 = 3; break; case 0xFF22DD: Serial.println("Flash"); verdi1 = 4; break; case 0xFF02FD: Serial.println("Kardinal"); verdi1 = 5; break; case 0xFFC23D: Serial.println("Morse"); verdi1 = 6; break; case 0xFFE01F: Serial.println("7"); verdi1 = 8; break; case 0xFFA857: Serial.println("8"); verdi1 = 8; break; case 0xFF906F: Serial.println("9"); verdi1 = 8; break; case 0xFF9867: Serial.println("AV"); verdi1 = 7; break; case 0xFF6897: Serial.println("*"); Serial.println("Fast"); verdi1 = 8; break; case 0xFFB04F: Serial.println("#"); verdi1 = random(1,6); verdi2 = random(0,4); Serial.println(verdi1); break; case 0xFF18E7: Serial.println("o"); if (verdi1 <= 5) { verdi1 = verdi1 + 1; Serial.println(verdi1); } else { verdi1 = 1; Serial.println(verdi1); } break; case 0xFF4AB5: Serial.println("n"); if (verdi1 >= 2) { verdi1 = verdi1 - 1; Serial.println(verdi1); } else { verdi1 = 6; Serial.println(verdi1); } break; case 0xFF10EF: Serial.println("V"); if (verdi2 >= 2) { verdi2 = verdi2 - 1; Serial.println(verdi2); } else { verdi2 = 9; Serial.println(verdi2); } break; case 0xFF5AA5: Serial.println("H"); if (verdi2 <= 8) { verdi2 = verdi2 + 1; Serial.println(verdi2); } else { verdi2 = 0; Serial.println(verdi2); } break; case 0xFF38C7: Serial.println("OK"); if (verdi1 !=7) { verdi1 = 7; } else { verdi1 = 8; } break; } irrecv.resume(); } switch(verdi1) { case 1: switch(verdi2) { case 0: //Q blinkOff(); if(currentMillis - previousMillis > 500 && currentMillis - previousMillis < 1000 ) blinkOn(); if(currentMillis - previousMillis > 1000) previousMillis = currentMillis; break; case 1: // VQ blinkOff(); if(currentMillis - previousMillis > 250 && currentMillis - previousMillis < 500 ) blinkOn(); if(currentMillis - previousMillis > 500) previousMillis = currentMillis; break; case 2: // UQ blinkOff(); if(currentMillis - previousMillis > 125 && currentMillis - previousMillis < 250 ) blinkOn(); if(currentMillis - previousMillis > 250) previousMillis = currentMillis; break; case 3: verdi2 = 0; break; case 4: verdi2 = 0; break; case 5: verdi2 = 0; break; case 6: verdi2 = 0; break; case 7: verdi2 = 0; break; case 8: verdi2 = 0; break; case 9: verdi2 = 2; break; } break; case 2: //ISO switch(verdi2) { case 0: //ISO1 blinkOff(); if(currentMillis - previousMillis > 500 && currentMillis - previousMillis < 1000 ) blinkOn(); if(currentMillis - previousMillis > 1000) previousMillis = currentMillis; break; case 1: // ISO2 blinkOff(); if(currentMillis - previousMillis > 1000 && currentMillis - previousMillis < 2000 ) blinkOn(); if(currentMillis - previousMillis > 2000) previousMillis = currentMillis; break; case 2: // ISO 4 blinkOff(); if(currentMillis - previousMillis > 2000 && currentMillis - previousMillis < 4000 ) blinkOn(); if(currentMillis - previousMillis > 4000) previousMillis = currentMillis; break; case 3: // ISO6 blinkOff(); if(currentMillis - previousMillis > 3000 && currentMillis - previousMillis < 6000 ) blinkOn(); if(currentMillis - previousMillis > 6000) previousMillis = currentMillis; break; case 4: // ISO8 blinkOff(); if(currentMillis - previousMillis > 4000 && currentMillis - previousMillis < 8000 ) blinkOn(); if(currentMillis - previousMillis > 8000) previousMillis = currentMillis; break; case 5: verdi2 = 0; break; case 6: verdi2 = 0; break; case 7: verdi2 = 0; break; case 8: verdi2 = 0; break; case 9: verdi2 = 4; break; } break; case 3: //FM / OC switch(verdi2) { case 0: //FM1 blinkOff(); if(currentMillis - previousMillis >1000) blinkOn(); if(currentMillis - previousMillis > 6000) previousMillis = currentMillis; break; case 1: // FM2 blinkOff(); if(currentMillis - previousMillis > 1000 && currentMillis - previousMillis < 2000 ) blinkOn(); if(currentMillis - previousMillis > 2000 && currentMillis - previousMillis < 3000 ) blinkOff(); if(currentMillis - previousMillis > 3000 && currentMillis - previousMillis < 8000) blinkOn(); if(currentMillis - previousMillis > 8000) previousMillis = currentMillis; break; case 2: // FM3 blinkOff(); if(currentMillis - previousMillis > 1000 && currentMillis - previousMillis < 2000 ) blinkOn(); if(currentMillis - previousMillis > 2000 && currentMillis - previousMillis < 3000 ) blinkOff(); if(currentMillis - previousMillis > 3000 && currentMillis - previousMillis < 4000) blinkOn(); if(currentMillis - previousMillis > 4000 && currentMillis - previousMillis < 5000 ) blinkOff(); if(currentMillis - previousMillis > 5000 && currentMillis - previousMillis < 8000) blinkOn(); if(currentMillis - previousMillis > 8000) previousMillis = currentMillis; break; case 3: // verdi2 = 0; break; case 4: // verdi2 = 0; break; case 5: verdi2 = 0; break; case 6: verdi2 = 0; break; case 7: verdi2 = 0; break; case 8: verdi2 = 0; break; case 9: verdi2 = 2; break; } break; case 4: //Flash switch(verdi2) { case 0: //Fl 4s if(currentMillis - previousMillis > 0 && currentMillis - previousMillis < 500 ) blinkOn(); if(currentMillis - previousMillis > 500 && currentMillis - previousMillis < 4000 ) blinkOff(); if(currentMillis - previousMillis > 4000) previousMillis = currentMillis; break; case 1: // Fl 6s if(currentMillis - previousMillis > 0 && currentMillis - previousMillis < 500 ) blinkOn(); if(currentMillis - previousMillis > 500 && currentMillis - previousMillis < 6000 ) blinkOff(); if(currentMillis - previousMillis > 6000) previousMillis = currentMillis; break; case 2: // LF 10s if(currentMillis - previousMillis > 0 && currentMillis - previousMillis < 2000 ) blinkOn(); if(currentMillis - previousMillis > 2000 && currentMillis - previousMillis < 10000 ) blinkOff(); if(currentMillis - previousMillis > 10000) previousMillis = currentMillis; break; case 3: // Fl(2) 6s if(currentMillis - previousMillis > 0 && currentMillis - previousMillis < 500 ) blinkOn(); if(currentMillis - previousMillis > 500 && currentMillis - previousMillis < 1000 ) blinkOff(); if(currentMillis - previousMillis > 1000 && currentMillis - previousMillis < 1500 ) blinkOn(); if(currentMillis - previousMillis > 1500 && currentMillis - previousMillis < 6000 ) blinkOff(); if(currentMillis - previousMillis > 6000) previousMillis = currentMillis; break; case 4: // Fl(3) 6s if(currentMillis - previousMillis > 0 && currentMillis - previousMillis < 500 ) blinkOn(); if(currentMillis - previousMillis > 500 && currentMillis - previousMillis < 1000 ) blinkOff(); if(currentMillis - previousMillis > 1000 && currentMillis - previousMillis < 1500 ) blinkOn(); if(currentMillis - previousMillis > 1500 && currentMillis - previousMillis < 2000 ) blinkOff(); if(currentMillis - previousMillis > 2000 && currentMillis - previousMillis < 2500 ) blinkOn(); if(currentMillis - previousMillis > 2500 && currentMillis - previousMillis < 6000 ) blinkOff(); if(currentMillis - previousMillis > 6000) previousMillis = currentMillis; break; case 5: verdi2 = 0; break; case 6: verdi2 = 0; break; case 7: verdi2 = 0; break; case 8: verdi2 = 0; break; case 9: verdi2 = 4; break; } break; case 5: //Kardinal switch(verdi2) { case 0: //Nord blinkOff(); if(currentMillis - previousMillis > 500 && currentMillis - previousMillis < 1000 ) blinkOn(); if(currentMillis - previousMillis > 1000) previousMillis = currentMillis; break; case 1: // Øst if(currentMillis - previousMillis > 0 && currentMillis - previousMillis < 250 ) blinkOn(); if(currentMillis - previousMillis > 250 && currentMillis - previousMillis < 500 ) blinkOff(); if(currentMillis - previousMillis > 500 && currentMillis - previousMillis < 750 ) blinkOn(); if(currentMillis - previousMillis > 750 && currentMillis - previousMillis < 1000 ) blinkOff(); if(currentMillis - previousMillis > 1000 && currentMillis - previousMillis < 1250 ) blinkOn(); if(currentMillis - previousMillis > 1250 && currentMillis - previousMillis < 5000 ) blinkOff(); if(currentMillis - previousMillis > 5000) previousMillis = currentMillis; break; case 2: // Sør if(currentMillis - previousMillis > 0 && currentMillis - previousMillis < 250 ) blinkOn(); if(currentMillis - previousMillis > 250 && currentMillis - previousMillis < 500 ) blinkOff(); if(currentMillis - previousMillis > 500 && currentMillis - previousMillis < 750 ) blinkOn(); if(currentMillis - previousMillis > 750 && currentMillis - previousMillis < 1000 ) blinkOff(); if(currentMillis - previousMillis > 1000 && currentMillis - previousMillis < 1250 ) blinkOn(); if(currentMillis - previousMillis > 1250 && currentMillis - previousMillis < 1500 ) blinkOff(); if(currentMillis - previousMillis > 1500 && currentMillis - previousMillis < 1750 ) blinkOn(); if(currentMillis - previousMillis > 1750 && currentMillis - previousMillis < 2000 ) blinkOff(); if(currentMillis - previousMillis > 2000 && currentMillis - previousMillis < 2250 ) blinkOn(); if(currentMillis - previousMillis > 2250 && currentMillis - previousMillis < 2500 ) blinkOff(); if(currentMillis - previousMillis > 2500 && currentMillis - previousMillis < 2750 ) blinkOn(); if(currentMillis - previousMillis > 2750 && currentMillis - previousMillis < 3000 ) blinkOff(); if(currentMillis - previousMillis > 3000 && currentMillis - previousMillis < 5000 ) blinkOn(); if(currentMillis - previousMillis > 5000 && currentMillis - previousMillis < 10000 ) blinkOff(); if(currentMillis - previousMillis > 10000) previousMillis = currentMillis; break; case 3: // vest if(currentMillis - previousMillis > 0 && currentMillis - previousMillis < 250 ) blinkOn(); if(currentMillis - previousMillis > 250 && currentMillis - previousMillis < 500 ) blinkOff(); if(currentMillis - previousMillis > 500 && currentMillis - previousMillis < 750 ) blinkOn(); if(currentMillis - previousMillis > 750 && currentMillis - previousMillis < 1000 ) blinkOff(); if(currentMillis - previousMillis > 1000 && currentMillis - previousMillis < 1250 ) blinkOn(); if(currentMillis - previousMillis > 1250 && currentMillis - previousMillis < 1500 ) blinkOff(); if(currentMillis - previousMillis > 1500 && currentMillis - previousMillis < 1750 ) blinkOn(); if(currentMillis - previousMillis > 1750 && currentMillis - previousMillis < 2000 ) blinkOff(); if(currentMillis - previousMillis > 2000 && currentMillis - previousMillis < 2250 ) blinkOn(); if(currentMillis - previousMillis > 2250 && currentMillis - previousMillis < 2500 ) blinkOff(); if(currentMillis - previousMillis > 2500 && currentMillis - previousMillis < 2750 ) blinkOn(); if(currentMillis - previousMillis > 2750 && currentMillis - previousMillis < 3000 ) blinkOff(); if(currentMillis - previousMillis > 3000 && currentMillis - previousMillis < 3250 ) blinkOn(); if(currentMillis - previousMillis > 3250 && currentMillis - previousMillis < 3500 ) blinkOff(); if(currentMillis - previousMillis > 3500 && currentMillis - previousMillis < 3750 ) blinkOn(); if(currentMillis - previousMillis > 3750 && currentMillis - previousMillis < 4000 ) blinkOff(); if(currentMillis - previousMillis > 4250 && currentMillis - previousMillis < 4500 ) blinkOn(); if(currentMillis - previousMillis > 4500 && currentMillis - previousMillis < 10000 ) blinkOff(); if(currentMillis - previousMillis > 10000) previousMillis = currentMillis; break; case 4: // verdi2 = 0; break; case 5: verdi2 = 0; break; case 6: verdi2 = 0; break; case 7: verdi2 = 0; break; case 8: verdi2 = 0; break; case 9: verdi2 = 2; break; } break; case 6: //Kardinal switch(verdi2) { case 0: //Nord if(currentMillis - previousMillis > 0 && currentMillis - previousMillis < 250 ) blinkOn(); //. if(currentMillis - previousMillis > 250 && currentMillis - previousMillis < 500 ) blinkOff(); if(currentMillis - previousMillis > 500 && currentMillis - previousMillis < 750 ) blinkOn();//. if(currentMillis - previousMillis > 750 && currentMillis - previousMillis < 1000 ) blinkOff(); if(currentMillis - previousMillis > 1000 && currentMillis - previousMillis < 1250 ) blinkOn();//. if(currentMillis - previousMillis > 1250 && currentMillis - previousMillis < 2000 ) blinkOff(); if(currentMillis - previousMillis > 2000 && currentMillis - previousMillis < 2750 ) blinkOn();//- if(currentMillis - previousMillis > 2750 && currentMillis - previousMillis < 3000 ) blinkOff(); if(currentMillis - previousMillis > 3000 && currentMillis - previousMillis < 3750 ) blinkOn();//- if(currentMillis - previousMillis > 3750 && currentMillis - previousMillis < 4000 ) blinkOff(); if(currentMillis - previousMillis > 4000 && currentMillis - previousMillis < 4750 ) blinkOn();//- if(currentMillis - previousMillis > 4750 && currentMillis - previousMillis < 5500 ) blinkOff(); if(currentMillis - previousMillis > 5500 && currentMillis - previousMillis < 5750 ) blinkOn();//. if(currentMillis - previousMillis > 5750 && currentMillis - previousMillis < 6000 ) blinkOff(); if(currentMillis - previousMillis > 6000 && currentMillis - previousMillis < 6250 ) blinkOn();//. if(currentMillis - previousMillis > 6250 && currentMillis - previousMillis < 6500 ) blinkOff(); if(currentMillis - previousMillis > 6500 && currentMillis - previousMillis < 6750 ) blinkOn();//. if(currentMillis - previousMillis > 6750 && currentMillis - previousMillis < 8000 ) blinkOff(); if(currentMillis - previousMillis > 8000) previousMillis = currentMillis; break; case 1: // verdi2 = 0; break; case 2: // verdi2 = 0; break; case 3: // verdi2 = 0; break; case 4: // verdi2 = 0; break; case 5: verdi2 = 0; break; case 6: verdi2 = 0; break; case 7: verdi2 = 0; break; case 8: verdi2 = 0; break; case 9: verdi2 = 0; break; } break; case 7: blinkOff(); break; case 8: blinkOn(); break; } } void blinkOn() { analogWrite(ledPin1, 130); digitalWrite(ledPin2, HIGH); delay(30); analogWrite(ledPin1, 255); } void blinkOff() { digitalWrite(ledPin1, LOW); digitalWrite(ledPin2, LOW); }