Ich möchte eine intelligente Klingel erstellen. Das Programm habe ich aus 2 verschiedenen zusammengestiefelt (Morsecode von
und DFPlayer von
Funktion: Bei langem Drücken der Taste spielt DFPlayer spielt Sounddatei 4 aus Ordner 2, bei falschem Code Sounddatei 3 und bei richtigem Code 2. Auf dem Breadboard mit einem Nano funktioniert alles tadellos. Wenn ich das Ganze auf einen Attiny85 übertrage (mit entsprechender Pinänderung), ist die richtige Codeeingabe nicht möglich, es kommt immer falscher Code=Sounddatei 3, jedoch Sounddatei 4 läuft wunschgemäss.
Wie kann ich den Fehler eingrenzen?
Noch eine Bemerkung: Bei der seriellen Übertragung verzichte ich (wegen der begrenzten Füsse des Attiny) auf das TX-Kabel - funktioniert auch beim Nano auf dem Steckbrett.
Hier der Code:
// Attiny dp-Player immer on
#include "SoftwareSerial.h"
const int ledPin = 3; //Nano 6
const int buttonPin = 0; // Nano 8
const int magnetPin = 4; // orange LED Nano 4
const int schaltPin = 2; // Nano 2
SoftwareSerial mySerial(5,1); //5 brauchts nicht
# define Start_Byte 0x7E
# define Version_Byte 0xFF
# define Command_Length 0x06
# define End_Byte 0xEF
# define Acknowledge 0x00 //Returns info with command 0x41 [0x01: info, 0x00: no info]
# define ACTIVATED LOW
const unsigned long dotInterval = 60;
const unsigned long dashInterval = 200;
const unsigned long letterInterval = 900;
const unsigned long wordInterval = 1400;
unsigned long currentMillis;
unsigned long prevMillis;
int millisFlag;
int letterFlag;
int wordFlag;
int wordBreak;
int Zeit;
String wordFull;
String satz;
void setup()
{
mySerial.begin (9600);
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(magnetPin, OUTPUT);
pinMode(schaltPin, OUTPUT);
digitalWrite(schaltPin, HIGH);
digitalWrite(ledPin, LOW);
millisFlag = 0;
prevMillis = 0;
wordFull = "";
wordBreak = 0;
}
void loop()
{
int buttonState = digitalRead(buttonPin);
if (buttonState == HIGH)
{
digitalWrite(ledPin, HIGH);
delay (10);
++Zeit;
if (millisFlag == 0)
{
prevMillis = millis();
millisFlag = 1;
}
}
else
{
currentMillis = millis();
digitalWrite(ledPin, LOW);
long diff = currentMillis - prevMillis;
if (wordFlag == 1 && diff >= wordInterval)
{
if (satz == "$") //richtiger Code 3x tue mr uf
{
digitalWrite(magnetPin, HIGH);
execute_CMD(0x0F,2,2); //Ton: richtiger Code
delay (9000);
digitalWrite(magnetPin, LOW);
delay (400);
}
else //falscher Code
{
execute_CMD(0x0F,2,3); //Ton: falscher Code
digitalWrite(ledPin, HIGH); // 2x blinken
delay (400);
digitalWrite(ledPin, LOW);
delay (400);
digitalWrite(ledPin, HIGH);
delay (400);
digitalWrite(ledPin, LOW);
delay (400);
digitalWrite(ledPin, HIGH);
delay (400);
digitalWrite(ledPin, LOW);
delay (400);
digitalWrite(ledPin, HIGH);
delay (400);
digitalWrite(ledPin, LOW);
}
satz = "";
// self
wordFlag = 0;
wordFull = "";
// lower ones
letterFlag = 0;
wordBreak = 0;
prevMillis = millis();
millisFlag = 0;
}
if (letterFlag == 1 && (wordBreak == 5 || diff >= letterInterval)) //wordBreak normal bei 4 --> keine längeren Morsewörter für $ --> 9
{
satz = satz + getLetter(wordFull);
wordFull = "";
// upper ones
wordFlag = 1;
//self
letterFlag = 0;
wordBreak = 0;
// lower ones
prevMillis = millis();
millisFlag = 0;
}
if (millisFlag == 1)
{
if (diff >= dashInterval)
{
wordFull += "dash";
wordBreak++;
}
else if (diff >= dotInterval)
{
wordFull += "dot";
wordBreak++;
}
Zeit = 0;
// upper ones
letterFlag = 1;
// self
prevMillis = millis();
millisFlag = 0;
}
}
if(Zeit > 37) // Zählergrösse ab wann geläutet wird
{
execute_CMD(0x0F,2,4); // Ton: läuten
delay(9000);
Zeit = 0 ;
letterFlag = 0;
wordBreak = 0;
prevMillis = millis();
millisFlag = 0;
}
}
void execute_CMD(byte CMD, byte Par1, byte Par2)
{
word checksum = -(Version_Byte + Command_Length + CMD + Acknowledge + Par1 + Par2);
byte Command_line[10] = { Start_Byte, Version_Byte, Command_Length, CMD, Acknowledge,
Par1, Par2, highByte(checksum), lowByte(checksum), End_Byte};
for (byte k=0; k<10; k++)
{
mySerial.write( Command_line[k]);
}
}
char getLetter(String checkWord) {
if (checkWord == "dot") {
return 'E';
} else if (checkWord == "dotdot") {
return 'I';
} else if (checkWord == "dash") {
return 'T';
} else if (checkWord == "dotdotdot") {
return 'S';
} else if (checkWord == "dotdash") {
return 'A';
} else if (checkWord == "dashdot") {
return 'N';
} else if (checkWord == "dotdotdotdot") {
return 'H';
} else if (checkWord == "dotdotdash") {
return 'U';
} else if (checkWord == "dotdashdot") {
return 'R';
} else if (checkWord == "dashdotdot") {
return 'D';
} else if (checkWord == "dashdash") {
return 'M';
} else if (checkWord == "dotdashdash") {
return 'W';
} else if (checkWord == "dashdashdot") {
return 'G';
} else if (checkWord == "dotdotdotdash") {
return 'V';
} else if (checkWord == "dotdashdotdot") {
return 'L';
} else if (checkWord == "dotdotdashdot") {
return 'F';
} else if (checkWord == "dashdotdotdot") {
return 'B';
} else if (checkWord == "dashdotdash") {
return 'K';
} else if (checkWord == "dotdotdotdotdash") {
return '$';
} else if (checkWord == "dashdashdash") {
return 'O';
} else if (checkWord == "dotdashdashdot") {
return 'P';
} else if (checkWord == "dashdotdotdash") {
return 'X';
} else if (checkWord == "dashdotdashdot") {
return 'C';
} else if (checkWord == "dashdashdotdot") {
return 'Z';
} else if (checkWord == "dotdashdashdash") {
return 'J';
} else if (checkWord == "dashdotdashdash") {
return 'Y';
} else if (checkWord == "dashdashdotdash") {
return 'Q';
} else {
return '_';
}
}