首页 > 其他分享 >在esp32上实现一个重力小球

在esp32上实现一个重力小球

时间:2024-12-06 16:31:52浏览次数:4  
标签:ball esp32 random 小球 radius location speed 重力

在单片机上模拟重力小球

硬件

主控:esp32
屏幕:ILI9341
重力传感器:MPU6050

软件

屏幕驱动:#include <TFT_eSPI.h>
MPU6050驱动:#include <MPU6050_tockn.h>

要求

可以实现屏幕上的小球跟随实际重力运行,并且具有释放回收区域,可以通过按键实现小球的增加与减少;

程序设计

  • 使用链表新建小球:
     typedef struct Balls
    {
      int location_ball[2];//小球的位置
      int last_location_ball[2];//小球上次的位置
      float speed_ball[2];//小球的速度
      float stress_ball;//小球的弹性系数
      int color_ball;//小球的颜色
      int radius_ball;//小球的半径
      struct Balls *next;//下一个小球的数据
    }ball;
  • 创建小球并初始化(赋予初始位置速度等):
    ball *creat_ball(int n)//创建小球,输入参数为个数,返回值为第一个小球的内存地址
    {
      ball *head, *node, *end;
      head = (ball*)malloc(sizeof(ball));
      end = head;
      for (int i = 0; i < n; i++)
      {
        node = (ball*)malloc(sizeof(ball));
        //----------------------//
        //ball_set_val(node); //设置初始值
        node->location_ball[0] = random(50, 100);
        node->location_ball[1] = random(50, 100);
        node->last_location_ball[0] = 0;
        node->last_location_ball[1] = 0;
        node->speed_ball[0] = random(0, 30);
        node->speed_ball[1] = random(0, 30);
        node->stress_ball = (float)((float)random(40, 60) / 100);
        node->color_ball = random(0, 65535);
        node->radius_ball = random(8, 16);
        //---------------------//
        end->next = node;
        end = node;
      }
      end->next = NULL;
      return head;
    }
  • 获取重力:
        void Grav_prc(void)//直接获得加速度,获得的加速度直接乘以10才等于实际重力
        {
          mpu6050.update();
          gx = mpu6050.getAccX() * 10;
          gy = mpu6050.getAccY() * 10;
        }

  • 小球运动过程处理:
    在这个过程中主要做了这些事情:根据高中物理可得:加速度积分获得速度,速度积分得到位置,然后对边缘碰撞进行检测,如果碰撞到了垃圾桶,重新对这个小球赋值,完成这些后指针移动到下一个小球。还需要一些延时,不然移动的太快。
    void Ball_prc(ball *list)
    {
        ball  *ball=list;
        while (ball->next != NULL)
        {
          ball->speed_ball[0]+=gx;//对加速度积分得到速度
          ball->speed_ball[1]+=gy;
    
          ball->location_ball[0]+=ball->speed_ball[0];//对速度积分得到位置
          ball->location_ball[1]+=ball->speed_ball[1];
    
          if(ball->location_ball[0]<0+ball->radius_ball)//碰到最左边
          {
            ball->location_ball[0]=0+ball->radius_ball;
            ball->speed_ball[0]=-(ball->speed_ball[0]*ball->stress_ball);//速度=负的速度乘以弹性系数,模拟弹力衰减
          }
          if(ball->location_ball[0]>MAX_X-ball->radius_ball)//碰到最右边
          {
            ball->location_ball[0]=MAX_X-ball->radius_ball;
            ball->speed_ball[0]=-(ball->speed_ball[0]*ball->stress_ball);//速度=负的速度乘以弹性系数,模拟弹力衰减
          }
          if(ball->location_ball[1]<0+ball->radius_ball)//碰到最上边
          {
            ball->location_ball[1]=0+ball->radius_ball;
            ball->speed_ball[1]=-(ball->speed_ball[1]*ball->stress_ball);//速度=负的速度乘以弹性系数,模拟弹力衰减
          }
          if(ball->location_ball[1]>MAX_Y-ball->radius_ball)//碰到最下边
          {
            ball->location_ball[1]=MAX_Y-ball->radius_ball;
            ball->speed_ball[1]=-(ball->speed_ball[1]*ball->stress_ball);//速度=负的速度乘以弹性系数,模拟弹力衰减
          }
    
          if((ball->location_ball[0]>MAX_X-logoWidth)&&(ball->location_ball[1]>MAX_Y-logoHeight))//碰到垃圾桶回收
          {
                  tft.fillCircle(ball->location_ball[0],ball->location_ball[1],ball->radius_ball,COLOR_BK);
                  tft.fillCircle(ball->last_location_ball[0],ball->last_location_ball[1],ball->radius_ball,COLOR_BK);
                  ball->location_ball[0] = random(50, 100);
                  ball->location_ball[1] = random(50, 100);
                  ball->last_location_ball[0] = 0;
                  ball->last_location_ball[1] = 0;
                  ball->speed_ball[0] = random(0, 30);
                  ball->speed_ball[1] = random(0, 30);
                  ball->stress_ball = (float)((float)random(40, 60) / 100);
                  ball->color_ball = random(0, 65535);
                  ball->radius_ball = random(8, 16);
                  
            
            
            }
          tft.fillCircle(ball->last_location_ball[0],ball->last_location_ball[1],ball->radius_ball,COLOR_BK);
          tft.fillCircle(ball->location_ball[0],ball->location_ball[1],ball->radius_ball,ball->color_ball);
    
          ball->last_location_ball[0]=ball->location_ball[0];
          ball->last_location_ball[1]=ball->location_ball[1];
          
          ball = ball->next;//切换到下一个小球
            //Serial.println(ball->radius_ball);
        }
          tft.drawXBitmap(0, 0, shoot, logoWidth, logoHeight, TFT_WHITE);
          tft.drawXBitmap(MAX_X-logoWidth, MAX_Y-logoHeight, laji, logoWidth, logoHeight, TFT_WHITE);
      
    }
  • 增删小球
    使用链表中常用的增加与删除方式,代码就不贴出来了。

演示视频:

<iframe allowfullscreen="true" border="0" frameborder="no" framespacing="0" scrolling="no" src="//player.bilibili.com/player.html?aid=808559395&bvid=BV1G34y127tE&cid=495616580&page=1"> </iframe>

标签:ball,esp32,random,小球,radius,location,speed,重力
From: https://www.cnblogs.com/shumei52/p/18591065

相关文章

  • 开源自己设计的ESP32-C3-WROOM核心板
    设计了一款ESP32-C3-WROOM核心板,开源出来。原理图、PCB、手册什么的打包好了,开源到了立创开源广场,复制下面链接可以直达,也可以关注我的同名公众号"折途想要敲代码"私信回复“ESP32C3”即可免费下载。ESP32C3WROOM-立创开源硬件平台ESP32-C3-WROOM核心板https://oshwhub.co......
  • 最小成本,最快速度 离线安装esp32/esp8266 arduino ide
    之前担任学校的实验室负责人,每届带新生都会给学弟学妹安装esp32/8266的编译环境,如果不采用离线安装的方式,步骤是繁琐的,而且很容易出错,可能得安装个两三天.  本身arduinoide是给初学者使用的,一个敲门砖,没必要在此浪费过多时间,下面是我分享的安装方法安装流程尽可能......
  • ESP32+micropython+作为WiFi热点+接收并返回数据
    ESP32+作为WiFi热点+接收并返回数据ESP32代码#ESP32作为AP#作为服务器接收数据并echo#ESP32作为AP即wifi热点importnetworkimportutime#配置ESP32为AP模式ssid='ESP32_AP'password='12345678'authmode=4#WPA2-PSK#创建WLAN对象wlan......
  • 【VsCode+PIO+ESP32+OneNet】你能看到的最简介优雅的物联网开发
    环境配置代码环境VsCode+PIO构造基于Arduinio的ESP32开发框架在VsCode拓展中搜索PlatformIOIDE并下载打开PIO主界面,新建工程命名,选择对应的ESP32开发板,Framework不必理会OneNet云平台硬件平台ESP32-WROOM-32E/D软件开发文件结构项目代码示例WIFI+MQTT云......
  • 第一篇!!或许通过一个有趣的小球游戏来认识C语言是个不错的选择
    反弹球一.绘制一个小球现在给你一张白纸,你要画出一个圆,你需要确定你要把这个小球画在这张纸的什么地方,你要画的这个小球的半径是多少。那我们近似类比,在计算机上通过C语言来画一个小球,你需要拥有一张“白纸”,也就是你需要使用easyx来画一个画布#include<conio.h>#includ......
  • 【Arduino】 ESP32-S3 (LVGL开发)
    ArduinoESP32-S3(LVGL开发-1)1、LVGL软件安装1、下载2、安装2、生成ArduinoLVGL代码并烧录1、打开软件2、创建工程3、烧写代码4、最终效果3、库文件安装1、lvgl库安装后需要配置文件,建议直接使用ESP32_S3_Display_libraries中的ESP32_Display_Pane......
  • ESP32 TWAI CAN Arduino库驱动小米电机(CyberGear微电机)
    前言鉴于项目要使用小米电机,并且要使用esp32上自带的CAN库来控制,但是没有找到合适的、能用的库,只能从现有STM32小米电机控制库的基础上进行修改。为了方便快速实现,采用Arduino的平台对esp32进行编程,对应需要修改成Arduino的库一、前置任务CAN通信基础ESP32自带CAN控制器—TW......
  • 「Luogu P2466」[SDOI2008] Sue 的小球
    题目Sue和Sandy最近迷上了一个电脑游戏,这个游戏的故事发在美丽神秘并且充满刺激的大海上,Sue有一支轻便小巧的小船。然而,Sue的目标并不是当一个海盗,而是要收集空中漂浮的彩蛋,Sue有一个秘密武器,只要她将小船划到一个彩蛋的正下方,然后使用秘密武器便可以在瞬间收集到这个彩蛋......
  • 在不使用手机 SDK 的情况下,您可以使用 ESP32-C3 实现 BLE Mesh Provisioner 的功能
    您好!您希望将之前的内容整合在一起,设计一个基于ESP32-C3实现BLEMeshProvisioner的详细示例代码,且不依赖手机SDK,全程由ESP32-C3完成配置和控制,并提供通过串口或按键的用户交互界面。我将为您提供尽可能详细的设计和完整的代码。项目概述BLEMesh是一种基于......
  • ESP32学习笔记_Bluetooth(1)——蓝牙技术与 BLE 通信机制简介
    摘要(FromAI):这篇笔记详细讲解了蓝牙技术的分类、核心架构和通信流程,重点介绍了低功耗蓝牙(BLE)的协议栈、角色划分及连接机制,结合拓扑示例清晰阐述了蓝牙网络配置和操作过程前言:本文档是本人在《ESP32-C3物联网工程开发实战(乐鑫科技著)》进行学习时所做的学习笔记,可能存......