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 存在于缓存中,则返回关键字的值,否则返…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
jdbc查询mysql数据库时,出现id顺序错误的情况
我在repository中的查询语句如下所示,即传入一个List<intager>的数据,返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致,会导致返回的id是从小到大排列的,但我不希望这样。 Query("SELECT NEW com…...
拟合问题处理
在机器学习中,核心任务通常围绕模型训练和性能提升展开,但你提到的 “优化训练数据解决过拟合” 和 “提升泛化性能解决欠拟合” 需要结合更准确的概念进行梳理。以下是对机器学习核心任务的系统复习和修正: 一、机器学习的核心任务框架 机…...
