// Version 1.0 Manfred Weber DK1MWB (G35) // Morse code generator mit dem Arduino nano Mai 2016 //****************************************************************************************************************************** // DCR160001 Version 1.0.1 10 Sekunden Pause aus start() entfernt. // 10 Sekunden Pause in loop() gelegt. //****************************************************************************************************************************** // DCR160002 Version 1.1.0 Potentiometer zur Regelung der Geschwindigkeit eingebaut. //****************************************************************************************************************************** // DCR160003 Version 1.1.0 Lautsprecherausgabe an Pin 9 //****************************************************************************************************************************** // DCR160004 Version 1.1.0 LCD I2C integriert //****************************************************************************************************************************** //######################### A U S G A B E T E X T ############################################################################## // Habe keine Ahnung wie lang der Text werden darf ohne das es Probleme gibt. (Ausprobieren) byte text[] = "Herzlich Willkommen wuenscht der VFDB mit dem Ortsverband Z12 und der DARC mit den Ortsverbaenden G10 und G35"; //######################### A U S G A B E T E X T ############################################################################## #include // kommt mit Arduino IDE // DCR160004 // Anschluss LCD I2C // Verbinde Vcc und Ground, SDA an A4, SCL an A5 des Arduino // Hole die LCD I2C Library hier: // https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads // Move any other LCD libraries to another folder or delete them // See Library "Docs" folder for possible commands etc. #include // DCR160004 // setze die LCD Addresse auf 0x27 für ein 16 Zeichen 2 Zeilen Display // Einige LCD benutzen die Adresse 0x3F (eventuell Adresse wechseln) // Programmiere die Pins des I2C Chip für die Benutzung mit den LCD Verbindungen: // addr, en,rw,rs,d4,d5,d6,d7,bl,blpol LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Initialisiere LCD I2C Adresse // DCR160004 int ledPin = 13; // Ausgabe an pin D13 int tempo; // (WpM = Wörter pro Minute) (BpM = Buchstaben pro Minute) // 1200 ms ca. 1 WpM ca. 5 BpM // 600 ms ca. 2 WpM ca. 10 BpM // 240 ms ca. 5 WpM ca. 25 BpM // 120 ms ca. 10 WpM ca. 50 BpM // 100 ms ca. 12 WpM ca. 60 BpM // 60 ms ca. 20 WpM ca. 100 BpM // 22 ms ca. 55 WpM ca. 275 BpM //****************************************************************************************************************************** // DCR160002: Potentiometer am analogen Pin 7 //****************************************************************************************************************************** int PotiA7 =A7; // Potentiometer am analogen Pin 7 //****************************************************************************************************************************** //****************************************************************************************************************************** // DCR160003: //****************************************************************************************************************************** int Lautsprecher = 9; // Lautsprecher an Pin 9 int TonHoehe = 700; // Tonhöhe = 700 Hz //****************************************************************************************************************************** //****************************************************************************************************************************** void setup () { pinMode(ledPin, OUTPUT); lcd.begin(16,2); // DCR160004 //****************************************************************************************************************************** // DCR160004: Hintergrundbeleuschtung zum Start 3 mal blinken lassen //****************************************************************************************************************************** for(int i = 0; i< 3; i++) { lcd.backlight(); delay(250); lcd.noBacklight(); delay(250); } lcd.backlight(); // Endet mit Backlight AN // Serial.begin(9600); } //****************************************************************************************************************************** void start(){ digitalWrite(ledPin, LOW); lcd.clear(); // DCR160004 lcd.setCursor(0,0); // DCR160004 // Serial.println(); } //****************************************************************************************************************************** //****************************************************************************************************************************** void di() { // Punkt innerhalb eines Zeichens digitalWrite(ledPin, HIGH); // LED 13 An, PTT An tone(Lautsprecher,TonHoehe); // DCR160003: Lautsprecher An delay(1 * tempo); // Länge Punkt = 1 * tempo digitalWrite(ledPin, LOW); // LED Aus, PTT Aus noTone(Lautsprecher); // DCR160003: Lautsprecher Aus delay(1 * tempo); // Länge zwischen Punkt und Strich = 1 * tempo = 1 * Pause } //****************************************************************************************************************************** void dit() { // Punkt am Ende des Zeichens digitalWrite(ledPin, HIGH); // LED 13 An, PTT AN tone(Lautsprecher,TonHoehe); // DCR160003: Lautsprecher An delay(1 * tempo); // Länge Punkt = 1 * tempo digitalWrite(ledPin, LOW); // LED Aus, PTT Aus noTone(Lautsprecher); // DCR160003: Lautsprecher Aus delay(1 * tempo); // Länge zwischen Punkt und Strich = 1 * tempo = 1 * Pause } //****************************************************************************************************************************** void dah() { // Strich digitalWrite(ledPin, HIGH); // LED 13 An, PTT AN tone(Lautsprecher,TonHoehe); // DCR160003: Lautsprecher An delay(3 * tempo); // Länge Strich = 3 * tempo digitalWrite(ledPin, LOW); // LED Aus, PTT Aus noTone(Lautsprecher); // DCR160003: Lautsprecher Aus delay(1 * tempo); // Länge zwischen Punkt und Strich = 1 * tempo = 1 * Pause } //****************************************************************************************************************************** // Abstand zwischen den Buchstaben 3 Punkte // Abstand zwischen den Worten 7 Punkte //****************************************************************************************************************************** void senden(byte Buchstabe) { lcd.write(Buchstabe); // DCR160004: Ausgabe auf LCD Display //Serial.write(Buchstabe); // Ausgabe Terminalprogramm switch (Buchstabe){ case 'a': case 'A': di(); dah(); break; case 'b': case 'B': dah(); di(); di(); dit(); break; case 'c': case 'C': dah(); di(); dah(); dit(); break; case 'd': case 'D': dah(); di(); dit(); break; case 'e': case 'E': dit(); break; case 'f': case 'F': di(); di(); dah(); dit(); break; case 'g': case 'G': dah(); dah(); dit(); break; case 'h': case 'H': di(); di(); di(); dit(); break; case 'i': case 'I': di(); dit(); break; case 'j': case 'J': di(); dah(); dah(); dah(); break; case 'k': case 'K': dah(); di(); dah(); break; case 'l': case 'L': di(); dah(); di(); dit(); break; case 'm': case 'M': dah(); dah(); break; case 'n': case 'N': dah(); dit(); break; case 'o': case 'O': dah(); dah(); dah(); break; case 'p': case 'P': di(); dah(); dah(); dit(); break; case 'q': case 'Q': dah(); dah(); di(); dah(); break; case 'r': case 'R': di(); dah(); dit(); break; case 's': case 'S': di(); di(); dit(); break; case 't': case 'T': dah(); break; case 'u': case 'U': di(); di(); dah(); break; case 'v': case 'V': di(); di(); di(); dah(); break; case 'w': case 'W': di(); dah(); dah(); break; case 'x': case 'X': dah(); di(); di(); dah(); break; case 'y': case 'Y': dah(); di(); dah(); dah(); break; case 'z': case 'Z': dah(); dah(); di(); dit(); break; case '1': di(); dah(); dah(); dah(); dah(); break; case '2': di(); di(); dah(); dah(); dah(); break; case '3': di(); di(); di(); dah(); dah(); break; case '4': di(); di(); di(); di(); dah(); break; case '5': di(); di(); di(); di(); dit(); break; case '6': dah(); di(); di(); di(); dit(); break; case '7': dah(); dah(); di(); di(); dit(); break; case '8': dah(); dah(); dah(); di(); dit(); break; case '9': dah(); dah(); dah(); dah(); dit(); break; case '0': dah(); dah(); dah(); dah(); dah(); break; case '=': // wird auch als BT (Pause) definiert. dah(); di(); di(); di(); dah(); break; //****************************************************************************************************************************** // zusätzliche Zeichen hier einbauen // case ' ': // neues ASCII - Zeichen // dah(); ...; di(); ........; // Punkte und Striche // break; //****************************************************************************************************************************** case ' ': // blank (Leerzeichen) = Trenner zwischen zwei Wörter delay(4 * tempo); // = 4 * Pause lcd.clear(); // DCR160004 lcd.setCursor(0,0); // DCR160004 break; default: // Du solltest nicht hier sein. // Ursache ist ein fehlendes Zeichen im (switch case) Bereich. // (Irrung) di(); di(); di(); di(); di(); di(); di(); dit(); break; } delay(2 * tempo); // = 2 * Pause nach jedem Zeichen // Das macht 3 * Pause nach jedem Buchstaben (1 * Pause bei jedem Strich bzw. Punkt + 2 * Pause nach jedem Zeichen) // und 7 * Pause nach jedem Wort (1 * Pause bei jedem Strich bzw. Punkt + 2 * Pause nach jedem Zeichen + 4 * Pause beim Leerzeichen ) } //****************************************************************************************************************************** void loop () { start(); for (int i = 0; i < sizeof(text) - 1; i++) { tempo = 1200/map(analogRead(PotiA7),0,1023,2,55); // DCR1600002: 2 WpM bis 55 WpM ergibt tempo = 600 ms bis 22 ms senden(text[i]); } delay(10000); // 10 Sekunden Pause nach dem Text. DCR160001 } //******************************************************************************************************************************