最简单DIY基于STM32的远程控制电脑系统①(电容触摸+按键控制)
时间:2023-09-14 04:37:02
STM32库函数开发系列文章目录
第一篇:STM32F103ZET设计和实现单片机双串口交互程序
第二篇:最简单DIY基于STM32单片机蓝牙智能汽车设计方案
第三篇:最简单DIY基于STM32F407探索者开发板MPU控制舵机程序
第四篇:最简单DIY基于STM32F407探索者开发板和PCA红外遥控机械臂控制程序9685舵机控制模块
第五章:注释最详细,代码最简单STM32 摄像头 显示屏的颜色跟踪电路软硬件方案
第六篇:最简单DIY基于STM32单片机的WIFI智能汽车设计方案
第七章:最简单DIY基于STM32远程控制计算机系统①(电容触摸 按键控制)
文章目录
- STM32库函数开发系列文章目录
- 前言
- 一、最简单DIY基于STM32远程控制计算机系统①(电容触摸 什么是按键控制?
- 二、拿主义日记
-
- 1.准备硬件和接线
- 2.技术点说明
- 3.数据显示和源代码显示
- 三、运行调试
- 四、总结
前言
???daodanjishui物联网核心原创技术最简单DIY基于STM32远程控制计算机系统①(电容触摸 按键控制)。
???市场上有各种各样的开源计算机控制软件和硬件解决方案,但有复杂和简单的,如果你想快速开始STM32控制计算机的软硬件方案,会给你一个快速高效的方案。
一、最简单DIY基于STM32远程控制计算机系统①(电容触摸 什么是按键控制?
????记得本栏第六篇博文:最简单DIY基于STM32单片机的WIFI在智能汽车设计方案的设计中,库函数和其他开源代码被广泛使用。鲁迅先生的拿来主义表现得淋漓尽致,这也是STM32库函数开发的魅力完成了串口WIFI通信实现了WIFI控制汽车。为了实现STM32控制电脑,于是第七篇博文诞生了。
???? 随着人们日常使用电脑频率的提高,人们在日常生活中离不开电脑。学习、办公、娱乐、视频、游戏、广告、创业、交友、编程、计算和消磨时间等。作为一名嵌入式工程师,我有必要做一个计算机控制系列的开源项目,介绍国内外远程控制计算机的方式,以及感兴趣的读者如何通过单片机或软件更好地远程管理他们的计算机。
???? 由于国内计算机远程控制技术被封锁,一些技术和理论是通过探索和实践得出的,没有权威性,仅供参考。首先,我们应该谈谈使用软件和硬件控制计算机的方案:软件有socket编程和java 控制鼠标键盘sdk开发,硬件有单片机USB使用鼠标键盘库。下面先介绍ST公司STM32F103ZET自带鼠标控制计算机方案。用到的是正点原子战舰开发板和配套的4.3寸电容触摸屏。最终实现鼠标控制的效果。如下图所示:
B站视频演示地址:https://www.bilibili.com/video/BV1nt4y1x739?t=14.4
视频如下
最简单DIY基于STM32远程控制计算机系统①(电容触摸 按键控制)
二、拿主义日记
1.准备硬件和接线
??? 硬件需要正原子开发板和4.3英寸配套的电容式触摸屏使用正点原子的开源代码进行人工二次合成,所以这个方案都是免费的。在后期,我有一个更强大的代码,可以实现更先进的控制效果,当然,后期可能需要收费。后期可实现空中鼠标控制、遥控控制、空中手机控制、控制MPU6050控制, 远程MQTT控制等等。
代码预览截图如下:
2.技术点说明
???有字库显示、触摸屏触摸控制、屏幕显示等技术点,USB鼠标控制,按键控制,LED控制,是STM初学者是一种很好的开源学习材料。daodanjishui整理好你需要的材料,下载就可以愉快的学习了。代码编写规范,用正点原子最简单的代码模板重写,适合新手修改和二次开发。
3.数据显示和源代码显示
???文末有下载信息的地址。信息列表如下:
源代码如下:(移植ST公司控制电脑鼠标库)
#include "led.h" #include "delay.h" #include "sys.h" #include "usart.h" #include "lcd.h" #include "key.h" #include "24cxx.h" #include "I2C.h" #include "touch.h" #include "usb_lib.h" #include "hw_config.h"
#include "usb_pwr.h"
#include "string.h"
#include "spi.h"
#include "malloc.h"
#include "sdio_sdcard.h"
#include "w25qxx.h"
#include "ff.h"
#include "exfuns.h"
#include "text.h"
#include "usart3.h"
#include "fontupd.h"
//ALIENTEK Mini STM32开发板范例代码21 二次开发为战舰4.3寸电容屏鼠标触控板
//触摸屏实验
//技术支持:daodanjishui 2022.5.15
//装载画图界面
void Load_Draw_Dialog(void)
{
LCD_Clear(WHITE);//清屏
POINT_COLOR=BLUE;//设置字体为蓝色
LCD_ShowString(lcddev.width-24,0,200,16,16,"RST");//显示清屏区域
POINT_COLOR=RED;//设置画笔蓝色
}
//计算 x1,x2 的绝对值
u32 usb_abs(u32 x1,u32 x2)
{
if(x1>x2)return x1-x2;
else return x2-x1;
}
int main(void)
{
//short temp2[3];//存放mpu6050数据的数组
//u8 tmp_buf[33]="qwertyuiopasdfghjklzxcvbnmqwert"; //发射寄存器
//u8 tmp_buf[33];
u8 key;
//short X=0,Y=0; //发送到电脑端的坐标值
//short X1=0,Y1=0; //发送到电脑端的坐标值
s8 x0,y0; //发送到电脑端的坐标值
u8 keysta=0;
//short rollsta=0;
//[0]:0,左键松开;1,左键按下;
//[1]:0,右键松开;1,右键按下
//[2]:0,中键松开;1,中键按下
u8 tpsta=0; //0,触摸屏第一次按下;1,触摸屏滑动
int xlast, ylast; //最后一次按下的坐标值
u8 *p;//发送命令的指针
//char *p1;//工具指针
u16 t=999; //加速第一次获取链接状态
//u16 rlen=0;//发送字符串的长度
//u8 constate=0; //连接状态
u8 timex; //设置循环次数
//char temp[30][30];
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组设置
delay_init(); //延时初始化
uart_init(115200); //串口 1 初始化
LCD_Init(); //初始化液晶
LED_Init(); //LED 初始化
KEY_Init(); //按键初始化
TP_Init(); //初始化触摸屏
MYI2C_Init();//I2C初始化
//W25QXX_Init(); //初始化W25Q128
usart3_init(115200); //初始化串口3
my_mem_init(SRAMIN); //初始化内部内存池
//exfuns_init(); //为fatfs相关变量申请内存
//f_mount(fs[0],"0:",1); //挂载SD卡
//f_mount(fs[1],"1:",1); //挂载FLASH.
delay_ms(40);
font_init(); //检查字库是否OK
POINT_COLOR=RED;
LCD_ShowString(60,50,200,16,16,"战舰 STM32");
LCD_ShowString(60,70,200,16,16,"USB Mouse TEST");
LCD_ShowString(60,90,200,16,16,"daodanjishui");
LCD_ShowString(60,110,200,16,16,"2022.5.15");
LCD_ShowString(60,130,200,16,16,"KEY_UP:SCROLL + KEY_DOWN:SCROLL -");
//LCD_ShowString(60,130,200,16,16,"KEY_DOWN:SCROLL -");
LCD_ShowString(60,150,200,16,16,"KEY1:RIGHT Button");
LCD_ShowString(60,170,200,16,16,"KEY0:LEFT Button");
delay_ms(1800);
USB_Port_Set(0); //USB 先断开
delay_ms(300);
USB_Port_Set(1); //USB 再次连接
USB_Interrupts_Config(); // USB 中断配置
Set_USBClock(); //USB 时钟设置
USB_Init(); //USB 初始化
Load_Draw_Dialog();
while(1)
{
key=KEY_Scan(0);//按键扫描
if(key==WKUP_PRES) //WK_UP 退出测试
{
printf("WKUP_PRES");
LCD_ShowString(60,130,200,16,16,"KEY_UP:SCROLL +");
//rollsta=1;//滚轮向上
Joystick_Send(0,0,0,1);
}
else if(key==KEY0_PRES) //KEY0 向ID0发送数据
{
printf("KEY0_PRES");
keysta|=0X02; //发送鼠标右键
LCD_ShowString(60,130,200,16,16,"KEY1:RIGHT Button");
Joystick_Send(2,0,0,0);
}
else if(key==KEY1_PRES) //KEY1 向ID1发送数据
{
printf("KEY1_PRES");
LCD_ShowString(60,130,200,16,16,"KEY_DOWN:SCROLL -");
//rollsta=-1;
//发送滚轮数据到电脑 向下
Joystick_Send(0,0,0,(u8)-1);
}else if(key==KEY2_PRES){
printf("KEY2_PRES");
keysta|=0X01; //发送鼠标左键
Joystick_Send(1,0,0,0);
LCD_ShowString(60,130,200,16,16,"KEY0:LEFT Button");
}else if(keysta)//之前有按下
{
keysta=0; //发送松开命令给电脑
Joystick_Send(0,0,0,0);
}
tp_dev.scan(0); //触摸屏扫描
if(tp_dev.sta&TP_PRES_DOWN) //触摸屏被按下
{
//最少移动 5 个单位,才算滑动
if(((usb_abs(tp_dev.x[0],xlast)>4)||(usb_abs(tp_dev.y[0],ylast)>4))&&tpsta==0)
{
xlast=tp_dev.x[0]; //记录刚按下的坐标
ylast=tp_dev.y[0];
tpsta=1;
}
if(tp_dev.x[0]<lcddev.width&&tp_dev.y[0]<lcddev.height)
{
if(tp_dev.x[0]>(lcddev.width-24)&&tp_dev.y[0]<16)Load_Draw_Dialog();
else{
TP_Draw_Big_Point(tp_dev.x[0],tp_dev.y[0],RED); //画图
}
if(bDeviceState==CONFIGURED)
{
if(tpsta)//滑动
{
x0=(xlast-tp_dev.x[0])*3;//上次坐标与得到的坐标之差,扩大 2倍
y0=(ylast-tp_dev.y[0])*3;
xlast=tp_dev.x[0]; //记录刚按下的坐标
ylast=tp_dev.y[0];
Joystick_Send(keysta,-x0,-y0,0); //发送数据到电脑
delay_ms(5);
}
}
}
}else {
tpsta=0;delay_ms(1); }//清除
if(bDeviceState==CONFIGURED)
LED1=0;//USB配置成功,则绿灯亮
else
LED1=1;
if(timex)timex--;
//if(timex==1)LCD_Fill(30+54,125,239,122,WHITE);//清屏
t++;
delay_ms(10); //10毫秒
if(t==1000)
t=0;
if((t%20)==0)LED0=!LED0;
myfree(SRAMIN,p); //释放内存
}
}
三、运行与调试
请看录制好的视频演示。
四、总结
总结:通过STM32单片机使用USB数据与电脑相连,不需要安装电脑驱动就可以用单片机控制电脑的鼠标,触摸屏和按键都可以同时控制鼠标的操作,程序设计精妙,拿来主义表现良好。
后期会推出体感遥控器的开源软硬件的方案,daodanjishui嵌入式核心技术值得期待。请认准我的品牌,不断更新和创新是我的特色。追求原创开源是我的宗旨。。
最后附上本博文代码下载地址:
直接跳转
地址:https://www.cirmall.com/circuit/30852/