Arduino 的各种传感器使用笔记

前言:

最近正在学习arduino开发,0经验产品入门,期望后续能实现自己需求自己实现,由于本地markdown不方便编辑其他在线文档记录也不太清晰不方便自己持续更新,所以采取掘金在线编辑,如果能顺便帮助其他和我一样的小伙伴也算是意见好事。

目前失业在家想实现一个自动化种植水培菜园,目前正在学习如何使用单片机获取环境数据

本笔记重点记录内容是各种传感器模块的使用,由于是自用不能体现得过于详尽各位看到的老哥如果觉得有优化建议欢迎评论指正。

开发板引脚示意图

放引脚图担心卖我板子的商家跑路了后面找不到了 ESP32-S3-N16R8 入手价26

ESP32-WROOM-32 引脚 入手价 15

8266引脚 入手价 12.4 arduino uno 改进版 入手价 17.5

宏定义

#define 宏名称+针脚号 用法

cpp 复制代码
#define LED 5

注意事项:宏定义区别主要在于宏定义程序执行时是在预处理时执行不需要占用内存空间,变量则是在编译时执行,需要占用内存空间 宏定义不需要类型申明,变量需要类型申明

常用函数:

  • pinMode函数 (针脚模式) 值:INPUT输入模式、OUTPUT输出模式、INPUT_PULLU上拉电阻使之一直保持高电平 用法:
cpp 复制代码
pinMode(引脚, INPUT);
  • digitalWrite函数(数字信号写入) 值:HIGH高电平、LOW低电平 用法:
cpp 复制代码
  pinMode(引脚, OUTPUT);
  digitalWrite(引脚, LOW);

注意事项:该函数必须是输出模式才生效

  • digitalRead函数 (读取数字信号) 值:引脚 用法:
cpp 复制代码
pinMode(引脚,INPUT);
int value = digitalRead(引脚);

注意事项:针脚模式必须设置为输入模式

  • analogWrite函数(模拟信号输出) 值:引脚、脉宽信号值(0~255) 用法:
cpp 复制代码
pinMode(引脚, OUTPUT);
analogWrite(引脚, 230);

注意事项:输出信号为PWM,模式必须为输出模式

  • anologRead函数(模拟信号读取) 值:引脚 用法:
cpp 复制代码
pinMode(引脚, INPUT);
int value = analogRead(引脚);

注意事项:模式必须设置为输入模式,返回值在0~1023之间

  • delay函数(延迟) 值:数值单位(毫秒) 用法:
cpp 复制代码
delay(10000);

注意事项:该函数属于阻塞延迟函数,延迟期间单片机无法执行其他指令,数值单位为毫秒

  • delayMicroseconds函数 值:数值单位(微秒) 用法:
cpp 复制代码
delayMicroseconds(100);
  • Serial.begin(波特率设置) 值:数值 用法
cpp 复制代码
Serial.begin(115200);

注意事项:波特率默认为9600

  • Serial.println(打印串口监视) 值:串口变量 用法:
cpp 复制代码
变量名.anologRead (引脚);
Serial.println(变量名);

注意事项:读取打印之前需要设置读取参数

继电器

描述

继电器就是一个可编程控制的开关,我们可以通过往信号线上输出高电平或者低电平来控制继电器的开合。输出高电平是,继电器常开端口关闭,常闭端口打开,输出低电平是常开端口打开,常闭端口关闭。 继电器的工作原理

继电器是一种电气控制装置,通常用于控制大功率电路的开关。其工作原理基于电磁感应和机械运动两个方面。

当继电器的输入电路(也称为控制电路)通电时,通过它的线圈会产生一个磁场。这个磁场可以吸引或释放继电器中的移动元件,如触点或臂ature。这个移动元件的运动状态将决定继电器的输出电路(也称为负载电路)是否断开或闭合。

举个例子,当一个继电器用于控制一个灯泡的电路时,输入电路将连接到一个开关或其他控制设备。在没有通电的情况下,继电器的输出电路将处于断开状态,灯泡不会发光。当输入电路通电时,继电器的线圈将产生一个磁场,使得移动元件移动并使输出电路连接,从而让电流流经灯泡并使其发光。

继电器的工作原理在电气控制系统中得到广泛应用,例如在自动化控制、电力系统保护、通信系统中等。

控制端

IN1:信号线

VCC:直流供电正极

GND:直流供电负极

开关端口

公共:无论常开模式还是常闭模式都需要连接的端口; 常开:控制端不通电的情况下,常开端口与公共端口是断开状态,通电后变成闭合状态; 常闭:控制段不通电的情况下,常闭端口与公共端口是闭合状态,通电后变成端口状态;

使用loop函数delay方法延时代码示例:

cpp 复制代码
#define PUMP 4 //定义引脚


void setup() {
  pinMode (PUMP,OUTPUT); //设置为输出模式
}

void loop() {
 digitalWrite(PUMP,HIGH);//默认高电平开启
 delay(3000);//维持时间
 digitalWrite(PUMP,LOW);//保持低电平
 delay(10000);//维持时间

使用中断函数定义延时

cpp 复制代码
#define RELAY_PIN   15

// 初始化硬件定时器对象
hw_timer_t *timer = NULL;


void timer_interrupt() {
  digitalWrite(RELAY_PIN, !digitalRead(RELAY_PIN));}

void setup() {
  // 配置 D15 为 GPIO 输出
  pinMode(RELAY_PIN, OUTPUT);

  // 初始化定时器
  timer = timerBegin(0, 80, true);

  // 配置定时器
  timerAttachInterrupt(timer, timer_interrupt, true);

  // 设置定时器模式
  timerAlarmWrite(timer, 500000, true);

  // 启动定时器
  timerAlarmEnable(timer);
}

void loop() {

}

DS18B20温度传感器

参数读取正常,不过只适合测环境温,不防水

示例代码:

cpp 复制代码
#include <OneWire.h>
#include <DallasTemperature.h>


// 定义DS18B20数据口连接arduino的2号IO上
#define ONE_WIRE_BUS 5

// 初始连接在单总线上的单总线设备
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup(void)
{
  // 设置串口通信波特率
  Serial.begin(115200);
  Serial.println("Dallas Temperature IC Control Library Demo");
  // 初始库
  sensors.begin();
}

void loop(void)
{
  Serial.print("获取温度...");
  sensors.requestTemperatures(); // 发送命令获取温度
  Serial.println("成功");
  
  Serial.print("Temperature for the device 1 (index 0) is: ");
  Serial.println(sensors.getTempCByIndex(0));
  delay(500);  
}

DH111温湿度传感器+TM1637数码管展示温湿度

同DS18B20模块一样也是不防水模块,但是有一点很奇怪加上LED后脱机就没法显示了需要注意,我用的开发板是ESP8266UNO正常,UNO测DS18B20接反L和ON常亮好像烧坏,由于不是我需要的部件暂时不纠结。 示例代码:

cpp 复制代码
#include <Arduino.h>
#include "TM1637.h"
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>

// 数码管显示对象的创建
TM1637 tm(8, 9);
DHT_Unified dht(10, DHT11);

void setup() {
    Serial.begin(115200);
    tm.init();
    tm.setBrightness(3);
    dht.begin();
}

void loop() {
    // 1. 读取温湿度数据
    sensors_event_t event;
    dht.temperature().getEvent(&event);
    if (isnan(event.temperature)) {
        Serial.println(F("Error reading temperature!"));
    } else {
        Serial.print(F("Temperature: "));
        Serial.print(event.temperature);
        Serial.println(F("°C"));
        // 显示温度
        tm.display(event.temperature, true, true, 0);
        delay(1000);
    }
    // Get humidity event and print its value.
    dht.humidity().getEvent(&event);
    if (isnan(event.relative_humidity)) {
        Serial.println(F("Error reading humidity!"));
    } else {
        Serial.print(F("Humidity: "));
        Serial.print(event.relative_humidity);
        Serial.println(F("%"));
        // 显示湿度
        tm.display(event.relative_humidity, true, true, 0);
        delay(1000);
    }

}

DS18B20防水探头温度传感器

没有驱动板,由于电源接反导致板子和探头严重发烫,购买处没有说明需要驱动板,暂时没有法确定是否可用,不过由于其防水性很适合我的水培管道和水箱里面采集温度数据。

光敏传感器

相关推荐
广药门徒1 小时前
电脑芯片其实更偏向MPU不是CPU,GPU CPU NPU MPU MCU的区别
单片机·嵌入式硬件
灬若宸2 小时前
14、外部中断
stm32·单片机·嵌入式硬件·系统架构
逼子格5 小时前
【Protues仿真】基于AT89C52单片机的舵机和直流电机控制
单片机·嵌入式硬件·硬件工程·硬件工程师·电机驱动·l298n·直流电机控制
GodKK老神灭5 小时前
STM32 AFIO模块
stm32·单片机·嵌入式硬件
滴啦嘟啦哒7 小时前
【项目复盘】【四轴飞行器设计】驱动开发部分
单片机·面试准备
狂奔的sherry7 小时前
一会儿能ping通一会ping不通解决方案
运维·网络·单片机·嵌入式硬件
qq_401700418 小时前
单片机驱动继电器接口
单片机·嵌入式硬件
anghost1501 天前
基于 STM32 的多传感器健康监测系统设计
stm32·单片机·嵌入式硬件
玉~你还好吗1 天前
【嵌入式电机控制#34】FOC:意法电控驱动层源码解析——HALL传感器中断(不在两大中断内,但重要)
单片机·嵌入式系统·电机控制
STC_USB_CAN_80511 天前
所有普通I/O口都支持中断的51单片机@Ai8051U, AiCube 图形化配置
单片机·嵌入式硬件·51单片机