nanoFramework.AtomMatrix 1.1.232

前缀预留
dotnet add package nanoFramework.AtomMatrix --version 1.1.232                
NuGet\Install-Package nanoFramework.AtomMatrix -Version 1.1.232                
此命令旨在在 Visual Studio 的包管理器控制台中使用,因为它使用了 NuGet 模块的 Install-Package 版本。
<PackageReference Include="nanoFramework.AtomMatrix" Version="1.1.232" />                
对于支持 PackageReference 的项目,将此 XML 节点复制到项目文件中以引用此包。
paket add nanoFramework.AtomMatrix --version 1.1.232                
#r "nuget: nanoFramework.AtomMatrix, 1.1.232"                
#r 指令可用于 F# 交互和多种语言笔记本。将此复制到交互式工具或脚本的源代码中,以引用该包。
// Install nanoFramework.AtomMatrix as a Cake Addin
#addin nuget:?package=nanoFramework.AtomMatrix&version=1.1.232

// Install nanoFramework.AtomMatrix as a Cake Tool
#tool nuget:?package=nanoFramework.AtomMatrix&version=1.1.232                

Reliability Rating #yourfirstpr Discord

nanoFramework logo


欢迎使用 .NET nanoFramework M5Stack 库仓储

构建状态

组件 构建状态 NuGet 包
nanoFramework.M5Core Build Status NuGet
nanoFramework.M5Stick Build Status NuGet
nanoFramework.M5StickCPlus Build Status NuGet
nanoFramework.M5Core2 Build Status NuGet
nanoFramework.Fire Build Status NuGet
nanoFramework.AtomLite Build Status NuGet
nanoFramework.AtomMatrix Build Status NuGet
nanoFramework.Tough Build Status NuGet

用法

这些 NuGet 包为 M5Stack 产品提供支持

注意 1:在尝试将 NuGet 包添加到您的项目和/或在使用下一个部分中说明的设备上烧录之前(使用 MS Visual Studio [VS]),请打开 VS > 工具 > 选项 > NuGet 包管理器 > 包源,并确保其中包含一个指向 https://api.nuget.org/v3/index.json 的条目;如果没有,请添加。注意 2:在调用 VS > 项目 > 管理NuGet包时,请确保在包源下拉菜单(右上角)中选中 "nuget.org"。

这些NuGet包也支持屏幕,并且需要用正确的图像进行烧录(使用nanoff dotnet CLI)。下面示例中,将COM3替换成你设备连接的COM端口号(在Windows设备管理器中可以查看这个端口号)。

针对M5Core

nanoff --target M5Core --update --serialport COM3

针对M5StickC

nanoff --target M5StickC --update --serialport COM3 --baud 115200

针对M5StickCPlus

nanoff --target M5StickCPlus --update --serialport COM3

针对M5Core2、Tough和Fire

nanoff --target M5Core2 --update --serialport COM3

针对Atom Lite和Matrix

nanoff --target ESP32_PICO --update --serialport COM3

备注3:如果nanoff命令失败,请确保你已经遵循了上面第1个备注的说明。

一旦你有了NuGet包,你就可以享受访问屏幕、加速度计、接入Grove I2C接口、在按钮上添加事件的乐趣。你甚至不必费心思考,所有的事情都以最透明的方式为你完成!

备注4:所有你可以访问的类都使用懒汉模式进行实例化,包括屏幕。这优点是尽可能少使用内存和提高设置时间。

以下示例我们将使用M5Core或M5Stick作为例子,它们都按非常相似的方式工作。

命名空间

请确保你在C#程序头中添加适当的命名空间引用,例如:using nanoFramework;

屏幕

要访问屏幕,你只需要进行初始化(请注意InitializeScreen()是针对特定目标的)例如:

对于Core

M5Core.InitializeScreen();

对于StickCPlus

M5StickCPlus.InitializeScreen();

一旦你初始化了它,你可以访问Screen静态类和Console静态类。

Screen类提供了直接在屏幕点或块上写入基本图形的功能,以及写入文本。

例如,你可以这样在0,0位置写一个10x10的蓝色方块:

ushort[] toSend = new ushort[100];
ushort blue = ColorUtility.To16Bpp(Color.Blue);

for (int i = 0; i < toSend.Length; i++)
{
    toSend[i] = blue;
}

Screen.Write(0, 0, 10, 10, toSend);

Console类与经典System.Console工作方式类似。为了使用它,你必须使用方法的全限定名进行引用,如下所示

nanoFramework.Console.Clear();

// Test the console display
nanoFramework.Console.Write("This is a short text. ");
nanoFramework.Console.ForegroundColor = nanoFramework.Presentation.Media.Color.Red;
nanoFramework.Console.WriteLine("This one displays in red after the previous one and is already at the next line.");
nanoFramework.Console.BackgroundColor = nanoFramework.Presentation.Media.Color.Yellow;
nanoFramework.Console.ForegroundColor = nanoFramework.Presentation.Media.Color.RoyalBlue;
nanoFramework.Console.WriteLine("And this is blue on yellow background");
nanoFramework.Console.ResetColor();
nanoFramework.Console.CursorLeft = 0;
nanoFramework.Console.CursorTop = 8;
nanoFramework.Console.Write("This is white on black again and on 9th line");

备注:你还可以更改默认字体,你需要将其作为属性提供。光标位置是用最大的字符计算的。

M5Core2和Fire拥有PSRAM,因此你可以获得完整的屏幕缓存。请参考图形示例了解你能用它做什么。

如果你对任何M5Stack有大量的图形需求,你可以调整请求的内存。虽然M5Core2和Fire都有PSRAM,可以容纳非常大的容量,比如2Mb或更多,但那些没有PSRAM的不可能超过几个Kb或几十Kb。

// This will allocate 2 Mb of memory for the graphics
M5Core2.InitializeScreen(2 * 1024 * 1024);

按钮

除了电源按钮之外的主要按钮都是公开的。

在M5Stack和Fire中,它们称为ButtonLeftButtonCenterButtonRight。你还可以获取访问事件。例如

M5Stack.ButtonLeft.Press += (sender, e) =>
{
    Console.ForegroundColor = Color.Yellow;
    Console.CursorLeft = 0;
    Console.CursorTop = 0;
    Console.Write($"Left Pressed  ");
};

在M5StickC/CPlus中,它们称为ButtonM5ButtonRight。你可以获取访问按钮的状态、事件以及所有你需要的东西。例如

while (!M5StickC.ButtonRight.IsPressed)
{
    Thread.Sleep(10);
}

M5StickC.M5Button.IsHoldingEnabled = true;
M5StickC.M5Button.Holding += (sender, e) =>
{
    Console.Write("M5 button hold long.");
};

在Atom Lite/Matrix中,它被称为Button。你可以获取访问按钮的状态、事件以及所有你需要的东西。例如

AtomLite.Button.Press +=> (sender, e)
{
    var color = AtomLite.NeoPixel.GetColor();
    if(color.R > 0)
    {
        AtomLite.NeoPixel.SetColor(Color.FromArgb(255, 0, 255, 0));
    }
    else if (color.G > 0)
    {
        AtomLite.NeoPixel.SetColor(Color.FromArgb(255, 0, 0, 255));
    }
    else
    {
        AtomLite.NeoPixel.SetColor(Color.FromArgb(255, 255, 0, 0));
    }
};

备注:M5Core2具有触摸屏幕,按钮是“虚拟”的。查看下一节了解如何使用它们。

M5Core2触摸屏和按钮

触摸屏与屏幕一起提供。它们同时初始化和激活。要获取触摸事件,你需要注册到TouchEvent事件

M5Core2.InitializeScreen();
M5Core2.TouchEvent += TouchEventCallback;

以下是如何检查你是否在按钮上以及获取各种元素的示例

void TouchEventCallback(object sender, TouchEventArgs e)
{
    const string StrLB = "LEFT BUTTON PRESSED  ";
    const string StrMB = "MIDDLE BUTTON PRESSED  ";
    const string StrRB = "RIGHT BUTTON PRESSED  ";
    const string StrXY1 = "TOUCHED at X= ";
    const string StrXY2 = ",Y= ";
    const string StrID = ",Id= ";
    const string StrDoubleTouch = "Double touch. ";
    const string StrMove = "Moving... ";
    const string StrLiftUp = "Lift up. ";

    Debug.WriteLine($"Touch Panel Event Received Category= {e.EventCategory} Subcategory= {e.TouchEventCategory}");
    Console.CursorLeft = 0;
    Console.CursorTop = 0;

    Debug.WriteLine(StrXY1 + e.X + StrXY2 + e.Y + StrID + e.Id);
    Console.WriteLine(StrXY1 + e.X + StrXY2 + e.Y + StrID + e.Id + "  ");

    if ((e.TouchEventCategory & TouchEventCategory.LeftButton) == TouchEventCategory.LeftButton)
    {
        Debug.WriteLine(StrLB);
        Console.WriteLine(StrLB);
    }
    else if ((e.TouchEventCategory & TouchEventCategory.MiddleButton) == TouchEventCategory.MiddleButton)
    {
        Debug.WriteLine(StrMB);
        Console.WriteLine(StrMB);
    }
    else if ((e.TouchEventCategory & TouchEventCategory.RightButton) == TouchEventCategory.RightButton)
    {
        Debug.WriteLine(StrRB);
        Console.WriteLine(StrRB);
    }

    if ((e.TouchEventCategory & TouchEventCategory.Moving) == TouchEventCategory.Moving)
    {
        Debug.WriteLine(StrMove);
        Console.Write(StrMove);
    }

    if ((e.TouchEventCategory & TouchEventCategory.LiftUp) == TouchEventCategory.LiftUp)
    {
        Debug.WriteLine(StrLiftUp);
        Console.Write(StrLiftUp);
    }

    if ((e.TouchEventCategory & TouchEventCategory.DoubleTouch) == TouchEventCategory.DoubleTouch)
    {
        Debug.WriteLine(StrDoubleTouch);
        Console.Write(StrDoubleTouch);
    }

    Console.WriteLine("                                    ");
    Console.WriteLine("                                    ");
    Console.WriteLine("                                    ");
}

TouchEventCategory 枚举是一个标志,可以组合按钮和状态。按钮是互斥的,因此您只能有左、中或右按钮,状态有 MovingLiftUp。当接触已经发生且触摸点正在移动时,会发生 Moving。当接触释放时将出现 LiftUp

DoubleTouch 是一个专用标识,告知您存在另一个接触点。每个接触点都将接收此标志。事件将被触发两次,每个点一次。在双触控情况下,您可能无法获得第二个点的 LiftUp 事件,但您将获得 DoubleTouch 标志的消失和第一个点的最终 LiftUp 的变化。

电源管理

M5Core 和 M5StickC/CPlus 暴露了它们的电源管理元素。除非您知道自己在做什么,否则不建议更改任何默认值。

请参考 M5StickC/CPlus 中使用的 AXP192 的详细示例;M5Core2 和 IP5306 用于 M5Core 和 Fire。

加速度计和陀螺仪

您可以通过以下方式访问加速度计和陀螺仪:

var ag = M5Core.AccelerometerGyroscope;
// Do not move the M5Core/M5Stick during the calibration
ag.Calibrate(100);
var acc = ag.GetAccelerometer();
var gyr = ag.GetGyroscope();
Debug.WriteLine($"Accelerometer data x:{acc.X} y:{acc.Y} z:{acc.Z}");
Debug.WriteLine($"Gyroscope data x:{gyr.X} y:{gyr.Y} z:{gyr.Z}\n");

有关此传感器的更多详细使用信息,请参阅 MPU6886 文档

磁力计

M5Core 有一个磁力计,您也可以访问它。

var mag = M5Core.Magnetometer;
// It is more than strongly recommended to calibrate the magnetometer.
// Move the M5Core in all directions to have a proper calibration.
mag.CalibrateMagnetometer(100);
var magVal = mag.ReadMagnetometer();
Console.WriteLine($"x={magVal.X:N2}   ");
Console.WriteLine($"y={magVal.Y:N2}   ");
Console.WriteLine($"Z={magVal.Z:N2}   ");
var headDir = Math.Atan2(magVal.X, magVal.Y) * 180.0 / Math.PI;
Console.WriteLine($"h={headDir:N2}  ");

串口

M5Core 和 M5Core2 可以提供串口,只需这样获取即可:

// You can access any of the Serial Port feature
M5Core.SerialPort.Open(115200);
// Do anything else you need
M5Core.SerialPort.Close();

有关更多信息,请参阅 SerialPort 文档

ADC 通道

在 M5Core、M5Core2、Fire 和 Atom Lite/Matrix 上预先设置了 ADC 通道,可以这样访问它们:

// This will give you the ADC1 channel 7 which is on pin 35 of M5Core
AdcChannel myChannel = M5Core.GetAdcGpio(35);

请参阅 M5Stack 文档以获取 ADC 通道和引脚的映射。

I2C 设备/Grove

您可以通过以下方式获取 I2cDevice/Grove:

// In this example, the I2C address of the device is 0x42:
I2cDevice myDevice = M5Core.GetGrove(0x42);
// replacing GetGrove by GetI2cDevice will have the same impact

SPI 设备

M5Core、M5Core2、Fire 和 Atom Lite/Matrix 也提供 SpiDevice

// In this case GPIO5 will be used as chip select:
SpiDevice mySpi = M5Core.GetSpiDevice(5);

GPIO 控制器

与之前类似,您可以在 M5Core、M5Core2、Fire 和 M5StickC/CPlus 中的任何设备上获取 GpioController

// This will open the GPIO 36 as output
var pin5 = M5StickC.GpioController.OpenPin(36, PinMode.Output);

DAC

M5Core、M5Core2、Fire 和 Atom Lite/Matrix 暴露了 2 个 DAC,您可以通过 Dac1Dac2 属性来访问它们。有关更多信息,请参阅 DAC 文档

I2S(声音)

在 M5Core2 上,可以通过安装 nanoFramework.System.Device.I2s 包来使用 I2S 播放 wav 文件。要在 M5Core2 上播放 wav 文件,请使用以下初始化:

int bckPin = 12;
int dataPin = 2;
int wsPin = 0;
I2sWavPlayer.Bus bus = I2sWavPlayer.Bus.One;
var audioFile = "D:\\Variation-CLJ013901.wav";
using (var player = new I2sWavPlayer(bus, audioFile, bckPin, dataPin, wsPin))
{
    M5Core2.Power.Gpio2Value = PinValue.High; //speaker power on
    player.Play();
    M5Core2.Power.Gpio2Value = PinValue.Low; //speaker power off
}

LED

M5StickC/CPlus 暴露了一个 LED。您可以通过 Led 属性来访问它。

// This will toggle the led:
M5StickC.Led.Toggle();

红外 LED

M5StickC/CPlus 和 Atom Lite/Matrix 暴露了一个红外 LED。您可以通过 InfraredLed 属性来访问它。这将为您提供 TransmitterChannel。请查看 示例包 以了解如何使用它。

AtomLite 上的 NeoPixel

Atom Lite 暴露了一个 rgb LED。您可以通过 NeoPixel 属性来访问它。

// This will set NeoPixel to green:
AtomLite.NeoPixel.Image.SetPixel(0, 0, Color.Green);
AtomLite.NeoPixel.Update();

AtomMatrix 上的 RGB LED 矩阵和 Fire 上的 LED 条

Atom Matrix 有一个 25 个 RGB LED 的矩阵。数组中 LED 的位置按照矩阵中的放置位置进行排列,0 表示位于左上角的 LED,向左到右,向上到下增长。

您可以通过 AtomMatrix 上的 LedMatrix 属性来访问它,如下所示:

// This will set the RGB LED at position 2, 2 to green
AtomMatrix.LedMatrix.Image.SetPixel(2, 2, Color.Green);

类似地,您可以在 Fire 上通过 LedBar 属性访问它。

// This will set the second RGB LED to green
Fire.LedBar.Image.SetPixel(2, 0, Color.Green);

在更新了所有想要更改的 LED 之后,将更新刷新到 LED 上,如下所示:

// This will update all RGB LED 
AtomMatrix.LedMatrix.Update();

在 Fire 上:

// This will update all RGB LED 
Fire.LedBar.Update();

SD卡

M5Core、M5Core2、Fire和Tough都具有SD卡读卡器。您可以直接访问它,如下所示:

SDCard sdCard = M5Core.SDCard;
try
{
    // This will actually mount the SD Card, if no card, you will get an exception
    sdCard.Mount();
    // Mounting properly a card can take a bit of time, so wait for the card to be mounted
    // Note: it is recommended to use a cancellation token or equivalent to make sure you are not in a dead loop
    while (!sdCard.IsMounted)
    {
        Thread.Sleep(10);
    }

    // You can now access the files on the SD Card
    // As an example you can read a json file and deserialize it
    // D: is the drive from the SD Card
    const string ParamFile = "D:\\params.json";
    using FileStream fs = new FileStream(ParamFile, FileMode.Open, FileAccess.Read);
    // In this case, you will need to have a class called Configuration and a properly serialized file
    Configuration config = (Configuration)JsonConvert.DeserializeObject(fs, typeof(Configuration));
}
catch
{
    // Something wrong happened
}

有关如何使用文件系统的更多示例,请参阅这里

反馈和文档

有关文档编写、提供反馈、报告问题以及了解如何贡献,请参阅Home存储库

加入我们的Discord社区这里

致谢

关于此项目的贡献者名单可在CONTRIBUTORS中找到。

许可证

nanoFramework类库采用MIT许可证

行为准则

此项目采用了贡献者公约中定义的行为准则,以阐明我们社区中期望的行为。欲获取更多信息,请参阅.NET Foundation行为准则

.NET Foundation

本项⽬由.NET Foundation支持。

产品 兼容和额外的计算目标框架版本。
.NET Framework net是兼容的。
兼容的目标框架
包含的目标框架(在包中)
了解更多关于目标框架.NET Standard的信息。

NuGet包

此包不用于任何NuGet包。

GitHub存储库

此包不用于任何流行的GitHub存储库。

版本 下载 最后更新
1.1.232 28 7/31/2024
1.1.229 67 7/19/2024
1.1.228 63 7/17/2024
1.1.227 66 7/12/2024
1.1.225 84 6/28/2024
1.1.223 75 6/19/2024
1.1.220 76 5/31/2024
1.1.217 82 5/15/2024
1.1.215 83 5/10/2024
1.1.213 97 4/17/2024
1.1.211 96 4/15/2024
1.1.209 96 4/5/2024
1.1.207 86 3/27/2024
1.1.203 114 2/28/2024
1.1.201 110 1/31/2024
1.1.199 88 1/26/2024
1.1.197 86 1/24/2024
1.1.187 205 11/17/2023
1.1.185 109 11/14/2023
1.1.183 116 11/9/2023
1.1.180 112 11/8/2023
1.1.177 140 10/11/2023
1.1.175 134 9/29/2023
1.1.171 143 9/8/2023
1.1.169 140 9/6/2023
1.1.167 144 8/18/2023
1.1.163 151 8/2/2023
1.1.161 149 7/28/2023
1.1.157 155 7/19/2023
1.1.155 146 7/14/2023
1.1.152 150 6/21/2023
1.1.150 137 6/14/2023
1.1.148 150 6/7/2023
1.1.146 150 5/31/2023
1.1.144 149 5/24/2023
1.1.142 151 5/17/2023
1.1.139 163 5/11/2023
1.1.137 173 5/5/2023
1.1.135 211 4/5/2023
1.1.133 203 3/29/2023
1.1.131 231 3/24/2023
1.1.128 230 3/17/2023
1.1.125 231 3/16/2023
1.1.123 227 3/13/2023
1.1.121 238 3/9/2023
1.1.119 267 2/27/2023
1.1.117 238 2/27/2023
1.1.115 244 2/22/2023
1.1.113 258 2/20/2023
1.1.111 251 2/16/2023
1.1.106 322 1/10/2023
1.1.104 328 1/9/2023
1.1.102 293 1/6/2023
1.1.100 310 1/6/2023
1.1.98 331 1/5/2023
1.1.96 315 12/29/2022
1.1.90 339 11/15/2022
1.1.88 346 11/14/2022
1.1.86 365 11/5/2022
1.1.84 398 11/5/2022
1.1.82 367 11/4/2022
1.1.80 352 11/3/2022
1.1.78 370 11/1/2022
1.1.76 394 10/27/2022
1.1.70 417 10/13/2022
1.1.68 412 10/12/2022
1.1.64 372 10/7/2022
1.1.62 363 10/7/2022
1.1.58 453 9/23/2022
1.1.55 455 9/23/2022
1.1.53 427 9/22/2022
1.1.47 415 9/21/2022
1.1.45 428 9/16/2022
1.1.42 437 9/15/2022
1.1.40 439 9/8/2022
1.1.38 426 9/7/2022
1.1.36 438 9/3/2022
1.1.34 441 8/15/2022
1.1.32 443 8/6/2022
1.1.30 433 8/5/2022
1.1.28 434 8/4/2022
1.1.26 443 8/3/2022
1.1.24 418 8/3/2022
1.1.22 426 8/2/2022
1.1.20 441 7/30/2022
1.1.18 425 7/26/2022
1.1.16 437 7/24/2022
1.1.14 430 7/23/2022
1.1.12 465 7/13/2022
1.1.7 486 7/7/2022
1.1.5 461 7/7/2022
1.1.3 460 7/6/2022
1.1.1 440 7/5/2022
1.0.107.13280 445 7/1/2022
1.0.105.49254 462 6/30/2022
1.0.102.851 446 6/28/2022
1.0.100.17145 463 6/28/2022
1.0.98.48733 456 6/28/2022
1.0.96.40373 451 6/26/2022
1.0.92.59206 436 6/24/2022
1.0.90.38187 450 6/16/2022
1.0.88.50207 443 6/15/2022
1.0.86.52668 451 6/14/2022
1.0.83.14512 436 6/13/2022
1.0.81.41619 442 6/8/2022
1.0.79.53990 457 6/3/2022
1.0.77.26764 436 6/3/2022
1.0.75.37268 437 6/1/2022
1.0.72.43325 468 5/31/2022
1.0.70.15497 438 5/31/2022
1.0.68.55953 445 5/31/2022
1.0.66.24331 453 5/27/2022
1.0.64.6330 456 5/26/2022
1.0.62.28047 439 5/26/2022
1.0.60.49583 438 5/25/2022
1.0.58.20063 457 5/24/2022
1.0.56.35800 432 5/23/2022
1.0.54.60782 437 5/20/2022
1.0.51.48271 440 5/12/2022
1.0.49.30985 446 5/6/2022
1.0.46 457 5/5/2022
1.0.42 461 4/26/2022
1.0.40 438 4/25/2022
1.0.38 455 4/24/2022
1.0.36 454 4/23/2022
1.0.34 487 4/22/2022
1.0.32 459 4/22/2022
1.0.30 456 4/21/2022
1.0.26 457 4/21/2022
1.0.24 458 4/20/2022
1.0.22 453 4/19/2022
1.0.20 450 4/18/2022
1.0.18 436 4/17/2022
1.0.16 447 4/16/2022
1.0.14 448 4/15/2022
1.0.12 464 4/13/2022
1.0.10 467 4/6/2022
1.0.8 457 4/4/2022
1.0.6 463 4/3/2022
1.0.4 480 3/31/2022
1.0.2 130 3/31/2022
1.0.1-preview.68 122 3/30/2022
1.0.1-preview.67 127 3/25/2022
1.0.1-preview.66 120 3/25/2022
1.0.1-preview.65 117 3/25/2022
1.0.1-preview.64 114 3/23/2022
1.0.1-preview.63 106 3/22/2022
1.0.1-preview.62 107 3/21/2022
1.0.1-preview.61 122 3/20/2022
1.0.1-preview.60 123 3/19/2022
1.0.1-preview.58 126 3/16/2022
1.0.1-preview.57 130 3/16/2022
1.0.1-preview.56 121 3/14/2022
1.0.1-preview.55 126 3/14/2022
1.0.1-preview.54 115 3/11/2022
1.0.1-preview.53 114 3/9/2022
1.0.1-preview.52 123 3/8/2022
1.0.1-preview.51 115 3/7/2022
1.0.1-preview.50 115 3/4/2022
1.0.1-preview.49 129 3/3/2022
1.0.1-preview.48 117 2/27/2022
1.0.1-preview.47 117 2/26/2022
1.0.1-preview.46 124 2/25/2022
1.0.1-preview.45 126 2/18/2022
1.0.1-preview.43 120 2/16/2022
1.0.1-preview.42 131 2/12/2022
1.0.1-preview.41 120 2/10/2022
1.0.1-preview.40 123 2/9/2022
1.0.1-preview.39 127 2/8/2022
1.0.1-preview.38 133 2/6/2022
1.0.1-preview.37 128 2/5/2022
1.0.1-preview.36 135 2/4/2022
1.0.1-preview.35 125 2/3/2022