ESP8266使用记录(三)
通过udp把mpu6050数据发送到PC端
/**********************************************************************
项目名称/Project : 零基础入门学用物联网
程序名称/Program name : ESP8266WiFiUdp_12
团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author : 小凯
日期/Date(YYYYMMDD) : 20200319
程序目的/Purpose :
用于演示ESP8266WiFiUdp库中print函数
-----------------------------------------------------------------------
本示例程序为太极创客团队制作的《零基础入门学用物联网》中示例程序。
该教程为对物联网开发感兴趣的朋友所设计和制作。如需了解更多该教程的信息,请参考以下网页:
http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-nodemcu-web-client/http-request/
***********************************************************************/
#include <Wire.h>
#include <ArduinoJson.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>#define ssid "TaichiMaker_WIFI" //这里改成你的设备当前环境下WIFI名字
#define password "xxxxxxx" //这里改成你的设备当前环境下WIFI密码#define BTN_1 D4 // 开关按钮
bool btn1_state = false;WiFiUDP Udp;//实例化WiFiUDP对象
unsigned int localUdpPort = 16651; // 自定义本地监听端口
unsigned int remoteUdpPort = 16650; // 自定义远程监听端口
char incomingPacket[255]; // 保存Udp工具发过来的消息
char replyPacket[2048]; //发送的消息,仅支持英文const int MPU6050_addr = 0x68;
int16_t AccX, AccY, AccZ, Temp, GyroX, GyroY, GyroZ;void setup()
{Wire.begin();Wire.beginTransmission(MPU6050_addr);Wire.write(0x6B);Wire.write(0);Wire.endTransmission(true);Serial.begin(9600);//打开串口Serial.println();Serial.printf("正在连接 %s ", ssid);WiFi.begin(ssid, password);//连接到wifiwhile (WiFi.status() != WL_CONNECTED)//等待连接{delay(500);Serial.print(".");}Serial.println("连接成功");//启动Udp监听服务if(Udp.begin(localUdpPort)){Serial.println("监听成功");//打印本地的ip地址,在UDP工具中会使用到//WiFi.localIP().toString().c_str()用于将获取的本地IP地址转化为字符串 Serial.printf("现在收听IP:%s, UDP端口:%d\n", WiFi.localIP().toString().c_str(), localUdpPort);}else{Serial.println("监听失败");}pinMode(BTN_1, INPUT_PULLUP);//开关按钮为输入开启上拉电阻
}void loop()
{Wire.beginTransmission(MPU6050_addr);Wire.write(0x3B);Wire.endTransmission(false);Wire.requestFrom(MPU6050_addr, 14, true);AccX = Wire.read() << 8 | Wire.read();AccY = Wire.read() << 8 | Wire.read();AccZ = Wire.read() << 8 | Wire.read();Temp = Wire.read() << 8 | Wire.read();GyroX = Wire.read() << 8 | Wire.read();GyroY = Wire.read() << 8 | Wire.read();GyroZ = Wire.read() << 8 | Wire.read();DynamicJsonDocument doc(2048);// 创建json根节点对象JsonObject obj = doc.to<JsonObject>();obj ["AccX"] = AccX;obj ["AccY"] = AccY;obj ["AccZ"] = AccZ;obj ["Temp"] = Temp;obj ["GyroX"] = GyroX;obj ["GyroY"] = GyroY;obj ["GyroZ"] = GyroZ; //向udp工具发送消息Udp.beginPacket(Udp.remoteIP(), remoteUdpPort);//配置远端ip地址和端口 if (digitalRead(BTN_1) == 0){obj ["Shoot"] = 1; }else{obj ["Shoot"] = 0; }String output;serializeJson(doc, replyPacket); Udp.print(replyPacket);//把数据写入发送缓冲区Udp.endPacket();//发送数据 delay(16);//延时33毫秒
}
PC端Unity工程代码
using System;
using UnityEngine;public class MPU6050 : MonoBehaviour
{private UdpServer server;public Transform trans;private bool fire = false;public float fireRate = 0.5f;private float nextFire = 0.0f;public GameObject sphere;float AccX;float accAngleX;float AccY;float accAngleY;float AccZ;float GyroX;float GyroY;float GyroZ;float gyroAngleX;float gyroAngleY;float roll;float pitch;float yaw;float elapsedTime, currentTime, previousTime;// Start is called before the first frame updatevoid Start(){Application.targetFrameRate = 60;Loom.Initialize();EventCenter.AddListener<string>("Receive", OnMessage);EventCenter.AddListener<string>("Error", OnError);server = new UdpServer();server.Start(16650, "192.168.0.56", 16651);server.Send("192.168.0.105");}// Update is called once per framevoid Update(){//射个球if (fire && Time.time > nextFire){nextFire = Time.time + fireRate;GameObject go = Instantiate(sphere, trans.position, trans.rotation);go.SetActive(true);go.GetComponent<Rigidbody>().AddForce(trans.forward * 800);}}private void OnApplicationQuit(){server.Dispose();server = null;}int count = 0;float AccErrorX;float AccErrorY;float GyroErrorX;float GyroErrorY;float GyroErrorZ;void OnMessage(string msg){Loom.QueueOnMainThread(() =>{//previousTime = currentTime; // Previous time is stored before the actual time read//currentTime = DateTime.Now.Millisecond; // Current time actual time read//elapsedTime = (currentTime - previousTime) / 1000;elapsedTime = 0.016f;//Debug.Log("elapsedTime:" + elapsedTime);//ifReceive.text += msg+ "\r\n";MPUMSG mpumsg = new MPUMSG();try{JsonUtility.FromJsonOverwrite(msg, mpumsg);}catch (Exception ex){Debug.LogError(ex);return;}//射个球if (mpumsg.Shoot == 1){fire = true;}else{fire = false;}AccX = mpumsg.AccX / 16384.0f;AccY = mpumsg.AccY / 16384.0f;AccZ = mpumsg.AccZ / 16384.0f;accAngleX = (MathF.Atan(AccY / MathF.Sqrt(MathF.Pow(AccX, 2) + MathF.Pow(AccZ, 2))) * 180 / MathF.PI) - 0.58f;accAngleY = (MathF.Atan(-1 * AccX / MathF.Sqrt(MathF.Pow(AccY, 2) + MathF.Pow(AccZ, 2))) * 180 / MathF.PI) + 1.58f;accAngleX += 3.845675f;accAngleY += 1.984601f;GyroX = mpumsg.GyroX / 131.0f;GyroY = mpumsg.GyroY / 131.0f;GyroZ = mpumsg.GyroZ / 131.0f;GyroX += 1.553333f;GyroY += 3.210216f;GyroZ += 0.1432245f;if (count < 200){count++;AccErrorX += accAngleX;AccErrorY += accAngleY;GyroErrorX += GyroX;GyroErrorY += GyroY;GyroErrorZ += GyroZ;}if (count == 200){AccErrorX = AccErrorX / 200;AccErrorY = AccErrorY / 200;GyroErrorX = GyroErrorX / 200;GyroErrorY = GyroErrorY / 200;GyroErrorZ = GyroErrorZ / 200;Debug.LogWarning("AccErrorX:" + AccErrorX+ " AccErrorY:" + AccErrorY+ " GyroErrorX:" + GyroErrorX+ " GyroErrorY:" + GyroErrorY+ " GyroErrorZ:" + GyroErrorZ);//温度Debug.LogWarning("Temp:" + (mpumsg.Temp / 340.00 + 36.53));count = 0;}// Currently the raw values are in degrees per seconds, deg/s, so we need to multiply by sendonds (s) to get the angle in degreesgyroAngleX = gyroAngleX + GyroX * elapsedTime; // deg/s * s = deggyroAngleY = gyroAngleY + GyroY * elapsedTime;yaw = yaw + GyroZ * elapsedTime;// Complementary filter - combine acceleromter and gyro angle valuesroll = 0.96f * gyroAngleX + 0.04f * accAngleX;pitch = 0.96f * gyroAngleY + 0.04f * accAngleY;//Debug.Log("yaw:" + yaw + " roll:" + roll + " pitch:" + pitch);trans.eulerAngles = new Vector3(-roll, pitch, yaw);});}void OnError(string error){Loom.QueueOnMainThread(() =>{Debug.LogError(error);if (error.Equals("serverSocket == null")){fire = false;}});}
}[Serializable]
public class MPUMSG
{public float AccX;public float AccY;public float AccZ;public float Temp;public float GyroX;public float GyroY;public float GyroZ;public int Shoot;
}
ESP8266&MPU6050&Unity
相关链接
https://howtomechatronics.com/tutorials/arduino/arduino-and-mpu6050-accelerometer-and-gyroscope-tutorial/
相关文章:

ESP8266使用记录(三)
通过udp把mpu6050数据发送到PC端 /********************************************************************** 项目名称/Project : 零基础入门学用物联网 程序名称/Program name : ESP8266WiFiUdp_12 团队/Team : 太极创客团队 / Taichi-Maker (w…...

基于微信小程序的在线视频课程学习平台设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言用户微信端的主要功能有:管理员的主要功能有:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉…...
CloudCompare 二次开发(15)——点云添加高斯噪声
目录 一、概述二、代码集成三、结果展示一、概述 不依赖任何第三方点云相关库,使用CloudCompare编程实现点云添加高斯噪声。添加高斯噪声的算法原理见:PCL 点云添加高斯噪声并保存。 二、代码集成 1、mainwindow.h文件public中添加: void doActionAddGassNoise(); //…...
一波免费、好用的API接口分享
全国快递物流地图轨迹查询:【H5物流轨迹、单号识别】通过物流单号和收寄件地址,自动评估物流时效,并在地图中展示包裹运输轨迹。包括顺丰、圆通、申通等主流快递公司。自动识别快递公司及单号,实时查询,稳定高效&#…...
Android App ~ LiveData
LiveData 两种更新数据方式 setValue(T value)postValue(T value) setValue()只能在主线程中调用,postValue()可以在任何线程中调用。 MutableLiveData 1.首先LiveData其实与数据实体类(POJO类)是一样的东西,它负责暂存数据. 2.其次LiveData其实也是一个观察者…...

全球第4大操作系统(鸿蒙)的软件后缀.hap
system exe 2022-12-01 04:38:38 首页 > 操作系统 145|0条评论 鸿蒙OS兼容已有安卓程序:这事不稀奇。 其实一个系统兼容另外系统的可执行程序并非新鲜事,比如linux下的wine和crossover可以兼容许多win系统的.exe程序。 作为回应,Wind…...
算法练习第六十四天
LCR 184. 设计自助结算系统 - 力扣(LeetCode) 总结:利用一个双端维护队列一个往后递减的队列,对头是最大值,每次进入一个新值时就一直和队尾元素比较将比新的值小的数排出,这样能保证留在队列中的数都是会…...

安卓系列机型 框架LSP 安装步骤 支持多机型 LSP框架通用安装步骤【二】
安卓玩机教程---全机型安卓4----安卓12 框架xp edx lsp安装方法【一】 低版本可以参考上个博文了解相关安装方法。 LSP框架优点 简单来说装lsp框架的优点在于可以安装各种模块。包括 但不限于系统优化 加速 游戏开挂等等的模块。大致相当于电脑的扩展油猴 Lspos…...
实现一个宽高自适应的正方形
.square {width: 10%;height: 10vw;background: tomato; }.square {width: 20%;height: 0;padding-top: 20%;background: orange; }.square {width: 30%;overflow: hidden;background: yellow; } .square::after {content: ;display: block;margin-top: 100%; }...

shell脚本命令
Shell命令是在类Unix操作系统中使用的命令行解释器(shell)中执行的命令。Shell命令可以用于执行系统命令、操作文件、进行文本处理、管理进程等。以下是一些常见的Shell命令: 1. ls:列出当前目录下的文件和文件夹。 2. cd&#x…...
Vue2023 面试归纳及复习(2)
1 vue3中的动态组件和KeepAlive组件 动态组件component <component>动态组件是一种可以根据数据变化而动态加载不同组件的方式。使用动态组件可以有效地减少代码复杂度,提高组件的复用性和灵活性。 动态组件通过一个特殊的属性is来实现动态加载,…...

idea 本地项目上传到 Git 步骤
第一步:菜单栏 VCS——>import into Version control——>Create git Repository——>弹出框找到选中自己项目——>点击Ok 第二步:选中项目右键 ——>git——>Add 文件会变成绿色表示成功 第三步:VCS——>commit——>ok 提交到…...

【从0学习Solidity】41. WETH
【从0学习Solidity】41. WETH 博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。关注我们的主页,探索全栈开发…...

微信小程序的无限瀑布流写法
微信小程序的无限瀑布流实现总算做完了,换了好几种方法,过程中出现了各种BUG。 首先官方有瀑布流的插件(Skyline /grid-view),不是原生的我就不想引入,因为我的方块流页面已经搭好了,引入说不定…...

前有CAP理论,后有BASE理论,分布式系统理论基石
🧑💻作者名称:DaenCode 🎤作者简介:CSDN实力新星,后端开发两年经验,曾担任甲方技术代表,业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开…...

HTTP、TCP、SOCKET三者之间区别和原理
7层网络模型 网络在世界范围内实现互联的标准框架 7层为理想模型,一般实际运用没有7层 详细内容 HTTP属于7层应用层 BSD socket属于5层会话层 TCP/IP属于4成传输层 TCP/IP协议 三次握手 笔者解析: 第一次握手:实现第一步需要客户端主动…...
flutter项目中常用第三方模块
flutter项目中常用第三方模块 持续更新中序言关于第三方模块安装flutter_native_splash使用方式模块配置 flutter_localizations模块配置使用方式 get_storage模块配置使用方式 get模块配置使用方式 持续更新中 序言 本章介绍项目中常用第三方模块,方便快速构建项目…...

Android 混淆使用及其字典混淆(Proguard)
1.使用背景 ProGuard能够通过压缩、优化、混淆、预检等操作,检测并删除未使用的类,字段,方法和属性,分析和优化字节码,使用简短无意义的名称来重命名类,字段和方法。从而使代码更小、更高效、更难进行逆向工程。 Android代码混淆…...

laravel 阿里云短信发送
示例 一、安装 安装:composer require mrgoon/aliyun-sms dev-master 二、打开config/app.php,添加配置代码 1、‘providers’ 配置组下添加 Mrgoon\Aliyunsms\AliyunsmsServiceProvider::class, 2、‘aliases’ 配置组下添加 Aliyunsms>Mrgoon…...
算法----LRU缓存机制
题目 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...

【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...