传感器校正和测试

一。舵机在使用过程中为了防止手动扭动损坏其中的齿轮,一般会使用代码测试并校正到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; //将回波时间换算成cm
  Serial.print("前方障碍距离当前位置:");
	Serial.print(Value_cm);
	Serial.println("cm");
	delay(1000);
}

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

cpp 复制代码
/*
  注意:低电平触发,给低电平就有声音,高电平没有声音,一定的工作频率
*/
/****************************************有源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);                         //设置串口波特率为9600
  pinMode(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测试联网,虽然区分了,但验证可以互用。

cpp 复制代码
//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 Sunday
  Serial.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 timeout

WiFiUDP 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

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

cpp 复制代码
#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博客

相关推荐
时光の尘8 分钟前
C语言菜鸟入门·关键字·float以及double的用法
运维·服务器·c语言·开发语言·stm32·单片机·c
嵌入式大圣2 小时前
单片机结合OpenCV
单片机·嵌入式硬件·opencv
日晨难再3 小时前
嵌入式:STM32的启动(Startup)文件解析
stm32·单片机·嵌入式硬件
yufengxinpian4 小时前
集成了高性能ARM Cortex-M0+处理器的一款SimpleLink 2.4 GHz无线模块-RF-BM-2340B1
单片机·嵌入式硬件·音视频·智能硬件
__基本操作__5 小时前
历遍单片机下的IIC设备[ESP--0]
单片机·嵌入式硬件
网易独家音乐人Mike Zhou11 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
zy张起灵11 小时前
48v72v-100v转12v 10A大功率转换电源方案CSM3100SK
经验分享·嵌入式硬件·硬件工程
PegasusYu14 小时前
STM32CUBEIDE FreeRTOS操作教程(九):eventgroup事件标志组
stm32·教程·rtos·stm32cubeide·free-rtos·eventgroup·时间标志组
lantiandianzi18 小时前
基于单片机的多功能跑步机控制系统
单片机·嵌入式硬件
文弱书生65618 小时前
输出比较简介
stm32