You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于ESP32的LiFi图像传输项目故障求助(含代码与报错信息)

基于ESP32的LiFi图像传输项目故障求助(含代码与报错信息)

各位好,我正在做一个基于ESP32的LiFi图像传输项目,用两块ESP32开发板:一块通过激光作为发射器,另一块用LDR(光敏电阻)做接收器。目前我写的Arduino代码和Python脚本都没能正常工作,还遇到了编码错误,想请大家帮忙看看问题出在哪。

我的实现流程与代码

1. Python 图像转Base64字符串代码

作用是把本地图片转换成Base64字符串,方便通过LiFi传输:

import base64
def image_to_base64(image_path):
 with open(image_path, "rb") as img_file:
 # Read the image file in binary mode
     img_data = img_file.read()
 # Encode the binary data as base64
 base64_data = base64.b64encode(img_data)
 # Decode bytes to string
 base64_string = base64_data.decode("utf-8")
 return base64_string
# Example usage
image_path = "blue.png" # Replace with your image file path
base64_string = image_to_base64(image_path)
print(base64_string) 

2. Arduino 发射端代码

负责把Base64字符串通过LED(激光)以比特流形式发送:

#define LED_PIN 22
// #define BUTTON_PIN A0
//const int LED_PIN = 2;
#define PERIOD 15
char *string ="/9j/1/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAOABEDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDzv4U6OPFd99mtWJu4iGaNI2YkbiCwD+nX0BZfbPonjz4OzeGdFjmnZbKWeWMwRTSCOWfqSFRnJYgZPC9AeleY/Bvxi/wq8ZDxRa2K3awxTSTWpfAkU5c4cg7W+RcNjjHIIyD+g3hr4AaP47tbP4t+Mtc1CbxH4n8GWuk3VtZOsGnWyytFcMYEKtID5igbnd+M8dAPwHNMBisuzb2lOXLGK5+nnePXTTe17Nddv1yXEcYYenGqtJKz031336Xv63sfBH/CCw/9BTVP+/En/wAVRXtP9hW/+x/37FFX/rtlP/Pyp9y/+RPX+pUv5fyP/9k=#";
int string_length;
void setup()
{
 pinMode(LED_PIN, OUTPUT);
  pinMode(3, INPUT);
  digitalWrite(3,LOW);
 string_length = strlen(string);
  delay(5000);
 if(digitalRead(3) == HIGH){
 for(int i = 0; i < string_length; i ++)
 {
 send_byte(string[i]);
 }
 delay(10);
 }
}
void loop()
{ 
}
void send_byte(char my_byte)
{
 digitalWrite(LED_PIN, LOW);
 delay(PERIOD);
 //transmission of bits
 for(int i = 0; i < 8; i++)
 {
 digitalWrite(LED_PIN, (my_byte&(0x01 << i))!=0 );
 delay(PERIOD);
 }
 digitalWrite(LED_PIN, HIGH);
 delay(PERIOD);
}

3. Arduino 接收端代码

通过LDR接收光信号,将其转换为比特流后还原成字符,再通过串口发送给Python程序:

#define LED_PIN 3 
#define LDR_PIN 34 
#define THRESHOLD 300
#define PERIOD 15 
bool previous_state,current_state; 
void setup() 
 {Serial.begin(9600); 
 pinMode(LED_PIN, OUTPUT);} 
void loop() 
 {current_state = get_ldr(); 
 if(!current_state && previous_state) 
 {print_byte(get_byte());} 
 previous_state = current_state;} 
bool get_ldr() 
 {int voltage = analogRead(LDR_PIN); 
 //Serial.println(voltage);
 return voltage > THRESHOLD ? true : false;} 
char get_byte() 
 {char ret = 0; 
 delay(PERIOD*1.5); 
 for(int i = 0; i < 8; i++){ 
 ret = ret | get_ldr() << i; 
 delay(PERIOD);} 
 return ret;} 
void print_byte(char my_byte) 
{char buff[2];
 sprintf(buff, "%c", my_byte);
 Serial.println(buff);}

4. Python 接收端代码

从串口读取Arduino接收端发来的字符,拼接成完整的Base64字符串后解码还原图像:

import serial 
import base64 
from io import BytesIO 
from PIL import Image 
import time 
import binascii
from serial import Serial
long_string = "" 
fixed_base64_str = "" 
ser = serial.Serial('COM5', 9600, timeout=15) 
ser.reset_input_buffer()
#time.sleep(2) 
while True: 
     if ser.in_waiting > 0: 
         data = ser.read().decode('utf-8')  
         long_string += data 
         print(data, end="") 
         if " " in long_string: 
            break
ser.close() 
long_string = long_string[:-1] 
print(f"\n\n{long_string}\n\n")
# Decode the image from the fixed base64 string 
image_bytes = base64.b64decode(fixed_base64_str) 
image = Image.open(BytesIO(image_bytes)) 
image.show() 

遇到的报错信息

运行Python接收端代码时,触发了以下Unicode解码错误:

Traceback (most recent call last):
  File "C:\Users\Yasmine\AppData\Local\Programs\Python\Python312\coderecep.py", line 15, in <module>
    data = ser.read().decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe3 in position 0: unexpected end of data

我尝试过的解决方法

我调整过LDR的阈值(在210到800之间),试图优化光信号的识别同步,但问题依然存在,传输还是失败。


备注:内容来源于stack exchange,提问作者Yasmina

火山引擎 最新活动