#include #include const byte ROWS = 4; //four rows const byte COLS = 4; //four columns char keys[ROWS][COLS] = { {'A','B','C','F'}, {'3','6','9','E'}, {'2','5','8','0'}, {'1','4','7','D'} }; byte rowPins[ROWS] = {5, 6, 7, 8}; //connect to the row pinouts of the keypad byte colPins[COLS] = {4, 3, 2, 1}; //connect to the column pinouts of the keypad Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS); LiquidCrystal lcd(14, 13, 9, 10, 11, 12); int bitstream[300]; int s = 0; int d = 0; int last = 0; int b4 = 0; int b3 = 0; int b2 = 0; int b1 = 0; //a: b; c< d= e> f? // example of char id[]={'b', '0', '0', '2', '3', '5', '2', '1', '0', '1', 'f'}; char id[16]; byte up1[8] = { B11111, B00100, B00100, B00100, B00101, B00110, B00100, }; byte up2[8] = { B11111, B00001, B00010, B00100, B01000, B10001, B01110, }; byte up3[8] = { B01110, B10000, B10000, B01100, B10000, B10000, B01110, }; byte up4[8] = { B10000, B10000, B10000, B11110, B10010, B10010, B10010, }; byte up5[8] = { B01110, B10000, B10000, B01110, B00010, B00010, B11110, }; byte up7[8] = { B00001, B00010, B00100, B01000, B10000, B10000, B11111, }; void setup() { lcd.begin(8, 2); lcd.setCursor(0, 1); lcd.print("Ready"); pinMode(0, OUTPUT); for (int j = 0; j < 16; j++) id[j] = '0'; lcd.createChar(0, up1); lcd.createChar(1, up2); lcd.createChar(2, up3); lcd.createChar(3, up4); lcd.createChar(4, up5); lcd.createChar(5, up7); lcd.setCursor(7,0); lcd.rightToLeft(); } void loop(){ char key = keypad.getKey(); switch(key){ case 'A': generate(); s = 0; send(); delay(500); break; case 'B': for (int j = 0; j < 16; j++) id[j] = '0'; lcd.clear(); d = 0; lcd.setCursor(0, 1); lcd.print("Cleared"); lcd.setCursor(7,0); lcd.rightToLeft(); break; //Case C is number mode. Set the bit that will always be the same, no matter what the ID. example given: ;0xxxxxxxx01? case 'C': for (int j = 0; j < 16; j++) id[j] = '0'; id[0]='b'; id[1]='0'; id[10]='0'; id[11]='1'; id[12]='f'; lcd.clear(); d = 2; lcd.setCursor(0, 1); lcd.print("Number"); lcd.setCursor(7,0); lcd.rightToLeft(); break; case 'D': id[d] = 'b'; lcd.print(';'); delay(100); d++; break; case 'E': id[d] = 'f'; lcd.print('?'); delay(100); d++; break; case 'F': for (int j = 0; j < 16; j++) id[j] = '0'; lcd.clear(); d = 0; lcd.setCursor(0, 1); lcd.print("Normal"); lcd.setCursor(7,0); lcd.rightToLeft(); break; case '1': id[d] = '1'; lcd.write(0); delay(100); d++; break; case '2': id[d] = '2'; lcd.write(1); delay(100); d++; break; case '3': id[d] = '3'; lcd.write(2); delay(100); d++; break; case '4': id[d] = '4'; lcd.write(3); delay(100); d++; break; case '5': id[d] = '5'; lcd.write(4); delay(100); d++; break; case '6': id[d] = '6'; lcd.print('9'); delay(100); d++; break; case '7': id[d] = '7'; lcd.write(5); delay(100); d++; break; case '8': id[d] = '8'; lcd.print('8'); delay(100); d++; break; case '9': id[d] = '9'; lcd.print('6'); delay(100); d++; break; case '0': id[d] = '0'; lcd.print('0'); delay(100); d++; break; } if (d >= 16) { lcd.setCursor(0,1); lcd.print("Full");} } void generate(){ s = 0; for(int a=0; a<58; a++) {bitstream[s] = 0; s++;} for(int i=0;i<16;i++) { switch(id[i]) { case '0': bitstream[s] = 0; s++; bitstream[s] = 0; s++; bitstream[s] = 0; s++; bitstream[s] = 0; s++; bitstream[s] = 1; s++; break; case '1': bitstream[s] = 1; b1++; s++; bitstream[s] = 0; s++; bitstream[s] = 0; s++; bitstream[s] = 0; s++; bitstream[s] = 0; s++; break; case '2': bitstream[s] = 0; s++; bitstream[s] = 1; b2++; s++; bitstream[s] = 0; s++; bitstream[s] = 0; s++; bitstream[s] = 0; s++; break; case '3': bitstream[s] = 1; b1++; s++; bitstream[s] = 1; b2++; s++; bitstream[s] = 0; s++; bitstream[s] = 0; s++; bitstream[s] = 1; s++; break; case '4': bitstream[s] = 0; s++; bitstream[s] = 0; s++; bitstream[s] = 1; b3++; s++; bitstream[s] = 0; s++; bitstream[s] = 0; s++; break; case '5': bitstream[s] = 1; b1++; s++; bitstream[s] = 0; s++; bitstream[s] = 1; b3++; s++; bitstream[s] = 0; s++; bitstream[s] = 1; s++; break; case '6': bitstream[s] = 0; s++; bitstream[s] = 1; b2++; s++; bitstream[s] = 1; b3++; s++; bitstream[s] = 0; s++; bitstream[s] = 1; s++; break; case '7': bitstream[s] = 1; b1++; s++; bitstream[s] = 1; b2++; s++; bitstream[s] = 1; b3++; s++; bitstream[s] = 0; s++; bitstream[s] = 0; s++; break; case '8': bitstream[s] = 0; s++; bitstream[s] = 0; s++; bitstream[s] = 0; s++; bitstream[s] = 1; b4++; s++; bitstream[s] = 0; s++; break; case '9': bitstream[s] = 1; b1++; s++; bitstream[s] = 0; s++; bitstream[s] = 0; s++; bitstream[s] = 1; b4++; s++; bitstream[s] = 1; s++; break; case 'a': bitstream[s] = 0; s++; bitstream[s] = 1; b2++; s++; bitstream[s] = 0; s++; bitstream[s] = 1; b4++; s++; bitstream[s] = 1; s++; break; case 'b': bitstream[s] = 1; b1++; s++; bitstream[s] = 1; b2++; s++; bitstream[s] = 0; s++; bitstream[s] = 1; b4++; s++; bitstream[s] = 0; s++; break; case 'c': bitstream[s] = 0; s++; bitstream[s] = 0; s++; bitstream[s] = 1; b3++; s++; bitstream[s] = 1; b4++; s++; bitstream[s] = 1; s++; break; case 'd': bitstream[s] = 1; b1++; s++; bitstream[s] = 0; s++; bitstream[s] = 1; b3++; s++; bitstream[s] = 1; b4++; s++; bitstream[s] = 0; s++; break; case 'e': bitstream[s] = 0; s++; bitstream[s] = 1; b2++; s++; bitstream[s] = 1; b3++; s++; bitstream[s] = 1; b4++; s++; bitstream[s] = 0; s++; break; case 'f': bitstream[s] = 1; b1++; s++; bitstream[s] = 1; b2++; s++; bitstream[s] = 1; b3++; s++; bitstream[s] = 1; b4++; s++; bitstream[s] = 1; s++; b1 = b1%2; bitstream[s] = b1; s++; b2 = b2%2; bitstream[s] = b2; s++; b3 = b3%2; bitstream[s] = b3; s++; b4 = b4%2; bitstream[s] = b4; s++; if ((b1+b2+b3+b4)%2!=0) bitstream[s] = 0; else bitstream[s] = 1; s++; b1 = 0; b2 = 0; b3 = 0; b4 = 0; for(int a=0; a<32; a++) {bitstream[s] = 0; s++;} //write 8 zeros break; } } } void send(){ for (int i = 0; i < 300; i++){ if (bitstream[i] == 0) write0(); else write1(); } } void write0(){ if(last==0) { digitalWrite(0,HIGH); delayMicroseconds(1000); last = 1; } else { digitalWrite(0,LOW); delayMicroseconds(1000); last = 0; } } void write1(){ if(last==0) { digitalWrite(0,HIGH); delayMicroseconds(500); digitalWrite(0,LOW); delayMicroseconds(500); last = 0; } else { digitalWrite(0,LOW); delayMicroseconds(500); digitalWrite(0,HIGH); delayMicroseconds(500); last = 1; } }