Este proyecto consta de dos partes, el emisor y el receptor, se puede usar para enviar textos a través de láser usando un teclado y una pantalla LCD
Código
- Código de transmisor LI-FI V 2.0
- Receptor LI-FI Código V 2.0
Código de transmisor LI-FI V 2.0 C / C ++
Transmisor LI-FI Código V 2.0 / * Código de transmisor LI-FI V 2.0 Escrito por HOUALEF AHMED RAMZI Iniciado el 29-9-2020 Última actualización el 14-10-2020 * / # define LaserPin 2 # incluye const int rs =12, en =11, d4 =6, d5 =5, d6 =4, d7 =3; LiquidCrystal lcd (rs, en, d4, d5, d6, d7); int entrantechar; int KeyPad_R [ ] ={A2, A1, 9, 7}; // El teclado de filasint KeyPad_C [] ={8, 10, A3}; // El teclado Columnsint KeyReturn =0; // La salida de la función del teclado de 1-12int ABC; // variable usada para codificar 3 caracteres usando un botón en Fila; // variable utilizada en la función del teclado en la columna; // variable utilizada en la función del teclado en StCursor =0; // variable para el Cursor Controlint NdCursor =0; // variable para Cursor Controlint outcomingmatrix [32] [5]; // El DATA Bufferint m =0; // variable utilizada para conocer la longitud de la matriz saliente para evitar enviar todos los 32 * 5 emty bufferint A [] ={1, 1, 1, 1, 0}, B [] ={0, 0, 0, 1, 0}, C [] ={0, 0, 0, 1, 1}, D [] ={0, 0, 1, 0, 0}, E [] ={0 , 0, 1, 0, 1}, F [] ={0, 0, 1, 1, 0}, G [] ={0, 0, 1, 1, 1}, H [] ={0, 1 , 0, 0, 0}; int I [] ={0, 1, 0, 0, 1}, J [] ={0, 1, 0, 1, 0}, K [] ={0, 1, 0, 1, 1}, L [] ={0, 1, 1, 0, 0}, M [] ={0, 1, 1, 0, 1}, N [] ={0, 1, 1, 1, 0}, O [] ={0, 1, 1, 1, 1}, P [] ={1, 0, 0, 0, 0}; int Q [] ={1, 0, 0, 0 , 1}, R [] ={1, 0, 0, 1, 0}, S [] ={1, 0, 0, 1, 1}, T [] ={1, 0, 1, 0, 0 }, U [] ={1, 0, 1, 0, 1}, V [] ={1, 0, 1, 1, 0}, W [] ={1, 0, 1, 1, 1}, X [] ={1, 1, 0, 0, 0}; int Y [] ={1, 1, 0, 0, 1}, Z [] ={1, 1, 0, 1, 0}, ESPACIO [] ={1, 1, 1, 1, 1}; // una pequeña base de datos para almacenar todos los caracteres codificados void setup () {lcd.begin (16, 2); pinMode (LaserPin, SALIDA); Serial.begin (9600); para (int i; i <4; i ++) {pinMode (KeyPad_R [i], SALIDA); } para (int j; j <3; j ++) {pinMode (KeyPad_C [j], INPUT); } lcd.print ("HOUALEF RAMZI"); retraso (5000); lcd.clear (); lcd.setCursor (0,0);} void conv (int alpha [5], char Char) {// PARA LLENAR EL BÚFER DE SALIDA DESDE LA BASE DE DATOS para (int i =0; i <5; i ++) {outcomingmatrix [ m] [i] =alfa [i]; } lcd.print (Char);} void start_bit () {// EL BIT DE INICIO digitalWrite (LaserPin, HIGH); retraso (9); digitalWrite (LaserPin, LOW);} void KeyPad () {// SALIDA EL NÚMERO DE BOTÓN PULSADO DE 1 A 12 para (int i =0; i <4; i ++) {digitalWrite (KeyPad_R [i], HIGH); para (int j =0; j <3; j ++) {if (digitalRead (KeyPad_C [j]) ==1) {Fila =i; Columna =j; digitalWrite (KeyPad_R [i], LOW); if (Fila ==0) {cambiar (Columna) {caso 0:KeyReturn =1; descanso; caso 1:KeyReturn =2; descanso; caso 2:KeyReturn =3; descanso; }} if (Fila ==1) {cambiar (Columna) {caso 0:KeyReturn =4; descanso; caso 1:KeyReturn =5; descanso; caso 2:KeyReturn =6; descanso; }} if (Fila ==2) {cambiar (Columna) {caso 0:KeyReturn =7; descanso; caso 1:KeyReturn =8; descanso; caso 2:KeyReturn =9; descanso; }} if (Fila ==3) {cambiar (Columna) {caso 0:KeyReturn =10; descanso; caso 1:KeyReturn =11; descanso; caso 2:KeyReturn =12; descanso; }}}}} Serial.println (KeyReturn);} void KeyToAscii (int KeyN, int FirtAsciiValue) {// PARA CONVERTIR LOS DATOS DEL TECLADO AL VALOR ASCII PARA TRABAJAR CON LA FUNCIÓN DE CONV. MONITOR Y EL TECLADO if (KeyReturn ==KeyN) {entrantechar =FirtAsciiValue + ABC; ABC ++; si (ABC ==3) {ABC =0; }}} void CursorControler () {lcd.setCursor (StCursor, NdCursor); if (KeyReturn ==10) {// PARA CONFIRMAR LOS CARACTERES PORQUE 11 EN EL BOTÓN CONFIRMAR delay (100); StCursor ++; m ++; } if (StCursor ==16) {// PARA ESCRIBIR EN NUEVA LÍNEA CUANDO LA PRIMERA ESTA COMPLETA StCursor =0; NdCursor =1; }} bucle vacío () {Teclado (); retraso (150); CursorControler (); KeyToAscii (1, 65); KeyToAscii (2, 68); KeyToAscii (3, 71); KeyToAscii (4, 74); KeyToAscii (5, 77); KeyToAscii (6, 80); KeyToAscii (7, 83); KeyToAscii (8, 86); KeyToAscii (9, 89); KeyToAscii (11, 32); cambiar (carácter entrante) {caso 65:conv (A, 'A'); descanso; caso 66:conv (B, 'B'); descanso; caso 67:conv (C, 'C'); descanso; caso 68:conv (D, 'D'); descanso; caso 69:conv (E, 'E'); descanso; caso 70:conv (F, 'F'); descanso; caso 71:conv (G, 'G'); descanso; caso 72:conv (H, 'H'); descanso; caso 73:conv (yo, 'yo'); descanso; caso 74:conv (J, 'J'); descanso; caso 75:conv (K, 'K'); descanso; caso 76:conv (L, 'L'); descanso; caso 77:conv (M, 'M'); descanso; caso 78:conv (N, 'N'); descanso; caso 79:conv (O, 'O'); descanso; caso 80:conv (P, 'P'); descanso; caso 81:conv (Q, 'Q'); descanso; caso 82:conv (R, 'R'); descanso; caso 83:conv (S, 'S'); descanso; caso 84:conv (T, 'T'); descanso; caso 85:conv (U, 'U'); descanso; caso 86:conv (V, 'V'); descanso; caso 87:conv (W, 'W'); descanso; caso 88:conv (X, 'X'); descanso; caso 89:conv (Y, 'Y'); descanso; caso 90:conv (Z, 'Z'); descanso; caso 32:conv (ESPACIO, ''); descanso; caso 33:conv (ESPACIO, ''); descanso; } // PARA UTILIZAR EL ESPACIO DEL MONITOR SERIAL TIENE QUE CAMBIAR EL CASO 91 POR EL CASO 32 if (KeyReturn ==12) {// PARA ENVIAR DATOS PORQUE 12 ES EL BOTÓN DE ENVIAR delay (100); para (int j =0; j Código de receptor LI-FI V 2.0 C / C ++
Receptor LI-FI Código V 2.0 / * Receptor LI-FI Código V 2.0 Escrito por HOUALEF AHMED RAMZI Iniciado el 29-9-2020 Última actualización el 14-10-2020 * / # include #define SolarCell A0 // Para definir el pin de entrada del solarcellint StCursor =0; // Para controlar el Cursorint lcd A [] ={1, 1, 1, 1, 0}, B [] ={0, 0, 0, 1, 0}, C [] ={0, 0, 0, 1, 1}, D [] ={0, 0, 1, 0, 0}, E [] ={0, 0, 1, 0, 1}, F [] ={0, 0, 1, 1, 0}, G [] ={0, 0, 1, 1, 1}, H [] ={0, 1, 0, 0, 0}; int I [] ={0, 1, 0, 0, 1 }, J [] ={0, 1, 0, 1, 0}, K [] ={0, 1, 0, 1, 1}, L [] ={0, 1, 1, 0, 0}, M [] ={0, 1, 1, 0, 1}, N [] ={0, 1, 1, 1, 0}, O [] ={0, 1, 1, 1, 1}, P [ ] ={1, 0, 0, 0, 0}; int Q [] ={1, 0, 0, 0, 1}, R [] ={1, 0, 0, 1, 0}, S [] ={1, 0, 0, 1, 1}, T [] ={1, 0, 1, 0, 0}, U [] ={1, 0, 1, 0, 1}, V [] ={ 1, 0, 1, 1, 0}, W [] ={1, 0, 1, 1, 1}, X [] ={1, 1, 0, 0, 0}; int Y [] ={1 , 1, 0, 0, 1}, Z [] ={1, 1, 0, 1, 0}, ESPACIO [] ={1, 1, 1, 1, 1}; const int rs =12, en =11, d4 =5, d5 =4, d6 =3, d7 =2; int Cell_Input; // La entrada del Umbral Solar-Cellint; int info [5]; // El lcd DATALiquidCrystal recibido (rs, en, d4, d5, d6, d7); void setup () {pinMode (A0, INPUT); Serial.begin (9600); lcd. comienzo (16, 2); lcd.setCursor (0, 0); Umbral =analogRead (SolarCell) + 10; lcd.print ("LISTO PARA RECIBIR"); retraso (5000); lcd.clear ();} void BufferClear () {// El borrado del búfer para (int i =0; i <5; i ++) {info [i] =0; }} void check_condition (intived_bits [5], int Binaryalpha [5], char Lcdalpha) {// Para comparar los bits recibidos con la base de datos if (selected_bits [0] ==Binaryalpha [0] &&selected_bits [1] ==Binaryalpha [1] &&bits_ recibidos [2] ==Binaryalpha [2] &&bits_ recibidos [3] ==Binaryalpha [3] &&bits_ recibidos [4] ==Binaryalpha [4]) {lcd.print (Lcdalpha); CursorControler (); }} void CursorControler () {// Para controlar el cursor StCursor ++; if (StCursor ==16) lcd.setCursor (0, 1);} bucle vacío () {Cell_Input =analogRead (SolarCell); if (Cell_Input> Threshold) {// el retardo de detección del bit de inicio (10); // tiempo para (int i =0; i <5; i ++) {// guardar datos if (analogRead (SolarCell)> Threshold) {info [i] =1; } más {info [i] =0; } retraso (10); } condición_control (información, A, 'A'); check_condition (información, B, 'B'); check_condition (información, C, 'C'); check_condition (información, D, 'D'); check_condition (información, E, 'E'); check_condition (información, F, 'F'); check_condition (información, G, 'G'); check_condition (información, H, 'H'); check_condition (info, I, 'I'); check_condition (información, J, 'J'); check_condition (información, K, 'K'); check_condition (información, L, 'L'); check_condition (información, M, 'M'); check_condition (información, N, 'N'); check_condition (información, O, 'O'); check_condition (información, P, 'P'); check_condition (información, Q, 'Q'); check_condition (información, R, 'R'); check_condition (información, S, 'S'); check_condition (información, T, 'T'); check_condition (información, U, 'U'); check_condition (información, V, 'V'); check_condition (información, W, 'W'); check_condition (información, X, 'X'); check_condition (información, Y, 'Y'); check_condition (información, Z, 'Z'); check_condition (información, ESPACIO, ''); BufferClear (); }}
Esquemas
la fotocélula debe colocarse cara a cara con láser para recibir datos
LCD:
VSS ---> Tierra
VDD ---> Arduino 5V
K ---> Tierra
A ---> Arduino 5V
RW ---> Tierra
V0 / VEE ---> La Vout del potenciómetro
RS ---> Pin digital Arduino 12
ES ---> Pin digital Arduino 11
D4 ---> Pin digital 5 de Arduino
D5 ---> Pin digital 4 de Arduino
D6 ---> Pin digital 3 de Arduino
D7 ---> Pin digital 2 de Arduino
Célula solar:
El cable negativo del SC está conectado a tierra
El cable positivo del SC está conectado al pin analógico Arduino A0 el usuario debe elegir lo que quiere enviar usando el teclado y la pantalla LCD, luego de escribir cada letra debe presionar el botón confirmar y finalmente presione el botón enviar.
LCD:
VSS ---> Tierra
VDD ---> Arduino 5V
K ---> Tierra
A ---> Arduino 5V
RW ---> Tierra
V0 / VEE ---> La Vout del potenciómetro
RS ---> Pin digital Arduino 12
ES ---> Pin digital Arduino 11
D4 ---> Pin digital 6 de Arduino
D5 ---> Pin digital 5 de Arduino
D6 ---> Pin digital 4 de Arduino
D7 ---> Pin digital 3 de Arduino
TECLADO:
A ---> Pin analógico A2 de Arduino // todos los pines analógicos se utilizan como pines digitales
B ---> Pin analógico Arduino A1
C ---> Pin digital Arduino 9
D ---> Pin digital 7 de Arduino
1 ---> Pin digital Arduino 8
2 ---> Pin digital Arduino 10
3 ---> Pin analógico Arduino A3
RESISTENCIAS DE TIRAR HACIA ABAJO:
el primer extremo de la resistencia está conectado al pin digital 8 y el segundo al suelo
el primer extremo de la resistencia está conectado al pin digital 10 y el segundo al suelo
el primer extremo de la resistencia está conectado al pin analógico A3 y el segundo al suelo
DIODO LÁSER:
El cátodo del LD está conectado a tierra
El ánodo del LD está conectado al pin digital 2 de Arduino