资料介绍
描述
(项目更新为RC-3(2023年3月30日发布)
这个项目是对我们令人敬畏的由草地驱动的快速原型制作板Project Lab的介绍。在本指南中,我们将向您展示如何将它与它自己的 NuGet 包一起使用,该包封装了所有外围设备的接线,让您可以立即专注于构建您的 IoT Meadow 解决方案。
在您开始这个项目之前,请确保您的 Meadow 板和开发环境是完全最新的。检查发行说明部分以仔细检查。
第 1 步 - 创建 Meadow 应用程序项目
在 Visual Studio 2022 for Windows或macOS中创建一个新的Meadow Application项目并将其命名为ProjLab_Demo 。
第 2 步 - 添加所需的 NuGet 包
对于这个项目,搜索并安装以下 NuGet 包:
第 3 步 - 编写 ProjLab_Demo 的代码
显示控制器.cs
复制下面的代码:
public class DisplayController
{
readonly MicroGraphics graphics;
public (Temperature? Temperature, RelativeHumidity? Humidity, Pressure? Pressure, Resistance? GasResistance)? AtmosphericConditions
{
get => atmosphericConditions;
set
{
atmosphericConditions = value;
Update();
}
}
(Temperature? Temperature, RelativeHumidity? Humidity, Pressure? Pressure, Resistance? GasResistance)? atmosphericConditions;
public Illuminance? LightConditions
{
get => lightConditions;
set
{
lightConditions = value;
Update();
}
}
Illuminance? lightConditions;
public (Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature) AccelerationConditions
{
get => accelerationConditions;
set
{
accelerationConditions = value;
Update();
}
}
(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature) accelerationConditions;
public bool UpButtonState
{
get => upButtonState;
set
{
upButtonState = value;
Update();
}
}
bool upButtonState = false;
public bool DownButtonState
{
get => downButtonState;
set
{
downButtonState = value;
Update();
}
}
bool downButtonState = false;
public bool LeftButtonState
{
get => leftButtonState;
set
{
leftButtonState = value;
Update();
}
}
bool leftButtonState = false;
public bool RightButtonState
{
get => rightButtonState;
set
{
rightButtonState = value;
Update();
}
}
bool rightButtonState = false;
bool isUpdating = false;
bool needsUpdate = false;
public DisplayController(IGraphicsDisplay display)
{
graphics = new MicroGraphics(display)
{
CurrentFont = new Font12x16()
};
graphics.Clear(true);
}
public void Update()
{
if (isUpdating)
{ //queue up the next update
needsUpdate = true;
return;
}
isUpdating = true;
graphics.Clear();
Draw();
graphics.Show();
isUpdating = false;
if (needsUpdate)
{
needsUpdate = false;
Update();
}
}
void DrawStatus(string label, string value, Color color, int yPosition)
{
graphics.DrawText(x: 2, y: yPosition, label, color: color);
graphics.DrawText(x: 238, y: yPosition, value, alignmentH: HorizontalAlignment.Right, color: color);
}
void Draw()
{
graphics.DrawText(x: 2, y: 0, "Hello PROJ LAB!", WildernessLabsColors.AzureBlue);
if (AtmosphericConditions is { } conditions)
{
if (conditions.Temperature is { } temp)
{
DrawStatus("Temperature:", $"{temp.Celsius:N1}C", WildernessLabsColors.GalleryWhite, 35);
}
if (conditions.Pressure is { } pressure)
{
DrawStatus("Pressure:", $"{pressure.StandardAtmosphere:N1}atm", WildernessLabsColors.GalleryWhite, 55);
}
if (conditions.Humidity is { } humidity)
{
DrawStatus("Humidity:", $"{humidity.Percent:N1}%", WildernessLabsColors.GalleryWhite, 75);
}
}
if (LightConditions is { } light)
{
DrawStatus("Lux:", $"{light:N0}Lux", WildernessLabsColors.GalleryWhite, 95);
}
if (AccelerationConditions is { } acceleration)
{
if (acceleration.Acceleration3D is { } accel3D)
{
DrawStatus("Accel:", $"{accel3D.X.Gravity:0.#},{accel3D.Y.Gravity:0.#},{accel3D.Z.Gravity:0.#}g", WildernessLabsColors.AzureBlue, 115);
}
if (acceleration.AngularVelocity3D is { } angular3D)
{
DrawStatus("Gyro:", $"{angular3D.X:0},{angular3D.Y:0},{angular3D.Z:0}rpm", WildernessLabsColors.AzureBlue, 135);
}
}
DrawStatus("Left:", $"{(LeftButtonState ? "pressed" : "released")}", WildernessLabsColors.ChileanFire, 200);
DrawStatus("Down:", $"{(DownButtonState ? "pressed" : "released")}", WildernessLabsColors.ChileanFire, 180);
DrawStatus("Up:", $"{(UpButtonState ? "pressed" : "released")}", WildernessLabsColors.ChileanFire, 160);
DrawStatus("Right:", $"{(RightButtonState ? "pressed" : "released")}", WildernessLabsColors.ChileanFire, 220);
}
}
此类的目的是控制来自 Project Lab 板载外围设备的信息并将其显示到其 240x240 显示器中,使用MicroGraphics
. 我们有以下属性:
-
AtmosphericConditions
- 该元组存储BME688大气传感器返回的值,能够测量温度、湿度、压力和气体阻力。 -
LightConditions
- 存储来自BH1750光传感器的照度值。 -
AccelerationConditions
- 另一个存储BMI270传感器给出的 3D 加速度、3D 角速度甚至温度的元组。 -
UpButtonState
- 存储向上按钮状态的布尔值。 -
DownButtonState
- 存储向下按钮状态的布尔值。 -
LeftButtonState
- 存储左键状态的布尔值。 -
RightButtonState
- 存储右按钮状态的布尔值。
请注意,在所有这些属性的设置器中,它将调用Update()
将运行逻辑以使用MicroGraphics 更新显示器上的值的方法。
MeadowApp.cs
复制下面的代码:
// Change F7FeatherV2 to F7FeatherV1 for V1.x boards
public class MeadowApp : App
{
DisplayController displayController;
RgbPwmLed onboardLed;
IProjectLabHardware projLab;
public override Task Initialize()
{
Resolver.Log.Loglevel = Meadow.Logging.LogLevel.Trace;
Resolver.Log.Info("Initialize hardware...");
//==== RGB LED
Resolver.Log.Info("Initializing onboard RGB LED");
onboardLed = new RgbPwmLed(
redPwmPin: Device.Pins.OnboardLedRed,
greenPwmPin: Device.Pins.OnboardLedGreen,
bluePwmPin: Device.Pins.OnboardLedBlue,
CommonType.CommonAnode);
Resolver.Log.Info("RGB LED up");
//==== instantiate the project lab hardware
projLab = ProjectLab.Create();
Resolver.Log.Info($"Running on ProjectLab Hardware {projLab.RevisionString}");
//---- display controller (handles display updates)
if (projLab.Display is { } display)
{
Resolver.Log.Trace("Creating DisplayController");
displayController = new DisplayController(display);
Resolver.Log.Trace("DisplayController up");
}
//---- BH1750 Light Sensor
if (projLab.LightSensor is { } bh1750)
{
bh1750.Updated += Bh1750Updated;
}
//---- BME688 Atmospheric sensor
if (projLab.EnvironmentalSensor is { } bme688)
{
bme688.Updated += Bme688Updated;
}
//---- BMI270 Accel/IMU
if (projLab.MotionSensor is { } bmi270)
{
bmi270.Updated += Bmi270Updated;
}
//---- buttons
if (projLab.RightButton is { } rightButton)
{
rightButton.PressStarted += (s, e) => displayController.RightButtonState = true;
rightButton.PressEnded += (s, e) => displayController.RightButtonState = false;
}
if (projLab.DownButton is { } downButton)
{
downButton.PressStarted += (s, e) => displayController.DownButtonState = true;
downButton.PressEnded += (s, e) => displayController.DownButtonState = false;
}
if (projLab.LeftButton is { } leftButton)
{
leftButton.PressStarted += (s, e) => displayController.LeftButtonState = true;
leftButton.PressEnded += (s, e) => displayController.LeftButtonState = false;
}
if (projLab.UpButton is { } upButton)
{
upButton.PressStarted += (s, e) => displayController.UpButtonState = true;
upButton.PressEnded += (s, e) => displayController.UpButtonState = false;
}
//---- heartbeat
onboardLed.StartPulse(WildernessLabsColors.PearGreen);
Resolver.Log.Info("Initialization complete");
return base.Initialize();
}
public override Task Run()
{
Resolver.Log.Info("Run...");
//---- BH1750 Light Sensor
if (projLab.LightSensor is { } bh1750)
{
bh1750.StartUpdating(TimeSpan.FromSeconds(5));
}
//---- BME688 Atmospheric sensor
if (projLab.EnvironmentalSensor is { } bme688)
{
bme688.StartUpdating(TimeSpan.FromSeconds(5));
}
//---- BMI270 Accel/IMU
if (projLab.MotionSensor is { } bmi270)
{
bmi270.StartUpdating(TimeSpan.FromSeconds(5));
}
if (displayController != null)
{
displayController.Update();
}
Resolver.Log.Info("starting blink");
onboardLed.StartBlink(WildernessLabsColors.PearGreen, TimeSpan.FromMilliseconds(500), TimeSpan.FromMilliseconds(2000), 0.5f);
return base.Run();
}
private void Bmi270Updated(object sender, IChangeResult<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)> e)
{
Resolver.Log.Info($"BMI270: {e.New.Acceleration3D.Value.X.Gravity:0.0},{e.New.Acceleration3D.Value.Y.Gravity:0.0},{e.New.Acceleration3D.Value.Z.Gravity:0.0}g");
if (displayController != null)
{
displayController.AccelerationConditions = e.New;
}
}
private void Bme688Updated(object sender, IChangeResult<(Temperature? Temperature, RelativeHumidity? Humidity, Pressure? Pressure, Resistance? GasResistance)> e)
{
Resolver.Log.Info($"BME688: {(int)e.New.Temperature?.Celsius}C - {(int)e.New.Humidity?.Percent}% - {(int)e.New.Pressure?.Millibar}mbar");
if (displayController != null)
{
displayController.AtmosphericConditions = e.New;
}
}
private void Bh1750Updated(object sender, IChangeResult e)
{
Resolver.Log.Info($"BH1750: {e.New.Lux}");
if (displayController != null)
{
displayController.LightConditions = e.New;
}
}
}
在我们的主类中,主要需要考虑的是:
-
在
Initialize()
方法中,我们在做的时候先创建了一个ProjectLab对象(命名为projLab )ProjectLab.Create()
,它方便的封装了它板载的所有外设,所以我们只关注使用它们而不是在每个项目上实例化它上面的每个组件。 -
在访问外设之前,我们首先检查它是否可用,如果可用,我们就可以使用它。比如 ,
if (projLab.Display is { } display)
表示如果Display
的属性projLab
不为null,则其对象赋值给display
,我们可以将其作为参数传给我们的DisplayController
类。 -
对于环境、光线和运动传感器,我们将它们连接到它们各自的事件,这些事件每 5 秒触发一次(在此处
Updated
详细了解我们如何使用传感器)。 -
对于按钮,我们在每个按钮上连接
PressStarted
和PressEnded
事件,并将状态分配给 上显示的相应属性DisplayController
,因此当您按下任何按钮时,它们将立即在显示屏上更新。 -
在最后一个
Run()
方法中,我们调用Update()
该DisplayController
对象以显示初始 UI 以及所有具有当前值的外围设备,并使 Meadow 的板载 LED 闪烁为绿色。
第 5 步 - 运行项目
单击Visual Studio中的“运行”按钮。它应该类似于以下 GIF:
查看 Meadow.Foundation!
就您可以使用 Meadow.Foundation 做的大量令人兴奋的事情而言,这个项目只是冰山一角。
- 它带有一个庞大的外设驱动程序库,其中包含适用于最常见传感器和外设的驱动程序。
- 外设驱动程序封装了核心逻辑并公开了一个简单、干净、现代的 API。
- 该项目得到了不断发展的社区的支持,该社区不断致力于构建酷炫的互联事物,并且总是乐于帮助新来者和讨论新项目。
参考
- 食品检测实验室建设参考案例下载 0次下载
- 基于Proteus的单片机虚拟仿真网络实验室 45次下载
- 物联网实验室管理系统的设计方案 17次下载
- EMC实验室的建设设计方案
- TI电机控制教材InstaSPIN项目和实验室用户指南 37次下载
- 将无线传感器网络应用于生物实验室的设计方案说明 13次下载
- 高压实验室报警控制回路图解 16次下载
- 电磁兼容实验室需要的仪器 34次下载
- EMC实验室的建设 16次下载
- 高温电子实验室--实验设备简介
- 现场总线CAN-bus 实验室
- 虚拟电子实验室的设计与应用
- 基于LabWindows的实验室管理系统设计
- 实验室管理体制及管理制度
- 模型动力电学实验室2.0
- 实验室超声波清洗机的正确使用方法 154次阅读
- 基于STM32单片机的实验室智能安防系统 512次阅读
- 超声波清洗设备的实验室应用 865次阅读
- 实验室电源电路原理图 1919次阅读
- 如何建立移动校准实验室 2358次阅读
- 如何在家建立电子实验室? 1671次阅读
- Python版实验室设备管理系统源代码 1982次阅读
- 高性能电驱动系统NVH实验室工艺设计 2107次阅读
- 如何建立一个电磁兼容实验室 3125次阅读
- digilent适便携式电路实验室介绍 2367次阅读
- 环境实验室的作用及进行检测的具体方法 5574次阅读
- 开放实验室:测量LCR及阻抗特性 5859次阅读
- 是德开放实验室:免费为企业进行低功耗测试 5685次阅读
- PCB线路板化学实验室 1260次阅读
- 泰尔实验室:HSPA关键技术解析 1464次阅读
下载排行
本周
- 1使用单片机实现七人表决器的程序和仿真资料免费下载
- 2.96 MB | 44次下载 | 免费
- 2联想E46L DAOLL6笔记本电脑图纸
- 1.10 MB | 2次下载 | 5 积分
- 3MATLAB绘图合集
- 27.12 MB | 2次下载 | 5 积分
- 4PR735,使用UCC28060的600W交错式PFC转换器
- 540.03KB | 1次下载 | 免费
- 5UCC38C42 30W同步降压转换器参考设计
- 428.07KB | 1次下载 | 免费
- 6DV2004S1/ES1/HS1快速充电开发系统
- 2.08MB | 1次下载 | 免费
- 7模态分解合集matlab代码
- 3.03 MB | 1次下载 | 2 积分
- 8美的电磁炉维修手册大全
- 1.56 MB | 1次下载 | 5 积分
本月
- 1使用单片机实现七人表决器的程序和仿真资料免费下载
- 2.96 MB | 44次下载 | 免费
- 2UC3842/3/4/5电源管理芯片中文手册
- 1.75 MB | 15次下载 | 免费
- 3DMT0660数字万用表产品说明书
- 0.70 MB | 13次下载 | 免费
- 4TPS54202H降压转换器评估模块用户指南
- 1.02MB | 8次下载 | 免费
- 5STM32F101x8/STM32F101xB手册
- 1.69 MB | 8次下载 | 1 积分
- 6HY12P65/HY12P66数字万用表芯片规格书
- 0.69 MB | 6次下载 | 免费
- 7华瑞昇CR216芯片数字万用表规格书附原理图及校正流程方法
- 0.74 MB | 6次下载 | 3 积分
- 8华瑞昇CR215芯片数字万用表原理图
- 0.21 MB | 5次下载 | 3 积分
总榜
- 1matlab软件下载入口
- 未知 | 935119次下载 | 10 积分
- 2开源硬件-PMP21529.1-4 开关降压/升压双向直流/直流转换器 PCB layout 设计
- 1.48MB | 420061次下载 | 10 积分
- 3Altium DXP2002下载入口
- 未知 | 233084次下载 | 10 积分
- 4电路仿真软件multisim 10.0免费下载
- 340992 | 191367次下载 | 10 积分
- 5十天学会AVR单片机与C语言视频教程 下载
- 158M | 183335次下载 | 10 积分
- 6labview8.5下载
- 未知 | 81581次下载 | 10 积分
- 7Keil工具MDK-Arm免费下载
- 0.02 MB | 73807次下载 | 10 积分
- 8LabVIEW 8.6下载
- 未知 | 65987次下载 | 10 积分
评论
查看更多