Stap 6: Verbetering van de rare Communicator
Als je met de geheime Communicator voor enige tijd spelen zult u sommige patronen merken. Bijvoorbeeld, alle getallen beginnen met gele kleur en alle letters beginnen met magenta of wit. Het kan lijken een goed idee om te corrigeren de karakter-tabel een beetje te maken deze patronen nog intuïtievere. Dit is wat ik deed – Zie de nieuwe tabel hierboven. Ik besloot zelfs te wijden alle gele codes aan getallen, waardoor het mogelijk is voor het verzenden van HEX cijfers. Dit bleek te zijn een beetje moeilijker dan ik aanvankelijk dacht dat, als de 'brief-cijfers' van de ABCDEF bereik worden herhaald als letters, dus ik moest het maken van een speciale communicatie-modus voor hen-de HEX getallen worden verzonden met een lang geel streepje gevolgd door twee kleuren cijfers zonder de eerste twee bits voor snelheid. Als u typt HEXes beginnend met '0 x' in de seriële Monitor worden ze geïnterpreteerd als HEXes en dienovereenkomstig.
Ik zal niet ingaan op verdere details met betrekking tot deze schets want het is niet het punt van dit instructable, hopelijk u zal zitten kundig voor gebruik en bewerk de schets volgens uw behoeften. Hier is het:
#define RED 3 // pins the RGB LED is connected to#define GREEN 5 #define BLUE 6// the table of colors. This one was calibrated for a 10mm RGB LED uint8_t RGBready[13][3] ={ {255, 0, 0}, // 00xxxx {128, 127, 0}, // 01xxxx {206, 0, 49}, // 10xxxx {110, 90, 54}, // 11xxxx white //{26, 155, 74}, // 11xxxx cyan {0, 255, 0}, // xx00xx {179, 75, 0}, // xx01xx {0, 168, 87}, // xx10xx {90, 110, 54}, // xx11xx white //{158, 10, 87}, // xx11xx pink {0, 0, 165}, // xxxx00 {206, 0, 49}, // xxxx01 {0, 212, 42}, // xxxx10 {90, 90, 74}, // xxxx11 white //{139, 105, 10}, // xxxx11 yellow {0,0,0} // 'black' };// the Secret Code table, all values are ASCII codes // this one is not strictly necessary, as it is used only // to fill substitution table during setup, but it is // easier to edit and understand 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 digits) 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 message[64], count; // char array (64 bytes max) and counter// below are durations for colors and the 'black' pause between, in ms uint16_t signalDuration=400, pauseBetween=100;void setup() { Serial.begin(115200); // speed must be high, see the Serial.available comment below// fill substitution table for (uint8_t k=0; k<64; k++) { substitutionTable[secretCode[k]-32] = k; }// fill HEX codes because they are also present in letters for (uint8_t k=16; k<32; k++) { HEXTable[secretCode[k]-48] = k; }// print a character table Serial.println("Character table"); for (uint8_t k=0; k<16; k++) { if (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; // drop the character counter// the weird stuff below is the solution to a thing with Serial.available: // it needs time to count all the bytes it got, but it starts reporting results // before all of them are in. It's ok in the previous sketch, // but here it can botch the HEX recognition routine. // The call to S.a and the delay help it collect its wits // (the port speed change is important too) while (!Serial.available()); delay(10);while (Serial.available()) // read string if available, convert it to our table { int incomingChar = Serial.read (); // normal characters if (incomingChar>31 && incomingChar<96) {message[count] = incomingChar; count++;} // lower case characters must be converted to upper case else if (incomingChar>96 && incomingChar<123) {message[count] = incomingChar - 32; count++;} }// if there is incoming string, show it on the LED if (count>0){ // check if we've got a HEX number if (message[0] == 48 && message[1] == 88) sendHEXmessage(); // else send normally else for (uint8_t k=0; k// the function to color-code and show info on the LED void sendRGBmessage(uint8_t letter) { letter = substitutionTable[letter-32]; // convert from ASCII to our format showRGBcolor(letter>>4); // upper 2 bits delay(signalDuration); showRGBcolor(4+((letter>>2)&3)); // middle 2 bits delay(signalDuration); showRGBcolor(8+(letter&3)); // lower 2 bits delay(signalDuration); showRGBcolor(12); // pause between characters delay(pauseBetween); }// the function to send HEX numbers void sendHEXmessage() { showRGBcolor(1); // show yellow to signify the start of a HEX sequence delay(signalDuration<<1); // double pause showRGBcolor(12); // pause between characters delay(pauseBetween); for (uint8_t k=2; k>2)&3)); // middle 2 bits delay(signalDuration); showRGBcolor(8+(letter&3)); // lower 2 bits delay(signalDuration); showRGBcolor(12); // pause between characters delay(pauseBetween); } }// the function to do the actual LED turning on // for common anode LED; in case of common cathode remove '255-' chunks void showRGBcolor(byte curLED) { analogWrite(RED, 255-RGBready[curLED][0]); analogWrite(GREEN, 255-RGBready[curLED][1]); analogWrite(BLUE, 255-RGBready[curLED][2]); }