本程序在某宝的店铺产品基础上淘宝店铺利用arduino实现可见光通讯,两个led灯相对放置,通过灯的闪烁完成信号的传输,具体程序如下:
- 发送端程序
unsigned int txbuffer[9] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'};//要发送的字符
#define LED 3//定义发送端引脚
void setup()//设置
{
Serial.begin(9600);
pinMode(LED, OUTPUT); //引脚为下拉输出
digitalWrite(LED, LOW);
}
void loop()
{
LEDstart();//开始信号
for (int i = 0; i < 8; i++)
LEDsend(txbuffer[i]);//循环发送8个字符
LEDover();//结束信号
}
void LEDstart()//开始信号函数
{
digitalWrite(LED, HIGH);//拉高
delay(1000);
delay(1000);
delay(1000);//延时3秒
digitalWrite(LED, LOW);//拉低
Serial.println("START");//串口打印开始信息
}
unsigned int temp, flag;
void LEDsend(unsigned int a)//发送函数
{
temp = a;//要发送的值
Serial.print("send---");
Serial.println(temp, HEX);//要发送值得16进制
Serial.print("temp(HEX)");
for (int n = 0; n < 8; n++)//对发送值进行编码,16进制展开,从左到右判断是否为1
{
flag = (temp & 0x80) >> 7;//取最高位
Serial.print(flag);
Serial.print("");
if (flag)//如果最高位为1,则高电平时间为800
{
digitalWrite(LED, HIGH);
delayMicroseconds(800);
digitalWrite(LED, LOW);
delayMicroseconds(400);
}
else//如果最高位为0,则高电平时间为400
{
digitalWrite(LED, HIGH);
delayMicroseconds(400);
digitalWrite(LED, LOW);
delayMicroseconds(800);
}
temp = temp << 1;//左移一位
}
Serial.println(" ");
}
void LEDover()//结束函数
{
digitalWrite(LED, HIGH);
Serial.println("OVER");
}
- 接收端程序
#define LED 3//定义引脚为3
void setup()
{
Serial.begin(9600);
pinMode(LED, INPUT);//配置引脚为下拉输入
digitalWrite(LED, LOW);
}
void loop()
{
LEDread();//读取函数
}
unsigned int LED_us = 0;
unsigned int flag = 0, num = 0;
unsigned int rxBuf[] = {0, 1, 1, 0, 0, 0, 0, 1}, m = 0;
void LEDread()//读取3引脚高电平时间,并进行解码
{
LED_us = pulseIn(LED, HIGH);//高电平时间
Serial.print("LED_us-");
Serial.print(LED_us);
if (LED_us < 450 && LED_us > 350)//在此范围内该位为0
{
flag = 0;
}
else if (LED_us < 850 && LED_us > 750)//在此范围内该位为1
{
flag = 1;
}
else//距离不佳,调整距离
{
//Serial.println("Please change the distance");
}
Serial.print(" ");
Serial.print("flag-");
Serial.print(flag);
Serial.print(" ");
rxBuf[num] = flag;//把值存入rxBuf
num++;//计数标志为加1
LED_us = 0;
if (num == 8)//如果到了8位,即可组成一个数据
{
for (int i = 0; i < 8; i++)
{
if (rxBuf[i])
{
m += (1 << (7 - i));
}
}
num = 0;
Serial.println(" ");
Serial.print("RX(HEX)");
Serial.println(m & 0xff, HEX);
m = 0;
}
}