nanoFramework.Tough 1.1.232

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

// Install nanoFramework.Tough as a Cake Tool
#tool nuget:?package=nanoFramework.Tough&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:您将访问的所有类都使用Lazy模式进行实例化,包括屏幕。这具有尽可能减少内存和设置时间的好处。

以下示例将使用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并且可以容纳非常大的量,如2 Mb或更多,但是没有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();

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

ADC 通道

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

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

有关 ADC 通道和引脚的映射,请参阅 M5Stack 文档。

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
}

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

反馈和文档

有关文档、提供反馈、报告问题和了解如何贡献,请参阅主仓库

加入我们的Discord社区这里

感谢

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

许可证

nanoFramework类库的使用许可采用MIT许可证

行为准则

本项目采用了贡献者誓言定义的行为准则,以明确我们社区中预期的行为。更多信息请参阅.NET基金会行为准则

.NET基金会

本项目得到.NET基金会的支持。

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

NuGet包

此包不用于任何NuGet包。

GitHub仓库

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

版本 下载 最后更新
1.1.232 42 7/31/2024
1.1.229 75 7/19/2024
1.1.228 52 7/17/2024
1.1.227 59 7/12/2024
1.1.225 92 6/28/2024
1.1.223 88 6/19/2024
1.1.220 86 5/31/2024
1.1.217 103 5/15/2024
1.1.215 99 5/10/2024
1.1.213 94 4/17/2024
1.1.211 88 4/15/2024
1.1.209 92 4/5/2024
1.1.207 106 3/27/2024
1.1.203 100 2/28/2024
1.1.201 103 1/31/2024
1.1.199 87 1/26/2024
1.1.197 93 1/24/2024
1.1.187 183 11/17/2023
1.1.185 74 11/14/2023
1.1.183 83 11/9/2023
1.1.180 87 11/8/2023
1.1.177 115 10/11/2023
1.1.175 112 9/29/2023
1.1.171 128 9/8/2023
1.1.169 118 9/6/2023
1.1.167 124 8/18/2023
1.1.163 145 8/2/2023
1.1.161 122 7/28/2023
1.1.157 135 7/19/2023
1.1.155 128 7/14/2023
1.1.152 127 6/21/2023
1.1.150 116 6/14/2023
1.1.148 134 6/7/2023
1.1.146 124 5/31/2023
1.1.144 121 5/24/2023
1.1.142 135 5/17/2023
1.1.139 137 5/11/2023
1.1.137 145 5/5/2023
1.1.135 204 4/5/2023
1.1.133 198 3/29/2023
1.1.131 187 3/24/2023
1.1.128 216 3/17/2023
1.1.125 200 3/16/2023
1.1.123 200 3/13/2023
1.1.121 200 3/9/2023
1.1.119 248 2/27/2023
1.1.117 246 2/27/2023
1.1.115 225 2/22/2023
1.1.113 238 2/20/2023
1.1.111 225 2/16/2023
1.1.106 282 1/10/2023
1.1.104 294 1/9/2023
1.1.102 287 1/6/2023
1.1.100 284 1/6/2023
1.1.98 290 1/5/2023
1.1.96 290 12/29/2022
1.1.90 329 11/15/2022
1.1.88 321 11/14/2022
1.1.86 336 11/5/2022
1.1.84 364 11/5/2022
1.1.82 339 11/4/2022
1.1.80 332 11/3/2022
1.1.78 330 11/1/2022
1.1.76 362 10/27/2022
1.1.70 399 10/13/2022
1.1.68 390 10/12/2022
1.1.64 396 10/7/2022
1.1.62 386 10/7/2022
1.1.58 446 9/23/2022
1.1.55 433 9/23/2022
1.1.53 413 9/22/2022
1.1.47 404 9/21/2022
1.1.45 426 9/16/2022
1.1.42 412 9/15/2022
1.1.40 413 9/8/2022
1.1.38 394 9/7/2022
1.1.36 394 9/3/2022
1.1.34 415 8/15/2022
1.1.32 421 8/6/2022
1.1.30 407 8/5/2022
1.1.28 413 8/4/2022
1.1.26 421 8/3/2022
1.1.24 410 8/3/2022
1.1.22 412 8/2/2022
1.1.20 441 7/30/2022
1.1.18 415 7/26/2022
1.1.16 418 7/24/2022
1.1.14 422 7/23/2022
1.1.12 442 7/13/2022
1.1.7 455 7/7/2022
1.1.5 457 7/7/2022
1.1.3 447 7/6/2022
1.1.1 438 7/5/2022
1.0.107.13280 437 7/1/2022
1.0.105.49254 459 6/30/2022
1.0.102.851 425 6/28/2022
1.0.100.17145 416 6/28/2022
1.0.98.48733 426 6/28/2022
1.0.96.40373 426 6/26/2022
1.0.92.59206 418 6/24/2022
1.0.90.38187 419 6/16/2022
1.0.88.50207 414 6/15/2022
1.0.86.52668 420 6/14/2022
1.0.83.14512 441 6/13/2022
1.0.81.41619 421 6/8/2022
1.0.79.53990 430 6/3/2022
1.0.77.26764 420 6/3/2022
1.0.75.37268 420 6/1/2022
1.0.72.43325 430 5/31/2022