0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

怎样在C#中检测手势并控制IoT

454398 来源:wv 2019-10-13 17:24 次阅读

步骤1:您需要的内容:

怎样在C#中检测手势并控制IoT

硬件

LattePanda(您可以

屏幕和触摸面板

软件

Arduino IDE

Visual Studio

步骤2:演示1:检测鼠标位置并单击事件

让我们执行项目步骤一步一步首先,请尝试检测是否按下了鼠标。因此,我们可以根据间隔来检测双击和三次单击。

这是一个简单的Windows Form应用程序。文本框将显示鼠标的X轴和Y轴。 您可以在PC上播放此演示。

操作方法播放演示1:

运行.exe并移动鼠标,软件将自动检测鼠标的位置。如果按下鼠标左键,文本框将显示该事件。

您可以在下面查看代码或在此处下载演示。如果要自己制作此演示,则需要在此处下载Visual Studio。 Open.sln文件,然后可以将其设置为自己的文件。

演示1代码:

using System;

using System.Drawing;

using System.Windows.Forms;

using System.Runtime.InteropServices;

namespace Demo_mousehook_csdn

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

MouseHook mh;

private void Form1_Load(object sender, EventArgs e)

{

mh = new MouseHook();

mh.SetHook();

mh.MouseMoveEvent += mh_MouseMoveEvent;

mh.MouseClickEvent += mh_MouseClickEvent;

mh.MouseDownEvent += mh_MouseDownEvent;

mh.MouseUpEvent += mh_MouseUpEvent;

}

private void mh_MouseDownEvent(object sender, MouseEventArgs e)

{

if (e.Button == MouseButtons.Left)

{

richTextBox1.AppendText(“Left Button Press ”);

}

if (e.Button == MouseButtons.Right)

{

richTextBox1.AppendText(“Right Button Press ”);

}

}

private void mh_MouseUpEvent(object sender, MouseEventArgs e)

{

if (e.Button == MouseButtons.Left)

{

richTextBox1.AppendText(“Left Button Release ”);

}

if (e.Button == MouseButtons.Right)

{

richTextBox1.AppendText(“Right Button Release ”);

}

}

private void mh_MouseClickEvent(object sender, MouseEventArgs e)

{

//MessageBox.Show(e.X + “-” + e.Y);

if (e.Button == MouseButtons.Left)

{

string sText = “(” + e.X.ToString() + “,” + e.Y.ToString() + “)”;

label1.Text = sText;

}

}

private void mh_MouseMoveEvent(object sender, MouseEventArgs e)

{

int x = e.Location.X;

int y = e.Location.Y;

textBox1.Text = x + “”;

textBox2.Text = y + “”;

}

private void Form1_FormClosed(object sender, FormClosedEventArgs e)

{

mh.UnHook();

}

private void Form1_FormClosed_1(object sender, FormClosedEventArgs e)

{

mh.UnHook();

}

private void richTextBox1_TextChanged(object sender, EventArgs e)

{

}

}

public class Win32Api

{

[StructLayout(LayoutKind.Sequential)]

public class POINT

{

public int x;

public int y;

}

[StructLayout(LayoutKind.Sequential)]

public class MouseHookStruct

{

public POINT pt;

public int hwnd;

public int wHitTestCode;

public int dwExtraInfo;

}

public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);

[DllImport(“user32.dll”, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]

public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);

[DllImport(“user32.dll”, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]

public static extern bool UnhookWindowsHookEx(int idHook);

[DllImport(“user32.dll”, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]

public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);

}

public class MouseHook

{

private Point point;

private Point Point

{

get { return point; }

set

{

if (point != value)

{

point = value;

if (MouseMoveEvent != null)

{

var e = new MouseEventArgs(MouseButtons.None, 0, point.X, point.Y, 0);

MouseMoveEvent(this, e);

}

}

}

}

private int hHook;

private const int WM_MOUSEMOVE = 0x200;

private const int WM_LBUTTONDOWN = 0x201;

private const int WM_RBUTTONDOWN = 0x204;

private const int WM_MBUTTONDOWN = 0x207;

private const int WM_LBUTTONUP = 0x202;

private const int WM_RBUTTONUP = 0x205;

private const int WM_MBUTTONUP = 0x208;

private const int WM_LBUTTONDBLCLK = 0x203;

private const int WM_RBUTTONDBLCLK = 0x206;

private const int WM_MBUTTONDBLCLK = 0x209;

public const int WH_MOUSE_LL = 14;

public Win32Api.HookProc hProc;

public MouseHook()

{

this.Point = new Point();

}

public int SetHook()

{

hProc = new Win32Api.HookProc(MouseHookProc);

hHook = Win32Api.SetWindowsHookEx(WH_MOUSE_LL, hProc, IntPtr.Zero, 0);

return hHook;

}

public void UnHook()

{

Win32Api.UnhookWindowsHookEx(hHook);

}

private int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam)

{

Win32Api.MouseHookStruct MyMouseHookStruct = (Win32Api.MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(Win32Api.MouseHookStruct));

if (nCode 《 0)

{

return Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam);

}

else

{

if (MouseClickEvent != null)

{

MouseButtons button = MouseButtons.None;

int clickCount = 0;

switch ((Int32)wParam)

{

case WM_LBUTTONDOWN:

button = MouseButtons.Left;

clickCount = 1;

MouseDownEvent(this, new MouseEventArgs(button, clickCount, point.X, point.Y, 0));

break;

case WM_RBUTTONDOWN:

button = MouseButtons.Right;

clickCount = 1;

MouseDownEvent(this, new MouseEventArgs(button, clickCount, point.X, point.Y, 0));

break;

case WM_MBUTTONDOWN:

button = MouseButtons.Middle;

clickCount = 1;

MouseDownEvent(this, new MouseEventArgs(button, clickCount, point.X, point.Y, 0));

break;

case WM_LBUTTONUP:

button = MouseButtons.Left;

clickCount = 1;

MouseUpEvent(this, new MouseEventArgs(button, clickCount, point.X, point.Y, 0));

break;

case WM_RBUTTONUP:

button = MouseButtons.Right;

clickCount = 1;

MouseUpEvent(this, new MouseEventArgs(button, clickCount, point.X, point.Y, 0));

break;

case WM_MBUTTONUP:

button = MouseButtons.Middle;

clickCount = 1;

MouseUpEvent(this, new MouseEventArgs(button, clickCount, point.X, point.Y, 0));

break;

}

var e = new MouseEventArgs(button, clickCount, point.X, point.Y, 0);

MouseClickEvent(this, e);

}

this.Point = new Point(MyMouseHookStruct.pt.x, MyMouseHookStruct.pt.y);

return Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam);

}

}

public delegate void MouseMoveHandler(object sender, MouseEventArgs e);

public event MouseMoveHandler MouseMoveEvent;

public delegate void MouseClickHandler(object sender, MouseEventArgs e);

public event MouseClickHandler MouseClickEvent;

public delegate void MouseDownHandler(object sender, MouseEventArgs e);

public event MouseDownHandler MouseDownEvent;

public delegate void MouseUpHandler(object sender, MouseEventArgs e);

public event MouseUpHandler MouseUpEvent;

}

}

如果有任何疑问,请让我知道!

步骤3:演示2:检测双击并控制LED

请参见上图。为了防止错误触发,我在屏幕区域的右1/5处设置了检测鼠标双击的功能。

在此演示中,您将知道如何检测双击(只需计算两次单击的间隔)并通过Arduino Leonardo控制LED。

此演示涉及C#和Arduino串行通信(PC与Arduino之间的通信)。如果您想了解这部分知识,请参见此处的教程

如何播放演示2:

双击右侧1/5侧面屏幕上的,然后您将进入GPIO控制模式,LED将会点亮。单击屏幕左侧的4/5侧,LED将关闭。

您可以在附件中查看代码或在此处下载演示。如果最小化窗口,则该功能仍然有效。很酷,不是吗?

演示2代码:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Runtime.InteropServices;

using System.Globalization;

using LattePanda.Firmata;

namespace Demo_mousehook_csdn

{

public partial class Form1 : Form

{

static Arduino arduino = new Arduino();

static DateTime localDate = DateTime.Now;

double click_time;

int click_count = 0;

bool tri_click_flag = false;

public Form1()

{

InitializeComponent();

arduino.pinMode(13, Arduino.OUTPUT);//

}

MouseHook mh;

private void Form1_Load(object sender, EventArgs e)

{

mh = new MouseHook();

mh.SetHook();

mh.MouseMoveEvent += mh_MouseMoveEvent;

mh.MouseClickEvent += mh_MouseClickEvent;

}

private void mh_MouseClickEvent(object sender, MouseEventArgs e)

{

//MessageBox.Show(e.X + “-” + e.Y);

if (e.Button == MouseButtons.Left)

{

string sText = “(” + e.X.ToString() + “,” + e.Y.ToString() + “)”;

label1.Text = sText;

click_time = (DateTime.Now - localDate).TotalSeconds;

localDate = DateTime.Now;

if (e.X 》 (Screen.PrimaryScreen.Bounds.Width / 5 * 4))

{

if (click_time 《= 0.5)

{

click_count += 1;

if (click_count 》 0)

{

click_count = 1;

tri_click_flag = true;

}

else

{

tri_click_flag = false;

}

}

else

{

}

if (click_count 《=1 && click_time 》 0.5)

click_count = 0;

}

else

{

click_count = 0;

tri_click_flag = false;

}

if (tri_click_flag == true)

{

textBox6.Text = “1”;

arduino.digitalWrite(13, Arduino.HIGH);

}

else

{

textBox6.Text = “0”;

arduino.digitalWrite(13, Arduino.LOW);

}

}

}

private void mh_MouseMoveEvent(object sender, MouseEventArgs e)

{

int x = e.Location.X;

int y = e.Location.Y;

textBox1.Text = x + “”;

textBox2.Text = y + “”;

textBox3.Text = Screen.PrimaryScreen.Bounds.Height.ToString();

textBox4.Text = Screen.PrimaryScreen.Bounds.Width.ToString();

}

private void Form1_FormClosed(object sender, FormClosedEventArgs e)

{

mh.UnHook();

}

private void Form1_FormClosed_1(object sender, FormClosedEventArgs e)

{

mh.UnHook();

}

private void textBox1_TextChanged(object sender, EventArgs e)

{

}

private void textBox2_TextChanged(object sender, EventArgs e)

{

}

private void label1_Click(object sender, EventArgs e)

{

}

private void textBox3_TextChanged(object sender, EventArgs e)

{

}

private void textBox4_TextChanged(object sender, EventArgs e)

{

}

private void label2_Click(object sender, EventArgs e)

{

}

private void label3_Click(object sender, EventArgs e)

{

}

private void textBox5_TextChanged(object sender, EventArgs e)

{

}

private void textBox6_TextChanged(object sender, EventArgs e)

{

}

}

public class Win32Api

{

[StructLayout(LayoutKind.Sequential)]

public class POINT

{

public int x;

public int y;

}

[StructLayout(LayoutKind.Sequential)]

public class MouseHookStruct

{

public POINT pt;

public int hwnd;

public int wHitTestCode;

public int dwExtraInfo;

}

public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);

//安装钩子

[DllImport(“user32.dll”, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]

public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);

//卸载钩子

[DllImport(“user32.dll”, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]

public static extern bool UnhookWindowsHookEx(int idHook);

//调用下一个钩子

[DllImport(“user32.dll”, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]

public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);

}

public class MouseHook

{

private Point point;

private Point Point

{

get { return point; }

set

{

if (point != value)

{

point = value;

if (MouseMoveEvent != null)

{

var e = new MouseEventArgs(MouseButtons.None, 0, point.X, point.Y, 0);

MouseMoveEvent(this, e);

}

}

}

}

private int hHook;

private const int WM_LBUTTONDOWN = 0x201;

public const int WH_MOUSE_LL = 14;

public Win32Api.HookProc hProc;

public MouseHook()

{

this.Point = new Point();

}

public int SetHook()

{

hProc = new Win32Api.HookProc(MouseHookProc);

hHook = Win32Api.SetWindowsHookEx(WH_MOUSE_LL, hProc, IntPtr.Zero, 0);

return hHook;

}

public void UnHook()

{

Win32Api.UnhookWindowsHookEx(hHook);

}

private int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam)

{

Win32Api.MouseHookStruct MyMouseHookStruct = (Win32Api.MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(Win32Api.MouseHookStruct));

if (nCode 《 0)

{

return Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam);

}

else

{

if (MouseClickEvent != null)

{

MouseButtons button = MouseButtons.None;

int clickCount = 0;

switch ((Int32)wParam)

{

case WM_LBUTTONDOWN:

button = MouseButtons.Left;

clickCount = 1;

break;

}

var e = new MouseEventArgs(button, clickCount, point.X, point.Y, 0);

MouseClickEvent(this, e);

}

this.Point = new Point(MyMouseHookStruct.pt.x, MyMouseHookStruct.pt.y);

return Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam);

}

}

public delegate void MouseMoveHandler(object sender, MouseEventArgs e);

public event MouseMoveHandler MouseMoveEvent;

public delegate void MouseClickHandler(object sender, MouseEventArgs e);

public event MouseClickHandler MouseClickEvent;

}

}

这是一种进行交互项目的新方法。它也可以用于家庭自动化控制系统。使用PC来控制空调,灯光,电视等。

步骤4:演示3:检测三次单击并控制屏幕背景光

在此演示中,您将获得鼠标的位置并将实时值发送到PC。然后,您的PC可以根据该值更改背景光。 您还可以在PC上播放此演示。

此演示涉及使用C#来控制屏幕的背景光。如果您想了解这一部分知识,可以在这里查看教程。

如何播放演示3:

在右侧1/3上单击三次。屏幕的5侧,然后您将进入GPIO控制模式,向上或向下移动手指,屏幕的背景光会变暗或变暗。

此功能与您的iPhone有点相似。您可以在附件中查看代码或在此处下载演示。

方法1:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Runtime.InteropServices;

using System.Globalization;

namespace Demo_mousehook_csdn

{

public partial class Form1 : Form

{

[DllImport(“gdi32.dll”)]

private unsafe static extern bool SetDeviceGammaRamp(Int32 hdc, void* ramp);

private static bool initialized = false;

private static Int32 hdc;

private static int a;

static DateTime localDate = DateTime.Now;

double click_time;

int click_count = 0;

bool tri_click_flag = false;

static string sText=“”;

static int IncreaseData = 0;

static int ClickPositionY = 0;

public Form1()

{

InitializeComponent();

}

MouseHook mh;

// protected override void SetVisibleCore(bool value)

// {

// base.SetVisibleCore(false);

// }

private void Form1_Load(object sender, EventArgs e)

{

mh = new MouseHook();

mh.SetHook();

mh.MouseMoveEvent += mh_MouseMoveEvent;

mh.MouseClickEvent += mh_MouseClickEvent;

mh.MouseDownEvent += mh_MouseDownEvent;

mh.MouseUpEvent += mh_MouseUpEvent;

}

private static void InitializeClass()

{

if (initialized)

return;

//Get the hardware device context of the screen, we can do

//this by getting the graphics object of null (IntPtr.Zero)

//then getting the HDC and converting that to an Int32.

hdc = Graphics.FromHwnd(IntPtr.Zero).GetHdc().ToInt32();

initialized = false;

}

public static unsafe bool SetBrightness(int brightness)

{

InitializeClass();

if (brightness 》 255)

brightness = 255;

if (brightness 《 0)

brightness = 0;

short* gArray = stackalloc short[3 * 256];

short* idx = gArray;

for (int j = 0; j 《 3; j++)

{

for (int i = 0; i 《 256; i++)

{

int arrayVal = i * (brightness + 128);

if (arrayVal 》 65535)

arrayVal = 65535;

*idx = (short)arrayVal;

idx++;

}

}

//For some reason, this always returns false?

bool retVal = SetDeviceGammaRamp(hdc, gArray);

//Memory allocated through stackalloc is automatically free‘d

//by the CLR.

return retVal;

}

private void mh_MouseClickEvent(object sender, MouseEventArgs e)

{

if (e.Button == MouseButtons.Left)

{

ClickPositionY = e.X;

sText = “(” + e.X.ToString() + “,” + e.Y.ToString() + “)”;

label1.Text = sText;

click_time = (DateTime.Now - localDate).TotalSeconds;

localDate = DateTime.Now;

if (e.X 》 (Screen.PrimaryScreen.Bounds.Width / 5 * 4))

{

if (click_time 《= 0.5)

{

click_count += 1;

label3.Text = “1”;

if (click_count 》 1)

{

click_count = 2;

label2.Text = “1”;

tri_click_flag = true;

}

else

{

label2.Text = “0”;

tri_click_flag = false;

}

textBox5.Text = click_count.ToString();

}

else

{

textBox5.Text = click_count.ToString();

}

if (click_count 《=1 && click_time 》 0.5)

click_count = 0;

}

else

{

label3.Text = “0”;

click_count = 0;

textBox5.Text = click_count.ToString();

label2.Text = “0”;

tri_click_flag = false;

}

}

}

private void mh_MouseMoveEvent(object sender, MouseEventArgs e)

{

int x = e.Location.X;

int y = e.Location.Y;

int LedData = 0;

LedData = (Screen.PrimaryScreen.Bounds.Height - y)*140/ Screen.PrimaryScreen.Bounds.Height;

if (LedData 《= 0)

LedData = 0;

if (e.X 》 (Screen.PrimaryScreen.Bounds.Width / 5 * 4))

{

if (tri_click_flag == true)

{

textBox6.Text = “1”;

SetBrightness(LedData);

label15.Text = LedData.ToString();

}

else

{

textBox6.Text = “0”;

}

}

textBox1.Text = x + “”;

textBox2.Text = y + “”;

textBox3.Text = Screen.PrimaryScreen.Bounds.Height.ToString();

textBox4.Text = Screen.PrimaryScreen.Bounds.Width.ToString();

}

private void Form1_FormClosed(object sender, FormClosedEventArgs e)

{

mh.UnHook();

}

private void Form1_FormClosed_1(object sender, FormClosedEventArgs e)

{

mh.UnHook();

}

private void textBox1_TextChanged(object sender, EventArgs e)

{

}

private void textBox2_TextChanged(object sender, EventArgs e)

{

}

private void label1_Click(object sender, EventArgs e)

{

}

private void textBox3_TextChanged(object sender, EventArgs e)

{

}

private void textBox4_TextChanged(object sender, EventArgs e)

{

}

private void label2_Click(object sender, EventArgs e)

{

}

private void label3_Click(object sender, EventArgs e)

{

}

private void textBox5_TextChanged(object sender, EventArgs e)

{

}

private void textBox6_TextChanged(object sender, EventArgs e)

{

}

private void mh_MouseDownEvent(object sender, MouseEventArgs e)

{

if (e.Button == MouseButtons.Left)

{

richTextBox1.AppendText(“按下了左键 ”);

}

}

private void mh_MouseUpEvent(object sender, MouseEventArgs e)

{

if (e.Button == MouseButtons.Left)

{

richTextBox1.AppendText(“松开了左键 ”);

}

}

private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)

{

}

private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)

{

}

private void exitToolStripMenuItem_Click(object sender, EventArgs e)

{

Application.ExitThread();

Environment.Exit(0);

}

private void label13_Click(object sender, EventArgs e)

{

}

private void label14_Click(object sender, EventArgs e)

{

}

private void label15_Click(object sender, EventArgs e)

{

}

private void richTextBox1_TextChanged(object sender, EventArgs e)

{

}

}

public class Win32Api

{

[StructLayout(LayoutKind.Sequential)]

public class POINT

{

public int x;

public int y;

}

[StructLayout(LayoutKind.Sequential)]

public class MouseHookStruct

{

public POINT pt;

public int hwnd;

public int wHitTestCode;

public int dwExtraInfo;

}

public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);

//安装钩子

[DllImport(“user32.dll”, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]

public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);

//卸载钩子

[DllImport(“user32.dll”, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]

public static extern bool UnhookWindowsHookEx(int idHook);

//调用下一个钩子

[DllImport(“user32.dll”, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]

public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);

}

public class MouseHook

{

private Point point;

private Point Point

{

get { return point; }

set

{

if (point != value)

{

point = value;

if (MouseMoveEvent != null)

{

var e = new MouseEventArgs(MouseButtons.None, 0, point.X, point.Y, 0);

MouseMoveEvent(this, e);

}

}

}

}

private int hHook;

private const int WM_LBUTTONDOWN = 0x201;

private const int WM_LBUTTONUP = 0x202;

public const int WH_MOUSE_LL = 14;

public Win32Api.HookProc hProc;

public MouseHook()

{

this.Point = new Point();

}

public int SetHook()

{

hProc = new Win32Api.HookProc(MouseHookProc);

hHook = Win32Api.SetWindowsHookEx(WH_MOUSE_LL, hProc, IntPtr.Zero, 0);

return hHook;

}

public void UnHook()

{

Win32Api.UnhookWindowsHookEx(hHook);

}

private int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam)

{

Win32Api.MouseHookStruct MyMouseHookStruct = (Win32Api.MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(Win32Api.MouseHookStruct));

if (nCode 《 0)

{

return Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam);

}

else

{

if (MouseClickEvent != null)

{

MouseButtons button = MouseButtons.None;

int clickCount = 0;

switch ((Int32)wParam)

{

case WM_LBUTTONDOWN:

button = MouseButtons.Left;

clickCount = 1;

break;

case WM_LBUTTONUP:

button = MouseButtons.Left;

clickCount = 1;

break;

}

var e = new MouseEventArgs(button, clickCount, point.X, point.Y, 0);

MouseClickEvent(this, e);

}

this.Point = new Point(MyMouseHookStruct.pt.x, MyMouseHookStruct.pt.y);

return Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam);

}

}

public delegate void MouseMoveHandler(object sender, MouseEventArgs e);

public event MouseMoveHandler MouseMoveEvent;

public delegate void MouseClickHandler(object sender, MouseEventArgs e);

public event MouseClickHandler MouseClickEvent;

public delegate void MouseDownHandler(object sender, MouseEventArgs e);

public event MouseDownHandler MouseDownEvent;

public delegate void MouseUpHandler(object sender, MouseEventArgs e);

public event MouseUpHandler MouseUpEvent;

}

}

方法2:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Runtime.InteropServices;

using System.Globalization;

//using LattePanda.Firmata;

namespace Demo_mousehook_csdn

{

public partial class Form1 : Form

{

//static Arduino arduino = new Arduino();

static DateTime localDate = DateTime.Now;

double click_time;

int click_count = 0;

bool tri_click_flag = false;

bool mouse_down_flag = false;

static string sText=“”;

static int ClickPositionY = 0;

static int LedData = 0;//需要发送的LED亮度值

static int LedIncreaseData = 0; //Data增量

static int LedLastData = 0;//Led的最后一次亮度

static int LedStoreData = 0;//Led需要储藏的数值,备用

[DllImport(“gdi32.dll”)]

private unsafe static extern bool SetDeviceGammaRamp(Int32 hdc, void* ramp);

private static bool initialized = false;

private static Int32 hdc;

private static void InitializeClass()

{

if (initialized)

return;

//Get the hardware device context of the screen, we can do

//this by getting the graphics object of null (IntPtr.Zero)

//then getting the HDC and converting that to an Int32.

hdc = Graphics.FromHwnd(IntPtr.Zero).GetHdc().ToInt32();

initialized = false;

}

public static unsafe bool SetBrightness(int brightness)

{

InitializeClass();

if (brightness 》 255)

brightness = 255;

if (brightness 《 0)

brightness = 0;

short* gArray = stackalloc short[3 * 256];

short* idx = gArray;

for (int j = 0; j 《 3; j++)

{

for (int i = 0; i 《 256; i++)

{

int arrayVal = i * (brightness + 128);

if (arrayVal 》 65535)

arrayVal = 65535;

*idx = (short)arrayVal;

idx++;

}

}

//For some reason, this always returns false?

bool retVal = SetDeviceGammaRamp(hdc, gArray);

//Memory allocated through stackalloc is automatically free’d

//by the CLR.

return retVal;

}

public Form1()

{

InitializeComponent();

// arduino.pinMode(13, Arduino.OUTPUT);//

}

MouseHook mh;

// protected override void SetVisibleCore(bool value)

// {

// base.SetVisibleCore(false);

// }

private void Form1_Load(object sender, EventArgs e)

{

mh = new MouseHook();

mh.SetHook();

mh.MouseMoveEvent += mh_MouseMoveEvent;

mh.MouseClickEvent += mh_MouseClickEvent;

mh.MouseUpEvent += mh_MouseUpEvent;

mh.MouseDownEvent += mh_MouseDownEvent;

}

private void mh_MouseUpEvent(object sender, MouseEventArgs e)

{

if (e.Button == MouseButtons.Left)

{

LedLastData = LedData;

mouse_down_flag = false;

richTextBox1.AppendText(“Released ”);

}

}

private void mh_MouseDownEvent(object sender, MouseEventArgs e)

{

if (e.Button == MouseButtons.Left)

{

mouse_down_flag = true;

click_time = (DateTime.Now - localDate).TotalSeconds;

localDate = DateTime.Now;

label13.Text = click_time.ToString();

richTextBox1.AppendText(“Pressed ”);

if (e.X 》 (Screen.PrimaryScreen.Bounds.Width / 5 * 4))

{

ClickPositionY= e.Location.Y;

if (click_time 《= 0.5)

{

click_count += 1;

label3.Text = “1”;

if (click_count 》 1)

{

click_count = 2;

label2.Text = “1”;

tri_click_flag = true;

}

else

{

label2.Text = “0”;

tri_click_flag = false;

}

textBox5.Text = click_count.ToString();

}

else

{

textBox5.Text = click_count.ToString();

}

if (click_count 《= 1 && click_time 》 0.5)

click_count = 0;

}

else

{

label3.Text = “0”;

click_count = 0;

textBox5.Text = click_count.ToString();

label2.Text = “0”;

tri_click_flag = false;

}

}

}

private void mh_MouseClickEvent(object sender, MouseEventArgs e)

{

if (e.Button == MouseButtons.Left)

{

sText = “(” + e.X.ToString() + “,” + e.Y.ToString() + “)”;

label1.Text = sText;

}

}

private void mh_MouseMoveEvent(object sender, MouseEventArgs e)

{

int x = e.Location.X;

int y = e.Location.Y;

if (e.X 》 (Screen.PrimaryScreen.Bounds.Width / 5 * 4))

{

if (tri_click_flag == true)

{

textBox6.Text = “1”;

if(mouse_down_flag==true)

{

LedIncreaseData = (ClickPositionY - y) * 140 / 1080;

LedData = LedStoreData + LedIncreaseData;

if(LedData《0)

{

LedData = 0;

}

if (LedData 》 140)

{

LedData = 140;

}

SetBrightness(LedData);

}

if(mouse_down_flag==false)

{

LedStoreData = LedLastData;

}

}

else

{

textBox6.Text = “0”;

}

}

label19.Text = LedStoreData.ToString();

label20.Text = LedData.ToString();

label15.Text = LedIncreaseData.ToString();

textBox1.Text = x + “”;

textBox2.Text = y + “”;

textBox3.Text = Screen.PrimaryScreen.Bounds.Height.ToString();

textBox4.Text = Screen.PrimaryScreen.Bounds.Width.ToString();

}

private void Form1_FormClosed(object sender, FormClosedEventArgs e)

{

mh.UnHook();

}

private void Form1_FormClosed_1(object sender, FormClosedEventArgs e)

{

mh.UnHook();

}

private void textBox1_TextChanged(object sender, EventArgs e)

{

}

private void textBox2_TextChanged(object sender, EventArgs e)

{

}

private void label1_Click(object sender, EventArgs e)

{

}

private void textBox3_TextChanged(object sender, EventArgs e)

{

}

private void textBox4_TextChanged(object sender, EventArgs e)

{

}

private void label2_Click(object sender, EventArgs e)

{

}

private void label3_Click(object sender, EventArgs e)

{

}

private void textBox5_TextChanged(object sender, EventArgs e)

{

}

private void textBox6_TextChanged(object sender, EventArgs e)

{

}

private void Form1_MouseDown(object sender, MouseEventArgs e)

{

}

private void Form1_MouseUp(object sender, MouseEventArgs e)

{

}

private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)

{

}

private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)

{

}

private void exitToolStripMenuItem_Click(object sender, EventArgs e)

{

Application.ExitThread();

Environment.Exit(0);

}

private void label13_Click(object sender, EventArgs e)

{

}

private void label14_Click(object sender, EventArgs e)

{

}

private void label15_Click(object sender, EventArgs e)

{

}

private void richTextBox1_TextChanged(object sender, EventArgs e)

{

}

private void label19_Click(object sender, EventArgs e)

{

}

private void label20_Click(object sender, EventArgs e)

{

}

}

public class Win32Api

{

[StructLayout(LayoutKind.Sequential)]

public class POINT

{

public int x;

public int y;

}

[StructLayout(LayoutKind.Sequential)]

public class MouseHookStruct

{

public POINT pt;

public int hwnd;

public int wHitTestCode;

public int dwExtraInfo;

}

public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);

//安装钩子

[DllImport(“user32.dll”, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]

public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);

//卸载钩子

[DllImport(“user32.dll”, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]

public static extern bool UnhookWindowsHookEx(int idHook);

//调用下一个钩子

[DllImport(“user32.dll”, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]

public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);

}

public class MouseHook

{

private Point point;

private Point Point

{

get { return point; }

set

{

if (point != value)

{

point = value;

if (MouseMoveEvent != null)

{

var e = new MouseEventArgs(MouseButtons.None, 0, point.X, point.Y, 0);

MouseMoveEvent(this, e);

}

}

}

}

private int hHook;

private const int WM_LBUTTONDOWN = 0x201;

private const int WM_LBUTTONUP = 0x202;

public const int WH_MOUSE_LL = 14;

public Win32Api.HookProc hProc;

public MouseHook()

{

this.Point = new Point();

}

public int SetHook()

{

hProc = new Win32Api.HookProc(MouseHookProc);

hHook = Win32Api.SetWindowsHookEx(WH_MOUSE_LL, hProc, IntPtr.Zero, 0);

return hHook;

}

public void UnHook()

{

Win32Api.UnhookWindowsHookEx(hHook);

}

private int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam)

{

Win32Api.MouseHookStruct MyMouseHookStruct = (Win32Api.MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(Win32Api.MouseHookStruct));

if (nCode 《 0)

{

return Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam);

}

else

{

if (MouseClickEvent != null)

{

MouseButtons button = MouseButtons.None;

int clickCount = 0;

switch ((Int32)wParam)

{

case WM_LBUTTONDOWN:

button = MouseButtons.Left;

clickCount = 1;

MouseDownEvent(this, new MouseEventArgs(button, clickCount, point.X, point.Y, 0));

break;

case WM_LBUTTONUP:

button = MouseButtons.Left;

clickCount = 1;

MouseUpEvent(this, new MouseEventArgs(button, clickCount, point.X, point.Y, 0));

break;

}

var e = new MouseEventArgs(button, clickCount, point.X, point.Y, 0);

MouseClickEvent(this, e);

}

this.Point = new Point(MyMouseHookStruct.pt.x, MyMouseHookStruct.pt.y);

return Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam);

}

}

public delegate void MouseMoveHandler(object sender, MouseEventArgs e);

public event MouseMoveHandler MouseMoveEvent;

public delegate void MouseClickHandler(object sender, MouseEventArgs e);

public event MouseClickHandler MouseClickEvent;

public delegate void MouseUpHandler(object sender, MouseEventArgs e);

public event MouseUpHandler MouseUpEvent;

public delegate void MouseDownHandler(object sender, MouseEventArgs e);

public event MouseDownHandler MouseDownEvent;

}

}

玩得开心!

到目前为止还好吗?如有任何疑问,请告诉我!

步骤5:演示4:检测三次单击并控制LED灯

在此演示中,您将获得鼠标的位置并将实时值发送到Arduino。然后您的Arduino可以根据该值控制LED。

播放DEMO 4的方法:

在屏幕右侧的1/5上单击三下,您将进入GPIO控制模式,移动您的GPIO手指向上或向下,LED(D13)会变亮或变暗。

此演示涉及PC与Arduino之间的通信(Arduino和C#通信)。如果您想了解这部分知识,请参阅此处的教程。

您可以在附件中查看代码,也可以在此处下载演示。

Demo 4代码:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Runtime.InteropServices;

using System.Globalization;

using LattePanda.Firmata;

namespace Demo_mousehook_csdn

{

public partial class Form1 : Form

{

static Arduino arduino = new Arduino();

static DateTime localDate = DateTime.Now;

double click_time;

int click_count = 0;

bool tri_click_flag = false;

bool mouse_down_flag = false;

static string sText=“”;

static int ClickPositionY = 0;

static int LedData = 0;//需要发送的LED亮度值

static int LedIncreaseData = 0; //Data增量

static int LedLastData = 0;//Led的最后一次亮度

static int LedStoreData = 0;//Led需要储藏的数值,备用

public Form1()

{

InitializeComponent();

arduino.pinMode(13, Arduino.PWM);//

}

MouseHook mh;

private void Form1_Load(object sender, EventArgs e)

{

mh = new MouseHook();

mh.SetHook();

mh.MouseMoveEvent += mh_MouseMoveEvent;

mh.MouseClickEvent += mh_MouseClickEvent;

mh.MouseUpEvent += mh_MouseUpEvent;

mh.MouseDownEvent += mh_MouseDownEvent;

}

private void mh_MouseUpEvent(object sender, MouseEventArgs e)

{

if (e.Button == MouseButtons.Left)

{

LedLastData = LedData;

mouse_down_flag = false;

richTextBox1.AppendText(“Released ”);

}

}

private void mh_MouseDownEvent(object sender, MouseEventArgs e)

{

if (e.Button == MouseButtons.Left)

{

mouse_down_flag = true;

click_time = (DateTime.Now - localDate).TotalSeconds;

localDate = DateTime.Now;

label13.Text = click_time.ToString();

richTextBox1.AppendText(“Pressed ”);

if (e.X 》 (Screen.PrimaryScreen.Bounds.Width / 5 * 4))

{

ClickPositionY= e.Location.Y;

if (click_time 《= 0.5)

{

click_count += 1;

label3.Text = “1”;

if (click_count 》 1)

{

click_count = 2;

label2.Text = “1”;

tri_click_flag = true;

}

else

{

label2.Text = “0”;

tri_click_flag = false;

}

textBox5.Text = click_count.ToString();

}

else

{

textBox5.Text = click_count.ToString();

}

if (click_count 《= 1 && click_time 》 0.5)

click_count = 0;

}

else

{

label3.Text = “0”;

click_count = 0;

textBox5.Text = click_count.ToString();

label2.Text = “0”;

tri_click_flag = false;

}

}

}

private void mh_MouseClickEvent(object sender, MouseEventArgs e)

{

if (e.Button == MouseButtons.Left)

{

sText = “(” + e.X.ToString() + “,” + e.Y.ToString() + “)”;

label1.Text = sText;

}

}

private void mh_MouseMoveEvent(object sender, MouseEventArgs e)

{

int x = e.Location.X;

int y = e.Location.Y;

if (e.X 》 (Screen.PrimaryScreen.Bounds.Width / 5 * 4))

{

if (tri_click_flag == true)

{

textBox6.Text = “1”;

if(mouse_down_flag==true)

{

LedIncreaseData = (ClickPositionY - y) * 140 / 1080;

LedData = LedStoreData + LedIncreaseData;

if(LedData《0)

{

LedData = 0;

}

if (LedData 》 140)

{

LedData = 140;

}

arduino.analogWrite(13,LedData);

}

if(mouse_down_flag==false)

{

LedStoreData = LedLastData;

}

}

else

{

textBox6.Text = “0”;

}

}

label19.Text = LedStoreData.ToString();

label20.Text = LedData.ToString();

label15.Text = LedIncreaseData.ToString();

textBox1.Text = x + “”;

textBox2.Text = y + “”;

textBox3.Text = Screen.PrimaryScreen.Bounds.Height.ToString();

textBox4.Text = Screen.PrimaryScreen.Bounds.Width.ToString();

}

private void Form1_FormClosed(object sender, FormClosedEventArgs e)

{

mh.UnHook();

}

private void Form1_FormClosed_1(object sender, FormClosedEventArgs e)

{

mh.UnHook();

}

private void textBox1_TextChanged(object sender, EventArgs e)

{

}

private void textBox2_TextChanged(object sender, EventArgs e)

{

}

private void label1_Click(object sender, EventArgs e)

{

}

private void textBox3_TextChanged(object sender, EventArgs e)

{

}

private void textBox4_TextChanged(object sender, EventArgs e)

{

}

private void label2_Click(object sender, EventArgs e)

{

}

private void label3_Click(object sender, EventArgs e)

{

}

private void textBox5_TextChanged(object sender, EventArgs e)

{

}

private void textBox6_TextChanged(object sender, EventArgs e)

{

}

private void Form1_MouseDown(object sender, MouseEventArgs e)

{

}

private void Form1_MouseUp(object sender, MouseEventArgs e)

{

}

private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)

{

}

private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)

{

}

private void exitToolStripMenuItem_Click(object sender, EventArgs e)

{

Application.ExitThread();

Environment.Exit(0);

}

private void label13_Click(object sender, EventArgs e)

{

}

private void label14_Click(object sender, EventArgs e)

{

}

private void label15_Click(object sender, EventArgs e)

{

}

private void richTextBox1_TextChanged(object sender, EventArgs e)

{

}

private void label19_Click(object sender, EventArgs e)

{

}

private void label20_Click(object sender, EventArgs e)

{

}

}

public class Win32Api

{

[StructLayout(LayoutKind.Sequential)]

public class POINT

{

public int x;

public int y;

}

[StructLayout(LayoutKind.Sequential)]

public class MouseHookStruct

{

public POINT pt;

public int hwnd;

public int wHitTestCode;

public int dwExtraInfo;

}

public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);

//安装钩子

[DllImport(“user32.dll”, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]

public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);

//卸载钩子

[DllImport(“user32.dll”, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]

public static extern bool UnhookWindowsHookEx(int idHook);

//调用下一个钩子

[DllImport(“user32.dll”, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]

public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);

}

public class MouseHook

{

private Point point;

private Point Point

{

get { return point; }

set

{

if (point != value)

{

point = value;

if (MouseMoveEvent != null)

{

var e = new MouseEventArgs(MouseButtons.None, 0, point.X, point.Y, 0);

MouseMoveEvent(this, e);

}

}

}

}

private int hHook;

private const int WM_LBUTTONDOWN = 0x201;

private const int WM_LBUTTONUP = 0x202;

public const int WH_MOUSE_LL = 14;

public Win32Api.HookProc hProc;

public MouseHook()

{

this.Point = new Point();

}

public int SetHook()

{

hProc = new Win32Api.HookProc(MouseHookProc);

hHook = Win32Api.SetWindowsHookEx(WH_MOUSE_LL, hProc, IntPtr.Zero, 0);

return hHook;

}

public void UnHook()

{

Win32Api.UnhookWindowsHookEx(hHook);

}

private int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam)

{

Win32Api.MouseHookStruct MyMouseHookStruct = (Win32Api.MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(Win32Api.MouseHookStruct));

if (nCode 《 0)

{

return Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam);

}

else

{

if (MouseClickEvent != null)

{

MouseButtons button = MouseButtons.None;

int clickCount = 0;

switch ((Int32)wParam)

{

case WM_LBUTTONDOWN:

button = MouseButtons.Left;

clickCount = 1;

MouseDownEvent(this, new MouseEventArgs(button, clickCount, point.X, point.Y, 0));

break;

case WM_LBUTTONUP:

button = MouseButtons.Left;

clickCount = 1;

MouseUpEvent(this, new MouseEventArgs(button, clickCount, point.X, point.Y, 0));

break;

}

var e = new MouseEventArgs(button, clickCount, point.X, point.Y, 0);

MouseClickEvent(this, e);

}

this.Point = new Point(MyMouseHookStruct.pt.x, MyMouseHookStruct.pt.y);

return Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam);

}

}

public delegate void MouseMoveHandler(object sender, MouseEventArgs e);

public event MouseMoveHandler MouseMoveEvent;

public delegate void MouseClickHandler(object sender, MouseEventArgs e);

public event MouseClickHandler MouseClickEvent;

public delegate void MouseUpHandler(object sender, MouseEventArgs e);

public event MouseUpHandler MouseUpEvent;

public delegate void MouseDownHandler(object sender, MouseEventArgs e);

public event MouseDownHandler MouseDownEvent;

}

}

如果您有任何疑问,请告诉我!

步骤6:摘要:

您得到的货款!在Respberry Pi上运行Win10时,我不能忍受滞后。当您需要在SBC及其基于x64的处理器上进行大型项目时,LattePanda是一个不错的选择。 LattePanda的CPU可以完美地处理大型项目。它也可以完美地运行Ubuntu。对我来说,LattePanda是一个训练我的编码能力的好平台。由于它运行Win10系统,因此我可以使用Visual Studio在C ++,C#,Python等中执行许多项目。更重要的是,它还配备了Arduino Leonardo。我可以在PC上轻松控制物理世界。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C#
    +关注

    关注

    0

    文章

    6

    浏览量

    23828
  • IOT
    IOT
    +关注

    关注

    185

    文章

    3957

    浏览量

    192968
收藏 人收藏

    评论

    相关推荐

    我用全志V851s做了一个魔法棒,使用Keras训练手势识别模型控制一切电子设备

    挥棒手势数据 Keras 挥棒手势识别模型训练 V851s 赛博魔杖 蓝牙控制的简易舵机开关灯装置_HLK-B40 原神 蓝牙安卓启动器 1、工程附件
    发表于 02-04 10:44

    不使用摄像头怎么检测人的姿态或者手势

    不使用摄像头怎么检测人的姿态或者手势 距离大概1米到2米之间
    发表于 11-06 07:00

    使用Arduino和PAJ7620手势传感器制作手势控制机器人

    使用Arduino和PAJ7620手势传感器制作手势控制机器人,简单程序即可实现。小小的传感器可以识别各种手势。它采用内置的空间传感器,可以感知接近和离开的对象。
    发表于 09-27 06:17

    基于NB-IoT技术智能温室大棚温湿度检测系统

    u3000u3000基于窄带物联网NB-IoT(Narrow Band-Internet of Things) 技术,设计一种智能温室大棚温湿度检测系统。该系统以DS18B20模块检测
    发表于 09-26 07:37

    基于arduino设计的手势控制小车

    基于arduino的手势控制小车
    发表于 09-25 06:06

    HarmonyOS/OpenHarmony(Stage模型)应用开发组合手势(三)互斥识别

    互斥识别组合手势对应的GestureMode为Exclusive。互斥识别组合手势中注册的手势将同时进行识别,若有一个手势识别成功,则结束手势
    发表于 09-11 15:01

    HarmonyOS/OpenHarmony(Stage模型)应用开发组合手势(二)并行识别

    并行识别组合手势对应的GestureMode为Parallel。并行识别组合手势中注册的手势将同时进行识别,直到所有手势识别结束。并行识别手势
    发表于 09-08 16:17

    HarmonyOS/OpenHarmony(Stage模型)应用开发手势绑定方法

    通过给各个组件绑定不同的手势事件,设计事件的响应方式,当手势识别成功时,ArkUI框架将通过事件回调通知组件手势识别的结果。 一、gesture(常规
    发表于 08-29 15:24

    车载手势识别技术的原理及其应用

    车载手势识别技术是一种利用计算机视觉和人工智能技术来识别和理解驾驶员手势的技术。该技术通过使用传感器、摄像头等设备捕捉驾驶员的手势动作,然后通过算法对捕捉到的手势动作进行识别和分析,以
    的头像 发表于 06-27 18:09 705次阅读

    Jesty:用手势控制你的电脑

    电子发烧友网站提供《Jesty:用手势控制你的电脑.zip》资料免费下载
    发表于 06-27 09:56 0次下载
    Jesty:用<b class='flag-5'>手势</b><b class='flag-5'>控制</b>你的电脑

    手势控制电源板

    电子发烧友网站提供《手势控制电源板.zip》资料免费下载
    发表于 06-20 09:56 0次下载
    <b class='flag-5'>手势</b><b class='flag-5'>控制</b>电源板

    手势控制NeoPixel LED游戏

    电子发烧友网站提供《手势控制NeoPixel LED游戏.zip》资料免费下载
    发表于 06-19 14:54 0次下载
    <b class='flag-5'>手势</b><b class='flag-5'>控制</b>NeoPixel LED游戏

    ​使用旭日X3派实现手势检测

    本篇博客通过旭日X3搭载手势识别算法,实现实时检测,同时测试其运行性能。
    的头像 发表于 06-02 17:36 520次阅读
    ​使用旭日X3派实现<b class='flag-5'>手势</b><b class='flag-5'>检测</b>

    有没有没有这些错误的情况下在esp和C#应用程序之间进行通信?

    C# 从 esp8266 发送和接收信息显示它的最佳方式是什么??? 我使用了一些代码,但它们不起作用:( ESP 上: 代码:
    发表于 05-19 13:24

    C#雷赛运动控制案例

    C#对雷赛运动控制卡的应用案例1:定长运动2:连续运动3:插补运动4:PVT运动5:手轮运动6:回原点运动7:IO8:AD-DA9:高速位置比较+锁存
    发表于 03-31 15:13 0次下载