基于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




