当前位置: 首页 > news >正文

传感器校正和测试

一。舵机在使用过程中为了防止手动扭动损坏其中的齿轮,一般会使用代码测试并校正到0位。

#include <Servo.h>  Servo myservo;  // 创建一个Servo对象  // 连接到舵机信号线的Arduino引脚  
int servoPin = 9;   void setup() {  myservo.attach(servoPin);  // 将myservo对象与servoPin引脚关联  // 测试舵机全范围移动  Serial.begin(9600);  Serial.println("开始测试舵机...");  for (int pos = 0; pos <= 180; pos += 1) { // 从0度到180度  myservo.write(pos);              // 发送舵机位置  delay(15);                       // 等待舵机到达位置  }  for (int pos = 180; pos >= 0; pos -= 1) { // 从180度回到0度  myservo.write(pos);  delay(15);  }  // 校正舵机到0度位置  Serial.println("校正舵机到0度...");  myservo.write(90); // 假设90度是舵机的中立位置,但可能需要调整  delay(1000); // 等待舵机稳定  // 如果需要,可以通过实验找到更精确的中立位置值  // 例如,你可以尝试将90改为85、95等,看哪个值更接近你的舵机的实际中立位置  
}  void loop() {  // 在loop()中不需要做任何事情,因为所有的测试和校正都在setup()中完成了  // 如果你需要在之后控制舵机,可以在这里添加代码  
}

二,红外人体感应测试

const int sensorPin = 2;  // 传感器连接的数字引脚  
const int ledPin = 13;    // LED连接的数字引脚  void setup() {  pinMode(sensorPin, INPUT);  // 设置传感器引脚为输入模式  pinMode(ledPin, OUTPUT);    // 设置LED引脚为输出模式  Serial.begin(9600);         // 开启串口通信,方便调试  
}  void loop() {  int sensorState = digitalRead(sensorPin);  // 读取传感器状态  if (sensorState == HIGH) {  // 当检测到人体时  digitalWrite(ledPin, HIGH);  // 点亮LED  Serial.println("检测到人体!");  } else {  // 没有检测到人体  digitalWrite(ledPin, LOW);  // 熄灭LED  // 这里可以添加其他操作,如打印消息到串口  }  delay(100);  // 稍微延迟一下,减少CPU负担  
}

三。无源䗦鸣器测试,编程最好使用无源的,可以控制节拍

const int buzzerPin = 8;
int song[] = {/* 儿歌《小星星》*/277,277,415,415,466,466,415,370,370,330,330,311,311,277,415,415,370,370,330,330,311,415,415,370,370,330,330,311,277,277,415,415,466,466,415,370,370,330,330,311,311,277,/*《国际歌》*/370,494,466,554,494,370,311,415,330,415,554,494,466,415,370,330,311,370,494,466,554,494,370,311,415,330,415,554,494,466,554,659,494,622,554,466,415,466,494,415,466,370,370,330,370,415,415,554,494,466,554,554,466,370,370,330,370,622,494,415,466,494,466,554,494,415,370,622,554,494,370,311,415,330,554,494,466,415,370,370,622,554,370,494,466,466,415,415,415,554,554,622,554,494,370,311,415,330,330,554,494,466,415,370,622,311,622,740,659,622,554,622,659,659,622,622,554,554,494,};int noteDurations[] = {2,2,2,2,2,2,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1,1,1,2,2,2,2,2,1,2,2,1,2,2,2,2,2,1,1,1,2,2,2,2,2,1,2,2,2,2,1,1,1,1,2,2,2,1,2,2,2,2,1,2,2,2,2,2,1,1,1,2,2,1,2,2,2,2,2,1,2,2,2,2,1,1,2,1,2,2,2,1,1,2,1,2,2,2,1,1,2,2,1,1,1,1,1,1,2,1,2,1,2,1,2,2,2,1,1,2,1,2,2,2,2,1,1,1,1,2,1,1,1,1,1,2,2,1,1,2,1,2,1,};
void setup()
{for (int thisNote = 0; thisNote <154; thisNote++){int noteDuration = 1000/noteDurations[thisNote];// 计算每个节拍的时间,以一个节拍一秒为例,四分之一拍就是1000/4毫秒,八分之一拍就是1000/8毫秒tone(buzzerPin, song[thisNote],noteDuration);int pauseBetweenNotes = noteDuration * 1.10; //每个音符间的停顿间隔,以该音符的130%为佳delay(pauseBetweenNotes);noTone(buzzerPin);}
}
void loop()
{setup();//反复唱}

四。超声波测试

#define TrigPin 9  //输出
#define EchoPin 10  //输入float Value_cm;void setup()
{Serial.begin(9600);pinMode(TrigPin, OUTPUT);pinMode(EchoPin, INPUT);
}
void loop()
{digitalWrite(TrigPin, LOW);delayMicroseconds(2);digitalWrite(TrigPin, HIGH);delayMicroseconds(10);digitalWrite(TrigPin, LOW);Value_cm = float( pulseIn(EchoPin, HIGH) * 17 )/1000; //将回波时间换算成cmSerial.print("前方障碍距离当前位置:");Serial.print(Value_cm);Serial.println("cm");delay(1000);
}

五。有源蜂鸣器,有源蜂鸣器只有开和关两种状态,控制10s开10s关,适合做为警报。

/*注意:低电平触发,给低电平就有声音,高电平没有声音,一定的工作频率
*/
/****************************************有源beep part****************************************/
#define beepPin 7                             //初始划蜂鸣器引脚
#define beepTimeInterval 1000                 //检测一次的时间间隔   
unsigned long beepTimes = 0;                  //记录设备运行时间
int beepCount = 0;                            //定义一个变量
/****************************************set up and loop part*********************************/
void setup() {Serial.begin(9600);                         //设置串口波特率为9600pinMode(beepPin, OUTPUT);                   //蜂鸣器引脚设置成输出模式Serial.println("设备上线!");                 //串口打印对应的值
}
void loop() {ControlBeep();                              //控制蜂鸣器工作delay(10000);  
}
/****************************************有源beep part****************************************/
/*控制蜂鸣器工作*/
void ControlBeep() {if (millis() - beepTimes >= beepTimeInterval) {beepTimes = millis();                    //一定时间执行一次beepCount++;if (beepCount % 2 == 1) {Serial.println("蜂鸣器打开!");digitalWrite(beepPin, LOW);            // 蜂鸣器工作} else {beepCount = 0;Serial.println("蜂鸣器关闭!");digitalWrite(beepPin, HIGH);          // 蜂鸣器停止工作}}}

六,esp32和esp8266测试联网,虽然区分了,但验证可以互用。

//const char* ssid = "CMCC-y4yk";
//const char* password = "hswy6bks";
#ifdef ESP32
#include <WiFi.h>#define NTP "ntp.aliyun.com"	//填写自己的WIFI信息
const char *ssid = "CMCC-y4yk";
const char *password = "hswy6bks";void wifi_init(){WiFi.mode(WIFI_STA);//配置ESP32 工作模式WiFi.begin(ssid, password);Serial.println("正在连接 WiFi.");while (WiFi.status() != WL_CONNECTED){delay(500);Serial.print(".");}Serial.println("WiFi connected!");}void time_init() {struct tm timeinfo;  // 定义时间信息//如果获取失败,就开启联网模式,获取时间if (!getLocalTime(&timeinfo)){Serial.println("获取时间失败");//开启网络  wifi_init();// 从网络时间服务器上获取并设置时间configTime(8 * 3600, 0, NTP);//时区,夏令时,NTP地址return;}// 格式化输出:2021-10-24 23:00:44 SundaySerial.println(&timeinfo, "%F %T %A"); //   WiFi.disconnect(true);//在不需要开启网络的情况下,可以主动断开网络连接。
}void setup(){Serial.begin(115200);wifi_init();}void loop()
{time_init();delay(1000);
}
#else
#include <ESP8266WiFi.h>
//  #include <WiFiClient.h>//3.0.2新增
//  #include <ESP8266HTTPClient.h>// 获取网络时间相关库
#include <NTPClient.h>  //需要自行搜索并安装此库
#include <WiFiUdp.h>    //固件自带const char* ssid = "CMCC-y4yk";  //填写个人WIFI信息
const char* password = "hswy6bks";const char* ntpServer = "ntp.aliyun.com";
const char* ntpServer2 = "ntp2.aliyun.com";
const char* ntpServer3 = "time.nist.gov";
const long gmtOffset = 28800;  // 如果需要校准时区,可以根据需要进行调整
const int daylightOffset = 0;uint32_t targetTime = 0;  // for next 1 second timeoutWiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, ntpServer, gmtOffset, daylightOffset);void setup() {// put your setup code here, to run once:// 连接WiFi网络Serial.begin(115200);WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(1000);Serial.println("Connecting to WiFi...");}// 启动NTP客户端timeClient.begin();targetTime = millis() + 1000;
}void loop() {// put your main code here, to run repeatedly:if (targetTime < millis()) {targetTime = millis() + 1000;// 获取NTP时间timeClient.update();// 获取NTP时间的小时、分钟和秒int hours = timeClient.getHours();int minutes = timeClient.getMinutes();int seconds = timeClient.getSeconds();printf("%02d:%02d:%02d\r\n", hours, minutes, seconds);}
}
#endif

七。触摸感应器与有源蜂鸣器一起测试,蜂鸣器叫声很大,很有穿孔力,害怕扰人,测试时手指可以堵住孔

#define beepPin 7                             // 蜂鸣器引脚  
#define touchPin 2                            // 假设的触摸开关引脚  
#define beepTimeInterval 1000                 // 检测一次的时间间隔  unsigned long beepTimes = 0;                  // 记录设备运行时间  void setup() {  Serial.begin(9600);                         // 设置串口波特率为9600  pinMode(beepPin, OUTPUT);                   // 蜂鸣器引脚设置成输出模式  pinMode(touchPin, INPUT_PULLUP);            // 触摸引脚设置为输入,并启用内部上拉电阻  Serial.println("设备上线!");  
}  void loop() {  int touchState = digitalRead(touchPin);     // 读取触摸引脚的状态  if (touchState == HIGH) {                    // 如果触摸引脚被按下(假设低电平表示按下)  digitalWrite(beepPin, LOW);               // 蜂鸣器工作  Serial.println("蜂鸣器打开!");  } else {  digitalWrite(beepPin, HIGH);              // 蜂鸣器停止工作  Serial.println("蜂鸣器关闭!");  }  // 注意:这里去掉了原来的ControlBeep()函数和时间间隔控制,因为现在是即时响应触摸  delay(100);  // 可以稍微减少这里的延时,以便更快地响应触摸,但不建议完全去掉延时  
}  

参考:

机器人研究:基于安卓的视频遥控小车_废旧的android手机做了个机器人-CSDN博客

第二十一篇、基于Arduino uno,控制有源蜂鸣器和无源蜂鸣器发出声音——结果导向_arduino 无源蜂鸣器-CSDN博客Arduino ESP32 获取网络时间方法-CSDN博客

arduino学习笔记二十--无源蜂鸣器+ARDUINO开发板播放音乐_arduino无源蜂鸣器播放音乐-CSDN博客

相关文章:

传感器校正和测试

是 一。舵机在使用过程中为了防止手动扭动损坏其中的齿轮&#xff0c;一般会使用代码测试并校正到0位。 #include <Servo.h> Servo myservo; // 创建一个Servo对象 // 连接到舵机信号线的Arduino引脚 int servoPin 9; void setup() { myservo.attach(servoPin…...

Eclipse 悬浮提示:提高编程效率的利器

Eclipse 悬浮提示&#xff1a;提高编程效率的利器 引言 在当今的软件开发领域&#xff0c;Eclipse 是一款广受欢迎的集成开发环境&#xff08;IDE&#xff09;。它以其强大的功能和灵活性而著称&#xff0c;被全球的开发者用于各种编程语言和项目。Eclipse 的一个显著特点是其…...

Vault系列之:创建令牌

Vault系列之&#xff1a;创建令牌 一、Vault令牌二、令牌认证三、创建一个新的令牌四、使用令牌登陆五、 撤销令牌 一、Vault令牌 Vault令牌是Vault服务器提供的一种身份验证方式&#xff0c;用于授权和访问Vault中存储的资源。Vault令牌可以是客户端令牌或服务令牌。客户端令…...

如何在 Windows 10 环境下安装和配置 MySQL:初学者指南

如何在 Windows 10 环境下安装和配置 MySQL&#xff1a;初学者指南 MySQL 是一个流行的开源数据库管理系统&#xff0c;广泛应用于各种应用程序中。对于初学者来说&#xff0c;了解如何在 Windows 10 环境下安装和配置 MySQL 是一个重要的第一步。本篇博客将详细介绍如何完成这…...

Ubuntu 24.04上报:Error: could not connect to ollama app, is it running?的解决方法

说起来这个问题真实让人无语。按照我之前说过的方法&#xff1a;设置Ollama在局域网中访问的方法&#xff08;Ubuntu&#xff09;_ollama 局域网访问-CSDN博客 把Ollama的默认端口修改后&#xff0c;如果再运行&#xff1a; ollama ps 则会报下面的错&#xff1a; Error: c…...

字典树查重(到底要开多大的空间啊)

前言&#xff1a;烦死了&#xff0c;这个题目一看就是用字典树来做&#xff0c;但是空间不知道开多大&#xff0c;烦死了 后来发现其实tree的第一维空间直接开极端的情况就行&#xff0c;就好像这一题&#xff0c;最多有 1e4 个字符串&#xff0c;每个字符串最长为 50&#xff…...

财务会计与管理会计(二)

文章目录 多工作表销售数据汇总1、INDIRECT函数2、HLOOKUP函数 多表筛选分类求和1、SUMIF函数2、INDIRECT函数 两组数据比对详解VLOOKUP函数的应用 多工作表销售数据汇总 1、INDIRECT函数 INDIRECT(""&D$4&"!D4:M24") 1月!D4:M24 HLOOKUP($A$1,I…...

技术周总结 08.05-08.11周日

文章目录 一、08.06 周二1.1) 问题01 mac安装 scala:1. 使用 Homebrew2. 使用 SDKMAN!其他注意事项1. 确认 Scala 安装位置2. 设置 PATH 环境变量对于 zsh (macOS Catalina 及更高版本默认使用 zsh):对于 bash (如果您使用的是 bash shell): 3. 验证安装 二、08.09 周五2.1&…...

B树和B+树的插入、删除

1. B树 1.1 B树的定义 树也称树&#xff0c;它是一颗多路平衡查找树。我们描述一颗树时需要指定它的阶数&#xff0c;阶数表示了一个结点最多有多少个孩子结点&#xff0c;用字母表示阶数。当取时&#xff0c;就是我们常见的二叉搜索树。 一颗阶的树定义如下&#xff1a; 每…...

Axios网络请求总结

在实际项目开发中&#xff0c;前端页面所需要的数据往往需要从服务器端获取&#xff0c;这必然涉及与服务器的通信。Axios 是一个基于 promise 网络请求库&#xff0c;作用于node.js 和浏览器中。Axios 在浏览器端使用XMLHttpRequests发送网络请求&#xff0c;并能自动完成JSON…...

立仪科技光谱共焦应用之金属隔膜静态重复性测量

01&#xff5c;检测需求&#xff1a;金属隔膜重复性测量 02&#xff5c;检测方式 为了保证精度&#xff0c;首先先用千分尺进行测量&#xff0c;得出相应的厚度数据&#xff0c;在选择合适的侧头&#xff0c;根据结果&#xff0c;我们现在立仪科技H4UO控制器搭配D27A20侧头 03&…...

vue3实现video视频+弹幕评论

vue3实现视频加评论 之前写了一篇博客使用了弹幕插件http://t.csdnimg.cn/616mlvue3 使用弹幕插件&#xff0c;今天对这个页面进行了升级 变成了 vue3使用video 这个没有使用插件&#xff0c;昨天看了好多&#xff0c;没发现有用的插件&#xff0c;下载了几个都没办法使用就用…...

STM32-OTA升级

一、OTA&#xff08;Over-The-Air&#xff09; OTA&#xff08;Over-The-Air&#xff09;是一种通过无线通信方式&#xff0c;为设备分发新软件、配置甚至更新加密密钥的技术。它允许中心位置向所有用户发送更新&#xff0c;确保每个接收者都无法拒绝、破坏或改变这些更新&…...

一种JSON多态表示法

介绍 假设现在需要实现一种功能: 从某个远程的组件(消息队列或远程文件)拉取最后几条记录做一个展示. 需要支持如下的组件: Kafka RocketMQ OSS 假设还有很多, 这里不列了 … 显然, 每种组件需要的参数各不一样, 那么此时如何使用一个统一的结构来表达这些组件的参数呢?…...

C语言实现单链表

一、什么是单链表 1.链表就是一种在物理存储上各个节点非连续的&#xff0c;随机的&#xff0c;元素的逻辑顺序是通过链表中的指针链接的次序而实现的。 图示&#xff1a; 二、单链表中节点的定义 #include<stdio.h> #include<stdlib.h> #include<string.h>…...

循环神经网络三

一.介绍 在普通的神经网络中&#xff0c;信息的传递是单向的&#xff0c;这种限制虽然使得网络变得更容易学习&#xff0c;单在一定程度上也减弱了神经网络模型的能力。特别是在现实生活中&#xff0c;网络的输出不仅和当前时刻的输入相关&#xff0c;也过去一段时间的输出相关…...

优购电商小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;商品分类管理&#xff0c;商品信息管理&#xff0c;留言板管理&#xff0c;订单管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;商品信息&#xf…...

【ARM】v8架构programmer guide(4)_ARMv8的寄存器

目录 4.4Endianness&#xff08;端序或字节序&#xff09; 4.5 改变execution state 4.5.1 Registers at AArch32 4.5.2 PSTATE at AArch32 4.6 NEON 和浮点数寄存器 4.6.1 AArch64中浮点寄存器的组织结构 4.6.2 标量寄存器大小 4.6.3 向量寄存器大小 4.6.4 NEON在AArc…...

Java设计模式详细讲解

目录 设计模式概述 1.1 什么是设计模式1.2 设计模式的类型1.3 设计模式的历史与发展1.4 设计模式在软件开发中的重要性 创建型模式 2.1 单例模式2.2 工厂方法模式2.3 抽象工厂模式2.4 建造者模式2.5 原型模式 结构型模式 3.1 适配器模式3.2 装饰器模式3.3 代理模式3.4 外观模…...

图论------弗洛伊德(Floyd-Warshall)算法

题目描述&#xff1a; 在每年的校赛里&#xff0c;所有进入决赛的同学都会获得一件很漂亮的 T-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候&#xff0c;却是非常累的&#xff01;所以现在他们想要寻找最短的从商店到赛场的路线&#xff0c;你可以帮助…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...