37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验七:旋转电位器模块 旋钮编码器电路板 模拟量输出0-5V电压 电子积木
电位器模块实验环境
1、实验所需硬件清单——
电位器模块X1
Arduino Uno开发板 X1
杜邦线 若干(备了8条)
LED发光二极管(蓝色)X1
220欧姆限流电阻(1/8W)x1
SG90 9g舵机模块(180度)X1
有源蜂鸣器模块(低电平触发)X1
Proto Shield 原型扩展板(带mini面包板)X1
(3)实验九开源仿真编程(Linkboy V4.2)串口输出
(4)实验十开源图形编程(Mind+、编玩边学)
4、实验四:用电位器模块控制舵机(SG90 9g)
(1)安装库:IDE-工具-管理库-搜索“Servo”-安装
(2)实验十一参考开源代码(Arduino):
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验十一:用电位器模块控制舵机(SG90 9g)
安装库:IDE-工具-管理库-搜索“Servo”-安装
实验接线:电位器模块OUT接Uno的A0,舵机S端接D9
*/
#include // 声明调用 Servo.h 库
Servo myservo; // 创建一个舵机对象
int potpin =A0; // 连接到模拟口 A0
int val; //变量 val 用来存储从模拟口A0读到的值
void setup()
{
myservo.attach(9); // 将引脚D9上的舵机与声明的舵机对象连接起来
}
void loop()
{
val = analogRead(potpin); //从模拟口A0读值,并通过val 记录
val = map(val, 0, 1023, 0, 179); //通过 map 函数进行数值转换
myservo.write(val); // 给舵机写入角度
delay(15); // 延时 15ms 让舵机转到指定位置
}
(3)实验四场景图
5、实验十四:利用电位器A0输入的模拟量,控制8位LED点亮状态
(1)实验说明:电位器阻值为0时,LED灯全熄灭,随着选择电位器阻值增大,逐个点亮8只LED灯,反向旋转电位器,则LED灯逐个熄灭。图为实验五接线示意图。
(2)实验十四参考开源代码(Arduino):
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验十四:电位器调速并带蜂鸣的8位跑马灯
实验接线:电位器模块OUT接Uno的A1,8只LED灯分别接D2~D9
*/
// 模拟输入引脚定义(电位器)
const int analogPin = A1;
// 引脚定义 LED 个数
const int LEDCount = 8;
// 对应的 LED 引脚
int LEDPins[] = {
2,
3,
4,
5,
6,
7,
8,
9,
};
void setup() {
// 循环设置,把对应的 LED 都设置成输出
for (int thisLED = 0; thisLED < LEDCount; thisLED++) {
pinMode(LEDPins[thisLED], OUTPUT);
}
}
void loop() {
// 读取电位器的值
int sensorReading = analogRead(analogPin);
// 把对应的值转化成 0 - 最大 LED 个数,这里设置的是 8
int LEDLevel = map(sensorReading, 0, 1023, 0, LEDCount);
// 循环对比输出到 LED
for (int thisLED = 0; thisLED < LEDCount; thisLED++) {
if (thisLED < LEDLevel) {
digitalWrite(LEDPins[thisLED], HIGH);
} else {
digitalWrite(LEDPins[thisLED], LOW);
}
}
}
(3)实验五场景图
(4)实验十五开源代码(Arduino):
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验十五:电位器调速并带蜂鸣的8位跑马灯之二
实验接线:电位器模块OUT接Uno的A0,8只LED灯分别接D0~D7
*/
const int ledCount = 8;
void setup() {
for (int i = 0; i < ledCount; ++i) {
pinMode(i, OUTPUT);
}
}
void loop() {
int sensorRead = analogRead(A0); // 获取A0端口的模拟量值
int ledLevel = map(sensorRead, 0, 1023, 0, 8);
// 进行map转换,范围为0~1023,输出值在0~8之间
for (int i = 0; i < ledCount; ++i) {
digitalWrite(i, i < ledLevel ? HIGH : LOW);
}
}
(5)实验十五接线示意图
6、实验十六:电位器调速并带蜂鸣的8位跑马灯
(1)实验说明:这个实验比较麻烦,因为这个实验包含了跑马灯、蜂鸣器和电位器。电位器阻值越大,跑马灯速度越慢,间隔时间根据电位器的阻值采样为:(100+2×采样值)毫秒,采样值为0~1023。即100~2146毫秒之间,每次点亮LED时,蜂鸣器都会蜂鸣一次(20毫秒)。
实验十六参考开源代码(Arduino):
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验十六:电位器调速并带蜂鸣的8位跑马灯
实验接线:电位器模块OUT接Uno的A0,8只LED灯分别接D2~D9
低电平触发蜂鸣器接D12
*/
#define Pot A0 //电位器引脚创建A0
#define Buzzer 12 //蜂鸣器接D12
byte ledPin[] = {2, 3, 4, 5, 6, 7, 8, 9}; //Port 2~9 LED输出,高电平有效
int ledDelay;
int dir = 1;
int currentLED = 0;
int PotBuffer = 0;
unsigned long changeTime;
void setup() {
pinMode(Buzzer, OUTPUT); //蜂鸣器为输出
digitalWrite(Buzzer, HIGH); //蜂鸣器初始为不鸣叫
for (int x = 0; x < 8; x++)
{
pinMode(ledPin[x], OUTPUT); // LED为输出
}
changeTime = millis();
}
void loop(){
PotBuffer = analogRead(Pot); //读取AD值
if ((millis() - changeTime) > 20) //判断蜂鸣时间是否到了20ms
{
digitalWrite(Buzzer, HIGH); //到了则关断蜂鸣器
}
if ((millis() - changeTime) > ledDelay) //判断是否到了LED持续点亮的时间
{
changeLED(); //到了则点亮下一个LED
changeTime = millis(); //再设置现在点亮的起始时间
}
}
void changeLED() {
for (int x = 0; x < 8; x++) {
digitalWrite(ledPin[x], LOW);
}
digitalWrite(ledPin[currentLED], HIGH);
//BuzzerDi();
digitalWrite(Buzzer, LOW);
ledDelay = 20 + 2 * PotBuffer;
currentLED += dir;
if (currentLED == 7) {
dir = -1;
}
if (currentLED == 0) {
dir = 1;
}
}
(3)实验十六场景图