Med en enda RGB LED (eller en LED strip) för att visa information: klocka, termometer och en konstig kommunikatör (6 / 7 steg)
Steg 6: Förbättra den konstiga communicatorn
Om du spelar med Secret communicatorn en tid du kommer att notera vissa mönster. Till exempel alla nummer börja med gul färg och alla bokstäver startar med magenta eller vit. Det kan se ut som en bra idé att rätta tabellen karaktär lite göra dessa mönster ännu mer intuitivt. Detta är vad jag gjorde-se den nya tabellen ovan. Jag beslutade även att ägna alla gula koder till siffror, gör det möjligt att överföra HEX siffror. Detta visade sig vara lite svårare än jag trodde från början, som de "brev-siffrorna" i ABCDEF intervall upprepas som brev, så jag var tvungen att göra en speciell kommunikationsläge för dem. – HEX siffrorna överförs med en lång gul bindestreck följt av två färger siffror utan de första två bitarna för hastighet. Om du skriver HEXes börjar med '0 x' i följetong Monitor kommer att de tolkas som HEXes och överförs därefter.
Jag kommer inte gå in ytterligare information om denna skiss som det inte är poängen med detta instructable, förhoppningsvis kommer du att kunna använda och redigera skissen efter dina behov. Här är det:
#define RED 3 / / pins RGB LED är ansluten till
#define grön 5
#define blå 6
tabellen i färger. Den här var kalibrerad för en 10mm RGB LED
uint8_t RGBready [13] [3] = {
{255, 0, 0}, / / 00xxxx
{128, 127, 0}, / / 01xxxx
{206, 0, 49}, / / 10xxxx
{110, 90, 54}, / / 11xxxx vit
{26, 155, 74}, / / 11xxxx cyan
{0, 255, 0}, / / xx00xx
{179, 75, 0}, / / xx01xx
{0, 168, 87}, / / xx10xx
{90, 110, 54}, / / xx11xx vit
{158, 10, 87}, / / xx11xx rosa
{0, 0, 165}, / / xxxx00
{206, 0, 49}, / / xxxx01
{0, 212, 42}, / / xxxx10
{90, 90, 74}, / / xxxx11 vit
{139, 105, 10}, / / xxxx11 gul
{0,0,0} / / 'svart'
};
Secret Code bordet, alla värden är ASCII-koder
här är inte absolut nödvändigt, eftersom det används endast
att fylla ersättningstabellen under installationen, men det är
enklare att redigera och förstå
uint8_t secretCode [64] = {
32, 33, 63, 46, 44, 59, 58, 45, / /!?.,:-
40, 41, 34, 39, 43, 42, 61, 47, / / () "" + * = /
48, 49, 50, 51, 52, 53, 54, 55, / / 01234567
56, 57, 65, 66, 67, 68, 69, 70, / / 89ABCDEF (HEX siffror)
64, 65, 66, 67, 68, 69, 70, 71, / /
72, 73, 74, 75, 76, 77, 78, 79, / / HIJKLMNO
80, 81, 82, 83, 84, 85, 86, 87, / / PQRSTUVW
88, 89, 90, 35, 36, 37, 38, 95 / / XYZ #$% & _
};
uint8_t substitutionTable [64], HEXTable [16].
uint8_t meddelande [64], räkna; char array (64 byte max) och räknaren
nedan finns varaktigheterna för färger och "svart" paus mellan, i ms
uint16_t signalDuration = 400, pauseBetween = 100;
void setup() {
Serial.BEGIN(115200); hastigheten måste vara hög, se Serial.available kommentar nedan
ersättningstabellen för fyllning
för (uint8_t k = 0; k < 64; k ++)
{
substitutionTable [secretCode [k] -32] = k;
}
Fyll HEX koder eftersom de förekommer också i brev
för (uint8_t k = 16; k < 32; k ++)
{
HEXTable [secretCode [k]-48] = k;
}
skriva ut en teckentabell
Serial.println ("karaktär bord");
för (uint8_t k = 0; k < 16; k ++)
{
om (k < 10) Serial.print("0");
Serial.Print(k);
Serial.Print(":");
Serial.write(secretCode[k]);
Serial.Print("");
Serial.Print(k+16);
Serial.Print(":");
Serial.write(secretCode[k+16]);
Serial.Print("");
Serial.Print(k+32);
Serial.Print(":");
Serial.write(secretCode[k+32]);
Serial.Print("");
Serial.Print(k+48);
Serial.Print(":");
Serial.write(secretCode[k+48]);
Serial.println();
}
}
void loop() {
Count = 0; släpp teckenräknare
den konstiga saker nedan är lösningen på en sak med Serial.available:
den behöver tid att räkna alla byte fick det, men det börjar rapportera resultat
innan alla är i. Det är ok i den tidigare skissen,
men här kan det klantar HEX erkännande rutin.
Anropet till S.a och förseningen hjälpa den samla sitt förstånd
(port hastighet förändringen är viktig också)
tag (!. Serial.available());
Delay(10);
medan (Serial.available()) / / läsa strängen om tillgängligt, konvertera det till vårt bord
{
int incomingChar = Serial.read ();
vanliga tecken
om (incomingChar > 31 & & incomingChar < 96) {meddelande [antal] = incomingChar; räkna ++;}
små bokstäver måste konverteras till versaler
annars om (incomingChar > 96 & & incomingChar < 123) {meddelande [antal] = incomingChar - 32; räkna ++;}
}
om det finns inkommande sträng, Visa det på LED
om (count > 0) {
Kontrollera om vi har en HEX numret
om (meddelande [0] == 48 & & meddelande [1] == 88) sendHEXmessage();
annars skicka normalt
annat för (uint8_t k = 0; k
funktionen att färgkoda och Visa information på LED
void sendRGBmessage(uint8_t letter)
{
brev = substitutionTable [brev-32]. konvertera från ASCII till våra format
showRGBcolor (brev >> 4); övre 2 bitar
Delay(signalDuration);
showRGBcolor (4 + ((brev >> 2) & 3)); mellersta 2 bitar
Delay(signalDuration);
showRGBcolor (8 + (brev & 3)); lägre 2 bitar
Delay(signalDuration);
showRGBcolor(12); paus mellan tecken
Delay(pauseBetween);
}
funktionen för att skicka HEX siffror
void sendHEXmessage()
{
showRGBcolor(1); Visa gul för att beteckna en HEX startas
fördröjning (signalDuration << 1); dubbel paus
showRGBcolor(12); paus mellan tecken
Delay(pauseBetween);
för (uint8_t k = 2; k > 2) & 3)); mellersta 2 bitar
Delay(signalDuration);
showRGBcolor (8 + (brev & 3)); lägre 2 bitar
Delay(signalDuration);
showRGBcolor(12); paus mellan tecken
Delay(pauseBetween);
}
}
funktionen för att göra den faktiska LED tända
för gemensam anod LED; vid gemensam katod bort "255-' bitar
void showRGBcolor(byte curLED)
{
analogWrite (röd, 255-RGBready[curLED][0]);
analogWrite (gröna, 255-RGBready[curLED][1]);
analogWrite (blå, 255-RGBready[curLED][2]);
}