如何在 UWP 项目中通过 I2C 连接到 Arduino 的 Raspberry Pi IoT 打开和关闭 LED?

阿尔伯兹

我有一个 Arduino Uno 和一个带有 Windows IoT Core 的 Raspberry Pi 3。我尝试使用这种方法将一些信息传递给我的 Arduino,比如告诉它启动一个 pin 或获取和解析一个字符串。这种方法非常适合从 Arduino 获取信息(如传感器参数)。

我能够向 Arduino 发送一个字节并根据发送的字节在我的 Arduino 代码中执行操作(如获取数字 2 时的 init pin 7)。但它只能工作一次。我必须重置 Arduino,以便它再次接受来自 Raspberry Pi 的字节(我可以打开从我的 Raspberry Pi 连接到 Arduino 的 LED,但无法将其关闭。反之亦然。

我的目标是在 Raspberry Pi 中创建一个用于控制事物的网站。但首先我使用的是 UWP。我正在尝试将数据从在 Raspberry Pi 3 上运行的 IoT Core 传递到 Arduino Uno(不是相反)或通过 I2C 连接管理和控制 Arduino Uno 引脚。

我的 MainPage.xaml:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using Windows.Devices.I2c;
using System.Threading.Tasks;
// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409

namespace I2CComm {
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class MainPage : Page {
        private I2cDevice arduio; // Used to Connect to Arduino
        private DispatcherTimer timer = new DispatcherTimer();
        public MainPage() {
            this.InitializeComponent();
            Initialiasecom();
        }
        public async void Initialiasecom() {
            var settings = new I2cConnectionSettings(0x40);
            // Slave Address of Arduino Uno
            settings.BusSpeed = I2cBusSpeed.FastMode;
            // this bus has 400Khz speed
            string aqs =  I2cDevice.GetDeviceSelector("I2C1");
            // This will return Advanced Query String which is used to select i2c device
            var dis = await Windows.Devices.Enumeration.DeviceInformation.FindAllAsync(aqs);
            arduio = await I2cDevice.FromIdAsync(dis[0].Id, settings);
            timer.Tick += Timer_Tick;
            // We will create an event handler
            timer.Interval = new TimeSpan(0,0,0,0,500);
            // Timer_Tick is executed every 500 milli second
            timer.Start();
        }

        private async void Timer_Tick(object sender, object e) {
            byte[] response = new byte[2];
            try {
                arduio.Read(response);
                // this function will read data from Arduino
            }
            catch (Exception p) {
                Windows.UI.Popups.MessageDialog msg = new Windows.UI.Popups.MessageDialog(p.Message);
                await msg.ShowAsync();
                // this will show error message(if any)
            }
        }

        private void TurnOn_Click(object sender, RoutedEventArgs e) {
            try {
                byte[] sendpos;
                sendpos = BitConverter.GetBytes(2);
                arduio.Write(sendpos);
            }
            catch (Exception p) {
                Windows.UI.Popups.MessageDialog msg = new Windows.UI.Popups.MessageDialog(p.Message);
            }
        }

        private void TurnOff_Click(object sender, RoutedEventArgs e) {
            try {
                byte[] sendpos;
                sendpos = BitConverter.GetBytes(1);
                arduio.Write(sendpos);
            }
            catch (Exception p) {
                Windows.UI.Popups.MessageDialog msg = new Windows.UI.Popups.MessageDialog(p.Message);
            }
        }
    }
}

我的 Arduino 代码是:

#include <Wire.h>
// Library that contains functions to have I2C Communication
#define SLAVE_ADDRESS 0x40
// Define the I2C address to Communicate to Uno

byte response[2]; // this data is sent to PI
volatile short LDR_value; // Global Declaration
const int LDR_pin=A0; //pin to which LDR is connected A0 is analog A0 pin
const int ledPin = 7;

void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
  Wire.begin(SLAVE_ADDRESS);
  // this will begin I2C Connection with 0x40 address
  Wire.onRequest(sendData);
  // sendData is a function called when Pi requests data
  Wire.onReceive(I2CReceived);
  pinMode(LDR_pin,INPUT);
  digitalWrite(ledPin, HIGH);
}

void loop() {
  delay(500);
}

void I2CReceived(int NumberOfBytes) {
  /* WinIoT have sent data byte; read it */
  byte ReceivedData = Wire.read();
  Serial.println(ReceivedData);
  if (ReceivedData == 2) {
    digitalWrite(ledPin, HIGH);
    return;
  } else if (ReceivedData == 1) {
    digitalWrite(ledPin, LOW);
    return;
  }
}

void sendData() {
  LDR_value=analogRead(LDR_pin);
  // Arduino returns 10-bit data but we need to convert it to 8 bits
  LDR_value=map(LDR_value,0,1023,0,255);
  response[0]=(byte)LDR_value;
  Wire.write(response,2); // return data to PI
}
韩丽塔

Raspberry Pi 发送 4 个字节(2是 Int)而不是 1 个字节。您需要接收 Arduino 中的所有字节。你可以这样做:

void I2CReceived(int NumberOfBytes) {
  /* WinIoT have sent data byte; read it */
  byte ReceivedData = Wire.read();
  Serial.println(ReceivedData);

  while (0 < Wire.available()) {
    byte UselessData = Wire.read();
    Serial.println(UselessData);
  }

  if (ReceivedData == 2) {
    digitalWrite(ledPin, HIGH);
    return;
  } else if (ReceivedData == 1) {
    digitalWrite(ledPin, LOW);
    return;
  }  
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

IoT 使用 Google Cloud Service IoT 解决方案 (Weave):如何连接 Raspberry Pi 并点亮 LED?

Raspberry Pi未通过USB连接到Arduino

是否可以将Raspberry Pi 3上的Windows 10 IoT UWP C#应用程序连接到蓝牙耳机?

如何在决策条件下使用对象检测边界框来使用C ++ OpenCV打开Raspberry Pi上的LED?

如何通过 SSH 从一个 Raspberry PI 连接到在 VirtualBox 中运行的 Raspberry PI

在Arduino和RPi IOT C#之间通过I2C发送JSON字符串

Raspberry pi 和 arduino 通过 USB 串行连接显示 USB 信息

如何在具有Windows 10 IoT核心版的Raspberry Pi2上以编程方式关闭/打开显示器

无法通过SSH连接到Raspberry Pi

如何通过蓝牙在Raspberry Pi 4和Arduino Nano BLE之间执行读写操作?

如何在Ubuntu Core Raspberry Pi 3中连接到WPA2企业WiFi

Raspberry Pi上的Windows IOT Python / UWP交互

Raspberry Pi,Grove,Windows IoT,C#

使用I2C Windows Iot和Arduino写入数据

如何将Arduino Uno连接到Azure IoT Central

如何通过静态本地IP远程SSH连接到我的Raspberry Pi?

Windows IoT Raspberry Pi上的ASP.NET MVC无法连接到SQL数据库

Raspberry PI Arduino通讯

使用i2c,python和raspberry pi读取14位数据

在 Ubuntu 20.04 Raspberry Pi 上启用 SPI 和 I2C

Raspberry Pi中继和Python,如何在单独的功能中关闭和打开中继?

带有Raspberry Pi和Bluemix的IoT Python应用程序:无法使用按钮打开/关闭灯和发送消息

Google IOT Core和Raspberry Pi:错误:拒绝连接:用户名或密码错误

如何使用 Windows 10 IoT (UWP) 为 Raspberry Pi 3 创建可移植代码(.net 标准 2.0)?

Raspberry Pi - 更多 GPIO 引脚或/和更多 LED

如何在Raspberry PI 4中打开和关闭USB端口电源

IBM IoT Raspberry Pi连接被拒绝未授权

使用UWP连接到Arduino

Raspberry Pi2 Windows 10 IOT核心和Visual Basic 2015

TOP 榜单

热门标签

归档