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 存在于缓存中,则返回关键字的值,否则返…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...