Drahtlose Laserdatenübertragung (LIFI) (100b/Sekunde)
Komponenten und Verbrauchsmaterialien
![]() |
| × | 2 | |||
![]() |
| × | 2 | |||
![]() |
| × | 2 | |||
![]() |
| × | 30 | |||
| × | 1 | ||||
![]() |
| × | 2 | |||
![]() |
| × | 2 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 2 | |||
![]() |
| × | 3 |
Notwendige Werkzeuge und Maschinen
![]() |
| |||
![]() |
|
Apps und Onlinedienste
![]() |
|
Über dieses Projekt


Dieses Projekt besteht aus zwei Teilen, dem Sender und dem Empfänger. Es kann verwendet werden, um Texte über einen Laser mit einem Tastenfeld und einem LCD zu senden
Code
- LI-FI-Sendercode V 2.0
- LI-FI-Empfängercode V 2.0
LI-FI-Sendercode V 2.0C/C++
LI-FI-Sendercode V 2.0/*LI-FI-Sendercode V 2.0 Geschrieben von HOUALEF AHMED RAMZI Gestartet am 29.09.2020 Letzte Aktualisierung am 14.10.2020*/#define LaserPin 2#includeconst int rs =12, en =11, d4 =6, d5 =5, d6 =4, d7 =3;LiquidCrystal lcd(rs, en, d4, d5, d6, d7);int eingehendchar;int KeyPad_R[ ] ={A2, A1, 9, 7}; //Das KeyPad rowsint KeyPad_C[] ={8, 10, A3}; // Das KeyPad Columnsint KeyReturn =0; // Die Ausgabe der Tastaturfunktion von 1-12int ABC; // Variable zum Codieren von 3 Zeichen mit einer buttonint Row; //Variable, die in der Keypad-Funktionint-Spalte verwendet wird; //Variable, die in der Keypad-Funktion verwendet wirdint StCursor =0; //Variable für den Cursor Controlint NdCursor =0; //Variable für die Cursor Controlint Outcomingmatrix[32][5]; //Der DATA Bufferint m =0; // Variable, die verwendet wird, um die Länge der Outcoming-Matrix zu kennen, um zu vermeiden, dass alle 32*5 leeren Pufferints gesendet werden 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}, SPACE [] ={1, 1, 1, 1, 1}; // eine kleine Datenbank zum Speichern aller codierten Zeichen setup () { lcd.begin (16, 2); pinMode (LaserPin, AUSGANG); Serial.begin (9600); for (int i; i <4; i++) { pinMode (KeyPad_R[i], OUTPUT); } for (int j; j <3; j++) { pinMode (KeyPad_C[j], INPUT); } lcd.print("HOUALEF RAMZI"); Verzögerung (5000); lcd.clear(); lcd.setCursor(0,0);}void conv(int alpha [5], char Char ) { // ZUM FÜLLEN DES AUSGABEPUFFERS AUS DER DATENBANK für (int i =0; i <5; i++) { outcomingmatrix[ m][i] =alpha[i]; } lcd.print (Char);}void start_bit () {//DAS START BIT digitalWrite (LaserPin, HIGH); Verzögerung(9); digitalWrite(LaserPin, LOW);}void KeyPad() { // GIBT DIE NUMMER DER TASTE VON 1 BIS 12 GEDRÜCKT AUS für (int i =0; i <4; i++) { digitalWrite (KeyPad_R[i], HIGH); for (int j =0; j <3; j++) { if (digitalRead(KeyPad_C[j]) ==1) { Row =i; Spalte =j; digitalWrite (KeyPad_R[i], LOW); if (Row ==0) { switch (Column) { case 0:KeyReturn =1; brechen; Fall 1:KeyReturn =2; brechen; Fall 2:KeyReturn =3; brechen; } } if (Row ==1) { switch (Column) { case 0:KeyReturn =4; brechen; Fall 1:KeyReturn =5; brechen; Fall 2:KeyReturn =6; brechen; } } if (Row ==2) { switch (Column) { case 0:KeyReturn =7; brechen; Fall 1:KeyReturn =8; brechen; Fall 2:KeyReturn =9; brechen; } } if (Row ==3) { switch (Column) { case 0:KeyReturn =10; brechen; Fall 1:KeyReturn =11; brechen; Fall 2:KeyReturn =12; brechen; } } } } } Serial.println(KeyReturn);}void KeyToAscii(int KeyN, int FirtAsciiValue) {// ZUM KONVERTIEREN VON DATEN VON DER TASTATUR IN DEN ASCII-WERT, UM MIT DER OBENEN CONV-FUNKTION ZU ARBEITEN SO KÖNNEN WIR BEIDE SERIAL VERWENDEN MONITOR UND DIE TASTATUR if (KeyReturn ==KeyN) { eingehende Zeichen =FirtAsciiValue + ABC; ABC++; wenn (ABC ==3) { ABC =0; } }}void CursorControler() {lcd.setCursor (StCursor, NdCursor); if (KeyReturn ==10) {//UM DIE ZEICHEN ZU BESTÄTIGEN, WEIL 11 IN DER BESTÄTIGUNGSTASTE Verzögerung (100); StCursor++; m++; } if (StCursor ==16) {// IN NEUE ZEILE SCHREIBEN, WENN DER ERSTE VOLL IST StCursor =0; NdCursor =1; }}void loop () { KeyPad (); Verzögerung (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); switch (incomingchar) { case 65:conv(A, 'A'); brechen; Fall 66:conv(B, 'B'); brechen; Fall 67:conv(C, 'C'); brechen; Fall 68:conv(D, 'D'); brechen; Fall 69:conv(E, 'E'); brechen; Fall 70:conv(F, 'F'); brechen; Fall 71:conv(G, 'G'); brechen; Fall 72:conv(H, 'H'); brechen; Fall 73:conv(I, 'I'); brechen; Fall 74:conv(J, 'J'); brechen; Fall 75:conv(K, 'K'); brechen; Fall 76:conv(L, 'L'); brechen; Fall 77:conv(M, 'M'); brechen; Fall 78:conv(N, 'N'); brechen; Fall 79:conv(O, 'O'); brechen; Fall 80:conv(P, 'P'); brechen; Fall 81:conv(Q, 'Q'); brechen; Fall 82:conv(R, 'R'); brechen; Fall 83:conv(S, 'S'); brechen; Fall 84:conv(T, 'T'); brechen; Fall 85:conv(U, 'U'); brechen; Fall 86:conv(V, 'V'); brechen; Fall 87:conv(W, 'W'); brechen; Fall 88:conv(X, 'X'); brechen; Fall 89:conv(Y, 'Y'); brechen; Fall 90:conv(Z, 'Z'); brechen; Fall 32:conv(SPACE, ' '); brechen; Fall 33:conv(SPACE, ' '); brechen; } //UM DEN PLATZ VOM SERIELLEN MONITOR ZU BENUTZEN, MÜSSEN SIE FALL 91 AUF FALL 32 ÄNDERN if (KeyReturn ==12) { //DATEN SENDEN, WEIL 12 DER SENDEN-KNOPF IST Verzögerung (100); für (int j =0; j LI-FI-Empfängercode V 2.0C/C++
LI-FI-Empfängercode V 2.0/*LI-FI-Empfängercode V 2.0 Geschrieben von HOUALEF AHMED RAMZI Gestartet am 29.09.2020 Letzte Aktualisierung am 14.10.2020*/#include#define SolarCell A0 // Um den Eingangspin der Solarzelle zu definieren StCursor =0; // Um das LCD zu steuern Cursorint 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}, SPACE[] ={1, 1, 1, 1, 1};const int rs =12, en =11, d4 =5, d5 =4, d6 =3, d7 =2;int Cell_Input; // Die Eingabe des Solar-Cellint Threshold;int info[5]; // Der empfangene DATALiquidCrystal lcd (rs, en, d4, d5, d6, d7);void setup () { PinMode (A0, INPUT); Serial.begin (9600); lcd.begin(16, 2); lcd.setCursor(0, 0); Schwellenwert =analogRead (SolarCell) + 10; lcd.print("BEREIT ZUM EMPFANGEN"); Verzögerung (5000); lcd.clear();}void BufferClear() { // Das Löschen des Puffers für (int i =0; i <5; i++) { info[i] =0; }}void check_condition(int receive_bits[5], int Binaryalpha[5], char Lcdalpha) {//Um die empfangenen Bits mit der Datenbank zu vergleichen if (received_bits[0] ==Binaryalpha[0] &&Received_bits[1] ==Binaryalpha[1] &&empfangene_bits[2] ==Binaryalpha[2] &&empfangene_bits[3] ==Binaryalpha[3] &&empfangene_bits[4] ==Binaryalpha[4]) { lcd.print (Lcdalpha); CursorControler(); }}void CursorControler() { // Um den Cursor zu steuern StCursor++; if (StCursor ==16) lcd.setCursor (0, 1);}void loop () { Cell_Input =analogRead (SolarCell); if (Cell_Input> Threshold) {// die Startbit-Erkennungsverzögerung (10); // Timing für (int i =0; i <5; i++) { // Daten speichern if (analogRead(SolarCell)> Threshold) { info[i] =1; aufrechtzuerhalten. Sonst {Info[i] =0; } Verzögerung(10); } check_condition(info, A, 'A'); check_condition(info, B, 'B'); check_condition(info, C, 'C'); check_condition(info, D, 'D'); check_condition(info, E, 'E'); check_condition(info, F, 'F'); check_condition(info, G, 'G'); check_condition(info, H, 'H'); check_condition(info, I, 'I'); check_condition(info, J, 'J'); check_condition(info, K, 'K'); check_condition(info, L, 'L'); check_condition(info, M, 'M'); check_condition(info, N, 'N'); check_condition(info, O, 'O'); check_condition(info, P, 'P'); check_condition(info, Q, 'Q'); check_condition(info, R, 'R'); check_condition(info, S, 'S'); check_condition(info, T, 'T'); check_condition(info, U, 'U'); check_condition(info, V, 'V'); check_condition(info, W, 'W'); check_condition(info, X, 'X'); check_condition(info, Y, 'Y'); check_condition(info, Z, 'Z'); check_condition(info, SPACE, ' '); BufferClear(); }}
Schaltpläne
die Fotozelle muss dem Laser gegenüberliegen, um Daten zu empfangenLCD:
VSS ---> Masse
VDD ---> Arduino 5V
K ---> Masse
A ---> Arduino 5V
RW ---> Masse
V0/VEE ---> Der Vout des Potentiometers
RS ---> Arduino digitaler Pin 12
DE ---> Arduino digitaler Pin 11
D4 ---> Arduino digitaler Pin 5
D5 ---> Arduino digitaler Pin 4
D6 ---> Arduino digitaler Pin 3
D7 ---> Arduino digitaler Pin 2
Solarzelle:
Die Minusleitung des SC ist mit Masse verbunden
Die positive Leitung des SC ist mit dem Arduino Analog Pin A0 . verbunden

LCD:
VSS ---> Masse
VDD ---> Arduino 5V
K ---> Masse
A ---> Arduino 5V
RW ---> Masse
V0/VEE ---> Der Vout des Potentiometers
RS ---> Arduino digitaler Pin 12
DE ---> Arduino digitaler Pin 11
D4 ---> Arduino digitaler Pin 6
D5 ---> Arduino digitaler Pin 5
D6 ---> Arduino digitaler Pin 4
D7 ---> Arduino digitaler Pin 3
TASTENFELD:
A ---> Arduino Analog Pin A2 // alle analogen Pins werden als digitale Pins verwendet
B ---> Arduino Analog-Pin A1
C ---> Arduino digitaler Pin 9
D ---> Arduino digitaler Pin 7
1 ---> Arduino digitaler Pin 8
2 ---> Arduino digitaler Pin 10
3 ---> Arduino Analog-Pin A3
PULL-DOWN-WIDERSTÄNDE:
Das erste Ende des Widerstands ist mit dem Digital-Pin 8 und das zweite mit der Masse verbunden
Das erste Ende des Widerstands ist mit dem Digital-Pin 10 und das zweite mit der Masse verbunden
das erste Ende des Widerstands ist mit dem analogen Pin A3 und das zweite mit der Masse verbunden
LASERDIODE:
Die Kathode der LD ist mit Masse verbunden
Die Anode des LD ist mit dem Arduino Digital Pin 2 . verbunden

Herstellungsprozess
- Leitfaden zur Laserbeschriftung mit Aluminium
- Leitfaden zur Laserbeschriftung
- Was ist Faserlasermarkierung?
- Laserpointer
- Halbleiterlaser
- Festkörperlaser
- DVD-Player
- Lasergelenkte Rakete
- Neuer elektrooptischer Laser emittiert 30 Milliarden Impulse pro Sekunde
- Die neue schnellste Glasfaser überträgt 1 Petabit/Sekunde