arduino led灯通讯

这篇博客详细介绍了如何使用Arduino在淘宝店铺中通过可见光实现LED灯的闪烁通信,涉及发送端和接收端程序设计,展示了字符发送、编码与解码的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本程序在某宝的店铺产品基础上淘宝店铺利用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;
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Spgroc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值