Wirlesseレーザーデータ伝送(LIFI)(100b /秒)
コンポーネントと消耗品
> ![]() |
| × | 2 | |||
![]() |
| × | 2 | |||
![]() |
| × | 2 | |||
![]() |
| × | 30 | |||
| × | 1 | ||||
![]() |
| × | 2 | |||
![]() |
| × | 2 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 2 | |||
![]() |
| × | 3 |
必要なツールとマシン
> ![]() |
| |||
![]() |
|
アプリとオンラインサービス
> ![]() |
|
このプロジェクトについて
<図>


このプロジェクトは、エミッターとレシーバーの2つの部分で構成されており、キーパッドとLCDを使用してレーザーを介してテキストを送信するために使用できます
コード
- LI-FI送信機コードV2.0
- LI-FIレシーバーコードV2.0
LI-FI送信機コードV2.0 C / C ++
LI-FI送信機コードV2.0/ * LI-FI送信機コードV2.0作成者HOUALEFAHMEDRAMZI開始日:2020年9月29日最終更新日:2020年10月14日* /#defineLaserPin 2#includeconst int rs =12、en =11、d4 =6、d5 =5、d6 =4、d7 =3; LiquidCrystal lcd(rs、en、d4、d5、d6、d7); intcomingchar; int KeyPad_R [ ] ={A2、A1、9、7}; // KeyPad rowsint KeyPad_C [] ={8、10、A3}; // KeyPad Columnsint KeyReturn =0; // 1〜12intABCからのキーパッド関数の出力; // 1つのbuttonint行を使用して3文字をコーディングするために使用される変数; //キーパッドfunctionint列で使用される変数; //キーパッドfunctionintで使用される変数StCursor =0; //カーソルコントロールの変数intNdCursor =0; //カーソルコントロールの変数intoutcomingmatrix [32] [5]; // DATA Bufferint m =0; //すべての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}、スペース[] ={1、1、1、1、1}; //すべてのコード化された文字を格納するための小さなデータベースvoidsetup(){lcd.begin(16、2); pinMode(LaserPin、OUTPUT); 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"); delay(5000); lcd.clear(); lcd.setCursor(0,0);} void conv(int alpha [5]、char Char){//データベースからの出力バッファを埋めるfor(int i =0; i <5; i ++){outcomingmatrix [ m] [i] =alpha [i]; } lcd.print(Char);} void start_bit(){//スタートビットdigitalWrite(LaserPin、HIGH); delay(9); digitalWrite(LaserPin、LOW);} void KeyPad(){// 1から12まで押されたボタンの数を出力しますfor(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;列=j; digitalWrite(KeyPad_R [i]、LOW); if(Row ==0){switch(Column){case 0:KeyReturn =1;壊す;ケース1:KeyReturn =2;壊す;ケース2:KeyReturn =3;壊す; }} if(Row ==1){switch(Column){case 0:KeyReturn =4;壊す;ケース1:KeyReturn =5;壊す;ケース2:KeyReturn =6;壊す; }} if(Row ==2){switch(Column){case 0:KeyReturn =7;壊す;ケース1:KeyReturn =8;壊す;ケース2:KeyReturn =9;壊す; }} if(Row ==3){switch(Column){case 0:KeyReturn =10;壊す;ケース1:KeyReturn =11;壊す;ケース2:KeyReturn =12;壊す; }}}}} Serial.println(KeyReturn);} void KeyToAscii(int KeyN、int FirtAsciiValue){//キーパッドからASCII値にデータを変換して、上記のCONV関数を使用して両方のシリアルを使用する方法モニターとキーパッドif(KeyReturn ==KeyN){incomingchar =FirtAsciiValue + ABC; ABC ++; if(ABC ==3){ABC =0; }}} void CursorControler(){lcd.setCursor(StCursor、NdCursor); if(KeyReturn ==10){//確認ボタンの11が原因で文字を確認するdelay(100); StCursor ++; m ++; } if(StCursor ==16){//最初の行がいっぱいになったときに改行を書き込むStCursor =0; NdCursor =1; }} void loop(){KeyPad(); delay(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){ケース65:conv(A、 'A');壊す;ケース66:conv(B、 'B');壊す;ケース67:conv(C、 'C');壊す;ケース68:conv(D、 'D');壊す;ケース69:conv(E、 'E');壊す;ケース70:conv(F、 'F');壊す;ケース71:conv(G、 'G');壊す;ケース72:conv(H、 'H');壊す;ケース73:conv(I、 'I');壊す;ケース74:conv(J、 'J');壊す;ケース75:conv(K、 'K');壊す;ケース76:conv(L、 'L');壊す;ケース77:conv(M、 'M');壊す;ケース78:conv(N、 'N');壊す;ケース79:conv(O、 'O');壊す;ケース80:conv(P、 'P');壊す;ケース81:conv(Q、 'Q');壊す;ケース82:conv(R、 'R');壊す;ケース83:conv(S、 'S');壊す;ケース84:conv(T、 'T');壊す;ケース85:conv(U、 'U');壊す;ケース86:conv(V、 'V');壊す;ケース87:conv(W、 'W');壊す;ケース88:conv(X、 'X');壊す;ケース89:conv(Y、 'Y');壊す;ケース90:conv(Z、 'Z');壊す;ケース32:conv(SPACE、 '');壊す;ケース33:conv(SPACE、 '');壊す; } //シリアルモニターのスペースを使用するには、ケース91をケース32に変更する必要がありますif(KeyReturn ==12){// 12が送信ボタンであるためデータを送信するdelay(100); for(int j =0; j LI-FIレシーバーコードV2.0 C / C ++
LI-FIレシーバーコードV2.0/ * LI-FIレシーバーコードV2.0作成者HOUALEFAHMEDRAMZI開始日:2020年9月29日最終更新日:2020年10月14日* /#include#define SolarCell A0 //ソーラーセルの入力ピンを定義するにはStCursor =0; // lcdを制御するにはCursorintA [] ={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; //ソーラーセルイントしきい値の入力; intinfo [5]; //受信したDATALiquidCrystallcd(rs、en、d4、d5、d6、d7); void setup(){pinMode(A0、INPUT); Serial.begin(9600); lcd.begin(16、2); lcd.setCursor(0、0);しきい値=analogRead(SolarCell)+ 10; lcd.print( "受信準備完了"); delay(5000); lcd.clear();} void BufferClear(){//(int i =0; i <5; i ++){info [i] =0;のバッファをクリアします}} void check_condition(int receive_bits [5]、int Binaryalpha [5]、char Lcdalpha){//受信したビットをデータベースと比較するif(received_bits [0] ==Binaryalpha [0] &&receive_bits [1] ==Binaryalpha [1] &&receive_bits [2] ==Binaryalpha [2] &&receive_bits [3] ==Binaryalpha [3] &&receive_bits [4] ==Binaryalpha [4]){lcd.print(Lcdalpha); CursorControler(); }} void CursorControler(){//カーソルを制御するにはStCursor ++; if(StCursor ==16)lcd.setCursor(0、1);} void loop(){Cell_Input =analogRead(SolarCell); if(Cell_Input> Threshold){//スタートビット検出delay(10); //(int i =0; i <5; i ++)のタイミング{//データを保存if(analogRead(SolarCell)> Threshold){info [i] =1; } else {info [i] =0; } delay(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(); }}
回路図
データを受信するには、フォトセルをレーザーと向かい合わせに配置する必要があります LCD:
VSS --->グラウンド
VDD ---> Arduino 5V
K --->地面
A ---> Arduino 5V
RW --->グラウンド
V0 / VEE --->ポテンショメータのVout
RS ---> Arduinoデジタルピン12
EN ---> Arduinoデジタルピン11
D4 ---> Arduinoデジタルピン5
D5 ---> Arduinoデジタルピン4
D6 ---> Arduinoデジタルピン3
D7 ---> Arduinoデジタルピン2
太陽電池:
SCのマイナスリードはアースに接続されています
SCのプラスのリード線はArduinoアナログピンA0に接続されています

LCD:
VSS --->グラウンド
VDD ---> Arduino 5V
K --->地面
A ---> Arduino 5V
RW --->グラウンド
V0 / VEE --->ポテンショメータのVout
RS ---> Arduinoデジタルピン12
EN ---> Arduinoデジタルピン11
D4 ---> Arduinoデジタルピン6
D5 ---> Arduinoデジタルピン5
D6 ---> Arduinoデジタルピン4
D7 ---> Arduinoデジタルピン3
キーパッド:
A ---> ArduinoアナログピンA2 //すべてのアナログピンはデジタルピンとして使用されます
B ---> ArduinoアナログピンA1
C ---> Arduinoデジタルピン9
D ---> Arduinoデジタルピン7
1 ---> Arduinoデジタルピン8
2 ---> Arduinoデジタルピン10
3 ---> ArduinoアナログピンA3
プルダウン抵抗:
抵抗の最初の端はデジタルピン8に接続され、2番目の端はグランドに接続されています
抵抗の最初の端はデジタルピン10に接続され、2番目の端はグランドに接続されています
抵抗の最初の端はアナログピンA3に接続され、2番目の端はグランドに接続されています
レーザーダイオード:
LDの陰極は地面に接続されています
LDのアノードはArduinoデジタルピン2に接続されています

製造プロセス