本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

基于Arduino手机传感器应用
发布时间:2021-08-30
分享到:
基于Arduino手机传感器应用
发布时间:2021-08-30
分享到:

在构建项目时,传感器是至关重要的东西之一。智能手机内置了大多数基本传感器,如接近度、加速度计、光、磁力计、陀螺仪等,我们实际上可以在我们的 Arduino 项目中使用这些传感器。

所以在这个项目中,我将向您展示这些传感器是如何使用的,并且可以通过有线连接与 Arduino 通信。

零件清单:

  • Arduino
  • USB 电缆(B 型)
  • OTG线
  • OLED 显示模块

第 1 步:设置串行通信

Arduino 和 android 之间的串行通信与计算机和 Arduino 之间的串行通信相同。发送方逐位发送数据,接收方逐位接收。

串行通讯

  • 登录 MIT 应用程序发明者并开始一个新项目
  • 要建立串行连接,我们需要从连接选项卡中包含串行,拖放该项目
  • 确保 buad 速率与用于在 Arduino 中初始化串行的 buad 速率相同
  • 导入两个按钮并连接和断开与 Arduino 的连接以及一个用于直观表示设备已连接的复选框。(您可以重命名组件并更改文本)
  • 添加另外两个按钮来打开和关闭 LED
  • 让我们在块面板中进行块编码,我们发现与各种组件相关的各种事件
  • 放置每个按钮的点击事件
  • 当按下连接按钮时,它将初始化串行连接并打开一个串行连接,如果它成功打开,它将选中复选框
  • 当按下断开按钮时,它关闭串行通信并取消选中复选框
  • 现在,只要按下 on 按钮,它就会发送一个代表 1 的数据字节,只有在串行通信打开时才会打开
  • 按下关闭时也会发生同样的情况,但将发送 0 而不是 1,指示 LED 应关闭
  • 这就是设计的全部
  • 现在保存项目
  • 通过二维码或从构建选项卡下载我们的应用程序的 apk 文件
  • 在您的手机上下载该应用程序并使用 apk 安装该应用程序
  • 手机可能会说该应用程序的来源可能会损害您的手机,但无论如何安装它都是安全的

Arduino代码

  • 首先,我们声明一个变量来存储 LED 状态,然后在设置中初始化串行通信并将引脚 13 定义为输出,因为我们将使用内置 LED
  • 然后在循环中,我们检查手机是否发送了任何数据,如果是,则等待大约 400 毫秒以使事情稳定下来
  • 然后解析传入的数据——它做什么检查是否有任何 int 类型数据可用,并等待大约 1000 毫秒来检查是有更多数据到来——这是在内部完成的
  • 并存储在变量中
  • 并根据变量的内容设置led的状态

int ledState = 0;

void setup()
{
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}

void loop()
{
  if (Serial.available() > 0)
  {
    delay(400);
    ledState = Serial.parseInt();
    digitalWrite(13, ledState);
  }
}

硬件连接

  • 首先使用 OTG 电缆将 Arduino 连接到手机
  • 然后打开我们的应用程序
  • 然后按连接,会弹出一条消息,说是否允许我们访问 USB 设备
  • 再次按连接以实际连接到 Arduino - 应选中该复选框
  • 按下按钮和UNO的内置LED应亮起,按下后应熄灭

第 2 步:接近传感器

该传感器位于前置摄像头附近,用于检测传感器附近是否有物体。这种传感器的应用是当一个人将手机靠近耳朵说话时,它会检测并关闭屏幕,这样屏幕在被任何身体部位触摸时不会接受任何不必要的输入通常,该传感器的输出高低取决于物体是否在附近,所以我们可以使用接近传感器使 LED 闪烁应用

  • 包括按钮和复选框以建立串行通信
  • 还包括接近传感器形式的传感器选项卡
  • 取消选中接近传感器的启用复选框,这样当应用程序第一次运行时传感器不会产生输出
  • 接近传感器有一个事件,根据物体是否在附近输出高或低
  • 每当接近传感器的值发生变化时,我们都会发送 0 或 1 来指示变化
  • 此外,还包含一个滑动开关来启用传感器,否则它会在我们不想要的时候不断发送数据
  • 滑动开关有一个事件,如果开关打开或未打开,则返回 true

Arduino代码

  • 这里使用的代码与我们收到 1 和 0 并打开和关闭 LED 时闪烁相同

第 3 步:光传感器

该传感器检测落在屏幕上的光量。这用于改变屏幕的亮度,环境光落在屏幕上越多,屏幕的亮度应该越大,屏幕上的光越少,亮度越低,这有助于用户在任何条件下都没有任何问题。

传感器的输出以勒克斯为单位,这是光的亮度单位。

我们使用的事件是在每次传感器上的光强度发生变化时触发的事件,因此每次落在传感器上的光强度发生变化时都会触发事件,我们会将测量的光强度发送到 Arduino 以将其显示在 oled 上展示。

要考虑的其他参数是传感器更新其值的频率,对于某些可能长达 1000 毫秒,而对于某些可能小至 1 毫秒。我们通过一个特定的函数来检查这一点。

此外,一些 android 设备可以灵活地降低或增加此采样率,这也可以做到。

应用

  • 包括连接、断开连接按钮和用于串行通信的复选框
  • 包括一个滑动开关,以便传感器仅在我们需要时发送数据
  • 还包括一个标签,以便我们了解传感器检测到的值和 Arduino 选择的值是否相同
  • 我们已经完成了设计
  • 接下来包括我们之前包括的串行连接的相同块,对应于连接和断开按钮
  • 接下来包括一个事件 .LightChanged 块,它在传感器生成的值发生变化时发生
  • 在这个块中,我们首先检查串口是否打开,如果是,则发送此时测量的勒克斯值
  • 包括与滑动开关 Slide.Changed 对应的事件,当滑动处于 on 位置时返回 true
  • 并下载应用程序

Arduino代码

  • 首先我们需要初始化各种参数来设置oled显示器
  • 现在,如果您没有 oled 显示器,您可以随时使用不同的显示器
  • 在 setup 函数中,我们设置了一些 oled 参数,如文本大小、颜色和光标位置
  • 在循环部分,我们检查是否有任何数据传入
  • 如果是,我们将首先将数据解析为浮点数
  • 解析后,我们将传递给 oled 来显示

void loop() {

    if (Serial.available() > 0)  {
    delay(400);
    data = Serial.parseFloat();
    display.clearDisplay();
    display.setCursor(0, 0);
    display.print("Intensity = ");
    display.print(data);
    display.print(" Lx");
    display.display();
  }
}

硬件
使用跳线和面包板将 oled 显示器连接到 Arduino
oled 显示器的引脚 => Arduino 引脚(这些连接用于 Arduino uno)

VCC => 5V

GND => GND

SCL => A5

SDA => A4

  • 现在使用 otg 电缆将手机连接到 android
  • 启动应用程序并通过按下连接按钮初始化连接,然后切换滑动开关
  • 尝试在前置摄像头周围挥手,这是传感器所在的位置
  • 更改值应出现在 oled 显示屏上以及应用程序中的滑动开关下方

第 4 步:加速度传感器

该传感器用于确定手机的方向。广泛用于游戏和其他互动应用。

它测量沿 x、y 和 z 3 轴的加速度。考虑的单位是 SI 单位,即 ms^-2。值的范围是 -9.8 到 +9.8。

xAccel:手机静止在平面上时为0,手机向右倾斜(即左侧抬起)时为正,手机向左倾斜时为负(即其右侧尺寸为提高)。

yAccel:手机静止在平面上时为0,底部抬起时为正,顶部抬起时为负。

zAccel:等于-9.8(设备静止时与地面平行且显示器朝上时的地球重力,以米/秒为单位,垂直于地面时为0,面朝下时为+9.8。该值也可以是受重力或反重力加速的影响。

我们感兴趣的事件是acceleration.Changed,当传感器测量到与之前测量不同的值时触发。

要将值传递给 Arduino,我们不会使用它,但会使用计时器事件,该事件是在每个指定时间过后触发的元素。

加速度计的采样率非常高,因此如果我们在测量到的值与以前不同时发送数据,将会发生的情况是应用程序将尝试发送新数据,而不管 Arduino 是否接收到以前的数据,因此我们是要发送的定时器数据。

因此,我们将包含一个计时器,它以毫秒为单位在每个指定时间滴答滴答,当它滴答滴答时,我们将通过串行发送数据。

应用

  • 包括连接、断开按钮和复选框以初始化串行通信。
  • 还包括一个滑块开关,用于启用和禁用加速度计以及计时器。
  • 然后使用布局选项卡中可用的水平排列放置 6 个标签,其中 2 个彼此相邻。
  • 还包括一个滑块,我们将使用它来设置计时器滴答周期。
  • 分别保持滑块 1 和 1000 的最小值和最大值,这样我们就不需要映射它们,因为计时器的时间将从 1 到 1000 毫秒。
  • 在块编码中添加用于连接和断开连接的事件。
  • 对于滑动开关,它与光传感器相同,当滑动开关处于打开位置并启用加速度计和计时器时,函数返回真。
  • 加速度计会自动更新自身,因此需要特殊事件。
  • 滑块更改事件将计时器间隔设置为拇指的位置。
  • 当计时器滴答时,它会通过串行向 Arduino 发送沿 x、y、z 的加速度,并根据串行是否打开来更新标签。

Arduino代码

  • 我们解析 3 次以读取 3 个轴值并使用某种格式打印它们。
  • 由于我们已经解析了这些值,因此它们现在被视为浮点数,因此我们现在可以直接在其他应用程序中使用它们。

void loop(){
  if (Serial.available() > 0)
  {
    delay(400);
    data1 = Serial.parseFloat();
    data2 = Serial.parseFloat();
    data3 = Serial.parseFloat();

    display.clearDisplay();
    display.setCursor(0, 0);
    display.print("x-axis : ");
    display.print(data1);
    display.println(" m/s^2");
    display.print("y-axis : ");
    display.print(data2);
    display.println(" m/s^2");

    display.print("z-axis : ");
    display.print(data3);
    display.println(" m/s^2");

    display.display();
  }
}

第 5 步:陀螺仪

该传感器沿 x、y 和 z 三个轴测量旋转速度。测量单位是度每秒。

应用

  • 包括连接、断开连接按钮和复选框来操作串行通信。
  • 还包括一个滑动开关来启用和禁用陀螺仪以及计时器。
  • 包括 6 个标签,每个标签水平排列 2 个。
  • 包括一个滑块来更改计时器的滴答时间。
  • 在块编码中添加用于连接和断开连接的事件。
  • 对于滑动开关,当开关处于打开位置时返回 true 的函数,然后启用陀螺仪。
  • 当计时器滴答时,它会将值从陀螺仪发送到 Arduino 并更新标签。
  • 滑块会根据其拇指位置更改滴答时间。

Arduino代码

  • 该代码解析 3 次并使用 OLED 显示值。

void loop(){
  if (Serial.available() > 0)
  {
    delay(400);

    data1 = Serial.parseFloat();
    data2 = Serial.parseFloat();
    data3 = Serial.parseFloat();

    display.clearDisplay();
    display.setCursor(0, 0);

    display.print("x-axis : ");
    display.print(data1);
    display.println(" deg/s");
    display.print("y-axis : ");
    display.print(data2);
    display.println(" deg/s");
    display.print("z-axis : ");
    display.print(data3);
    display.println(" deg/s");

    display.display();
  }
}

第 6 步:磁力计

该传感器以特斯拉为单位测量沿三个轴的磁场值。

主要用于数字罗盘以显示方向。安装在手机中的传感器足够灵敏,可以测量地磁强度,但我们也可以使用家用磁铁(冰箱磁铁)。

应用

  • 包括用于串行通信的连接和断开连接按钮和复选框。
  • 包括滑动开关以启用和禁用磁力计和计时器。
  • 用于更改计时器滴答时间的滑块。
  • 在块编码中添加连接和断开连接事件。
  • 添加 switch.Changed 事件,如果开关打开,则启用传感器或禁用传感器。
  • 包括将测量值从传感器发送到 Arduino 并更新标签的计时器事件。

Arduino代码

  • 该代码解析浮点数据并以某种格式显示。

void loop(){
  if (Serial.available() > 0)
  {
    delay(400);

    data1 = Serial.parseFloat();
    data2 = Serial.parseFloat();
    data3 = Serial.parseFloat();

    display.clearDisplay();
    display.setCursor(0, 0);

    display.print("x-axis : ");
    display.print(data1);
    display.println(" T");
    display.print("y-axis : ");
    display.print(data2);
    display.println(" T");
    display.print("z-axis : ");
    display.print(data3);
    display.println(" T");

    display.display();
  }
}

 

希望您能够喜欢这个项目!

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论