JavaScript 连接传感器 - 测量真实事物详解

这本书的目标是建立一个家庭安全系统,通过带有传感器的电子控制系统来控制家用电器,并从仪表板上监控它们。首先,我们需要考虑我们的传感器连接到一个终端设备,该设备可以读取信号并将其传输到网络。

对于终端设备,我们将使用 Arduino 板从传感器获取读数。我们可以看到树莓 Pi 没有模拟输入。为此,我们使用 Arduino 板来读取信号。

在前一章中,我们讨论了如何将设备连接到树莓 Pi;在本节中,我们将了解如何将传感器与 Arduino 板接口,以了解如何读取来自不同应用的真实信号进行真实测量。我们将在本章中讨论以下主题:

重要的是要考虑到这样一个事实,即我们需要将我们的系统传达给现实世界。由于我们正在努力构建家庭安全系统,我们需要学习如何与一些必要的传感器连接和交互,以便在我们的系统中使用它们。

在下一节中,我们将介绍您需要用来读取 domotics 和安全系统中使用的数据的传感器。

我们需要对家里使用的水进行自动测量。对于这个项目,我们将使用一个传感器来执行这个读数,并使测量读数自动化。

要做这个项目,我们需要以下材料:

水流传感器和 Arduino UNO 板:

Measuring flow sensor to calculate the volume of water

硬件连接

现在我们有了外部流量传感器的连接。我们可以看到它有三个引脚-红色引脚连接到 +VCC 5 伏,黑色引脚连接到 GND,黄色引脚连接到 Arduino 板的引脚编号 2 ,如下图所示:

Hardware connections

读取传感器信号

中断用于由水流产生的脉冲,如下所述:

attachInterrupt(0, count_pulse, RISING); 

中断类型为RISING对从低电平到高电平的脉冲进行计数:

Function for counting pulses: 

voidcount_pulse() 
{ 
pulse++; 
} 

在这部分代码中,我们解释了它使用中断对来自传感器的信号进行计数,执行,并且我们将其配置为RISING,因此它对从数字信号 0 到数字信号 1 的脉冲进行计数:

int pin = 2; 
volatile unsigned int pulse; 
constintpulses_per_litre = 450; 

void setup() 
{ 
Serial.begin(9600); 

pinMode(pin, INPUT); 
attachInterrupt(0, count_pulse, RISING); 
} 

void loop() 
{ 
pulse=0; 
interrupts(); 
delay(1000); 
noInterrupts(); 

Serial.print("Pulses per second: "); 
Serial.println(pulse); 
} 

voidcount_pulse() 
{ 
pulse++; 
} 

打开 Arduino 串行监视器,用嘴将空气吹过水流传感器。每个循环的每秒脉冲数将打印在 Arduino 串行监视器上,如下图所示:

Reading and counting pulses with Arduino

在这一部分中,我们通过以下步骤测量脉冲并将其转换为水流:

  1. 打开一个新的 Arduino IDE,复制下面的草图。

  2. 在 Arduino 板上验证并上传草图。

            int pin = 2; 
            volatile unsigned int pulse; 
            constintpulses_per_litre = 450; 
    
            void setup() 
            { 
              Serial.begin(9600); 
    
              pinMode(pin, INPUT); 
              attachInterrupt(0, count_pulse, RISING); 
            } 
    
  3. 以下代码将计算从传感器读取的脉冲;我们除以一秒钟内计数的脉冲数,我们得到每升的脉冲数:

          void loop() 
          { 
            pulse = 0; 
            interrupts(); 
            delay(1000); 
            noInterrupts(); 
    
            Serial.print("Pulses per second: "); 
            Serial.println(pulse); 
    
            Serial.print("Water flow rate: "); 
            Serial.print(pulse * 1000/pulses_per_litre); 
            Serial.println(" milliliters per second"); 
            delay(1000); 
          } 
          void count_pulse() 
          { 
            pulse++; 
          } 
    
  4. Open the Arduino Serial Monitor, and blow air through the water flow sensor using your mouth. The number of pulses per second and the water flow rate in milliliters per second will be printed on the Arduino Serial Monitor for each loop, as shown in the following screenshot:

    Calculating water flow rate based on the pulses counted

您现在可以将代码复制到一个名为Flow_sensor_measure_volume.ino的文件中,或者从这个项目的文件夹中获取完整的代码。

在这一部分,我们计算传感器的流量和体积:

int pin = 2; 
volatile unsigned int pulse; 
float volume = 0; 
floatflow_rate =0; 
constintpulses_per_litre = 450; 

我们设置了中断:

void setup() 
{ 
Serial.begin(9600); 
pinMode(pin, INPUT); 
attachInterrupt(0, count_pulse, RISING); 
} 

开始中断:

void loop() 
{ 
pulse=0; 
interrupts(); 
delay(1000); 
noInterrupts(); 

然后我们显示传感器的流量:

Serial.print("Pulses per second: "); 
Serial.println(pulse); 

flow_rate = pulse * 1000/pulses_per_litre; 

我们计算传感器的体积:

Serial.print("Water flow rate: "); 
Serial.print(flow_rate); 
Serial.println(" milliliters per second"); 

volume = volume + flow_rate * 0.1; 

我们以毫升为单位显示体积:

Serial.print("Volume: "); 
Serial.print(volume); 
Serial.println(" milliliters"); 
} 

计数脉冲的功能如下:

Void count_pulse() 
{ 
  pulse++; 
} 

结果可以在下面的截图中看到:

Calculating flow and volume of water:

在液晶显示器上显示测量的参数

您可以在新安装的水表上增加一个液晶显示屏来显示读数,而不是在 Arduino 串行监视器上显示。将草图上传到 Arduino 后,您可以断开水表与计算机的连接。

首先,我们定义液晶屏库:

#include <LiquidCrystal.h> 

然后我们定义将在程序中使用的变量:

int pin = 2; 
volatile unsigned int pulse; 
float volume = 0; 
floatflow_rate = 0; 
constintpulses_per_litre = 450; 

我们定义液晶显示器引脚:

// initialize the library with the numbers of the interface pins 
LiquidCrystallcd(12, 11, 6, 5, 4, 3); 

我们定义了用于检测的中断:

void setup() 
{ 
  Serial.begin(9600); 
  pinMode(pin, INPUT); 
  attachInterrupt(0, count_pulse, RISING); 

现在,我们在液晶屏上显示消息:

  // set up the LCD's number of columns and rows:  
  lcd.begin(16, 2); 
  // Print a message to the LCD. 
  lcd.print("Welcome..."); 
  delay(1000); 
} 

我们现在定义主循环中的中断:

void loop() 
{ 
  pulse = 0; 

  interrupts(); 
  delay(1000); 
  noInterrupts(); 

我们在液晶屏上显示数值:

  lcd.setCursor(0, 0); 
  lcd.print("Pulses/s: "); 
  lcd.print(pulse); 

  flow_rate = pulse*1000/pulses_per_litre; 

然后我们显示流速值:

  lcd.setCursor(0, 1); 
  lcd.print(flow_rate,2);//display only 2 decimal places 
  lcd.print(" ml"); 

我们现在显示音量的值:

  volume = volume + flow_rate * 0.1; 
  lcd.setCursor(8, 1); 
  lcd.print(volume, 2);//display only 2 decimal places 
  lcd.println(" ml "); 
} 

然后我们定义计数脉冲的函数:

void count_pulse() 
{ 
 pulse++; 
} 

下图显示了与水流的连接:

Displaying the parameters measured on an LCD

下图显示了液晶屏上的测量结果:

Displaying the parameters measured on an LCD

你可以在液晶屏上看到一些信息,比如每秒钟的脉冲数,水的流速,以及从时间开始的水的总体积。

在我们的系统中有一个检测气体的传感器是很重要的,这样我们就可以把它应用在我们的家里来检测气体泄漏。现在我们将描述如何连接到 Arduino 板并读取气体浓度。

在本节中,我们将使用气体传感器和甲烷甲烷。在这种情况下,我们将使用 MQ-4 传感器,它可以检测 200 到 10000 ppm 的浓度。

这个传感器的输出端有一个模拟电阻,可以连接到一个模数转换器;它需要 5 伏的线圈能量。传感器的图像如下所示:

Measuring the concentration of gas

我们可以在https://www.sparkfun.com/products/9404找到 MQ-4 传感器的信息。

Measuring the concentration of gas

与传感器和 Arduino 板的连接

根据上图,我们现在将看到下图中的连接:

Connections with the sensor and Arduino board

打开 Arduino IDE,复制如下草图:

void setup(){ 
  Serial.begin(9600); 
} 

void loop() 
{ 
  float vol; 
  int sensorValue = analogRead(A0); 
  vol=(float)sensorValue/1024*5.0; 
  Serial.println(vol,1); 
  Serial.print("Concentration of gas= "); 
  Serial.println(sensorValue); 
  delay(2000); 
} 

我们在屏幕上看到以下结果:

Connections with the sensor and Arduino board

在这一部分,我们将构建一个非常酷的项目:你自己的酒精 呼吸分析仪。为此,我们将使用简单的 Arduino Uno 板和乙醇气体传感器:

Measuring the level of alcohol with a sensor

下图显示了传感器与 Arduino 的连接:

Measuring the level of alcohol with a sensor

我们现在要为这个项目编写代码。在这里,我们将简单地回顾一下代码中最重要的部分。

现在,您可以将代码复制到名为Sensor_alcohol.ino的文件中,或者直接从这个项目的文件夹中获取完整的代码:

int readings=0; 
void setup(){ 
Serial.begin(9600); 
} 

void loop(){ 
lectura=analogRead(A1); 
Serial.print("Level of alcohol= "); 
Serial.println(readings); 
delay(1000); 
} 

当它没有检测到酒精时,我们可以看到 Arduino 读取的数值:

Measuring the level of alcohol with a sensor

如果它检测到酒精,我们会看到从 Arduino 读取的模拟值,如下图所示:

Measuring the level of alcohol with a sensor

如果我们家发生火灾,探测到它是至关重要的;因此,在下一节中,我们将创建一个使用传感器检测火灾的项目。

在下图中,我们看到了火灾传感器模块:

Detecting fire with a sensor

您现在可以将代码复制到一个名为Sensor_fire.ino的文件中,或者从这个项目的文件夹中获取完整的代码。

我们在一开始就为我们的程序定义了变量:

int ledPin = 13;             
int inputPin= 2; 
int val = 0;                    

我们定义输出信号和串行通信:

void setup() { 
pinMode(ledPin, OUTPUT);       
pinMode(inputPin, INPUT);      
Serial.begin(9600); 
} 

现在我们显示数字信号的值:

void loop(){ 
val = digitalRead(inputPin); 
Serial.print("val : ");   
Serial.println(val); 
digitalWrite(ledPin, HIGH);  // turn LED ON 

然后我们比较:如果值检测到高逻辑状态,则关闭输出;如果读反了,就开启数字信号;这意味着它检测到了火灾:

if (val == HIGH) {             
  Serial.print("NO Fire detected "); 
  digitalWrite(ledPin, LOW); // turn LED OFF 
} 
else{ 
  Serial.print("Fire DETECTED "); 
  digitalWrite(ledPin, HIGH);   
  } 
} 

当 Arduino 板检测到火灾时,会在数字输入中读取 *1* ,表示没有火灾检测:

Detecting fire with a sensor

如果检测到火灾,数字输入从数字输入读取 *0* 逻辑:

Detecting fire with a sensor

Measuring the humidity for plants

在本节中,我们将看到使用传感器测试植物内部和土壤的湿度:

Measuring the humidity for plants

我现在将介绍第一段代码的主要部分。然后我们设置串行通信:

int value;   

void setup() { 
Serial.begin(9600); 
}  

在主回路中,我们将读取来自传感器的模拟信号:

void loop(){   
Serial.print("Humidity sensor value:"); 
Value = analogRead(0);   
Serial.print(value);   

我们比较传感器的值,并在串行接口上显示结果:

if (Value<= 300)   
Serial.println(" Very wet");   
if ((Value > 300) and (Value<= 700))   
Serial.println(" Wet, do not water");    
if (Value> 700)   
Serial.println(" Dry, you need to water");  
delay(1000);  
} 

这里,截图显示了读数的结果:

Measuring the humidity for plants

下面的截图显示植物不需要水;因为土壤中已经有足够的水分:

Measuring the humidity for plants

有时候,我们需要测量容器中的水位,或者如果你想看到水箱中的水位,测量水箱中的水位是一项要求;因此,在本节中,我们将解释如何做到这一点。

传感器正常打开。当水超过极限时,触点打开,并向 Arduino 板发送信号。我们使用 pin 号2,这是一个数字输入:

Measuring the level of water in a recipient

我们在程序中声明变量和const:

const int buttonPin = 2;     // the number of the input sensor pin 
const int ledPin =  13;      // the number of the LED pin 

我们还定义了数字信号的状态:

// variables will change: 
intbuttonState = 0;         // variable for reading the pushbutton status 

我们配置程序的信号、输入和输出:

void setup() { 
  // initialize the LED pin as an output: 
pinMode(ledPin, OUTPUT); 
  // initialize the pushbutton pin as an input: 
pinMode(buttonPin, INPUT); 
Serial.begin(9600); 
} 

我们读取数字输入的状态:

void loop() { 
  // read the state of the pushbutton value: 
buttonState = digitalRead(buttonPin); 

我们对传感器进行了比较:

if (buttonState == HIGH) { 
Serial.println(buttonState); 
Serial.println("The recipient is fulled"); 
digitalWrite(ledPin, HIGH); 
delay(1000); 
  } 

如果传感器检测到水平,则接收器为空:

else { 
digitalWrite(ledPin, LOW); 
Serial.println(buttonState); 
Serial.println("The recipient is empty"); 
delay(1000); 
  } 
} 

以下屏幕截图显示了收件人为空时的结果:

Measuring the level of water in a recipient

水超过了极限:

Measuring the level of water in a recipient

在这一节中,我将教你如何在液晶显示屏上监控温度、湿度和光线检测。

硬件和软件要求

在这个项目中,您将使用 Arduino UNO 板;但是你也可以使用一个 Arduino MEGA,它也可以完美地工作。

对于温度读数,我们需要一个 DHT11 传感器、一个 4.7k 的电阻、一个光敏电阻(光传感器)和一个 10k 电阻。

它还需要一个 16 x 2 的液晶显示屏,你在那里进行测试;我在屏幕上使用了一个 I2C 通信模块,与 Arduino 卡接口。我建议使用这种通信方式,因为发送数据只需要 Arduino 的两个引脚:

Hardware and software requirements

最后,它需要一个试验板和公母电缆进行连接。

以下是项目的组件列表:

  • Arduino 一号
  • 温度和湿度传感器 DHT11
  • 液晶显示屏 16 x 2
  • 液晶显示器模块 I2C
  • 面包板
  • 电缆

我们连接不同的组件:

Hardware and software requirements

在这里,我们可以看到温度和湿度传感器 DHT11 的图像:

Hardware and software requirements

然后将 DHT11 传感器(VCC) 的针号 1 连接到试验板上的红线,将 4 (GND)连接到蓝线。另外,将传感器的针号 2 连接到 Arduino 板的针号 7 。要结束 DHT11 传感器,在传感器的针号 12 之间连接 4.7k 欧姆的电阻。

与试验板中的 10k 欧姆电阻串联放置。然后将光敏电阻的另一端连接到试验板上的红色,电阻的另一端连接到蓝色线(地)。最后,将光敏电阻和电阻之间的公共引脚连接到 Arduino 模拟引脚 A0

现在让我们连接液晶屏。由于我们使用的是带有 I2C 接口的液晶显示屏,因此只需要两根电缆连接信号,两根电缆连接能量。将 I2C 模块名为 VDC 的引脚连接到试验板上的红线,将 GND 引脚连接到试验板上的蓝线。然后将 SDA 引脚模块连接至 Arduino 引脚 A4、A5 SCL 引脚以连接 Arduino:

Hardware and software requirements

这是项目的完整图片,因此您可以了解整个项目是什么样的:

Hardware and software requirements

测试传感器

现在硬件项目已经组装完成,我们将测试不同的传感器。为此,我们将用 Arduino 写一个简单的草图。我们将读取传感器数据,并在串行端口上打印这些数据。

您现在可以将代码复制到一个名为Testing_sensors_Temp_Hum.ino的文件中,或者从这个项目的文件夹中获取完整的代码。

首先我们定义库:

#include "DHT.h" 
#define DHTPIN 7  
#define DHTTYPE DHT11 

我们定义传感器的类型:

DHT dht(DHTPIN, DHTTYPE); 

然后我们配置串行通信:

void setup() 
{ 
Serial.begin(9600); 
dht.begin(); 
} 

我们读取传感器值:

void loop() 
{ 
  float temp = dht.readTemperature(); 
  float hum = dht.readHumidity(); 
  float sensor = analogRead(0); 
  float light = sensor / 1024 * 100; 

我们在串行接口上显示这些值:

  Serial.print("Temperature: "); 
  Serial.print(temp); 
  Serial.println(" C"); 
  Serial.print("Humidity: "); 
  Serial.print(hum); 
  Serial.println("%"); 
  Serial.print("Light: "); 
  Serial.print(light); 
  Serial.println("%"); 
  delay(700); 
} 

将代码下载到 Arduino 板上,打开串行监视器显示发送的数据。检查串行端口的传输速度很重要,必须达到 9600。以下是您应该看到的内容:

Testing sensors

在液晶显示器上显示数据

现在下一步是整合我们的信息显示在液晶屏上。传感器读数的部分将是相同的,只是在通信和在液晶显示器上显示数据方面有详细说明。下面是这部分的完整代码,以及一个解释。

您现在可以将代码复制到一个名为LCD_sensors_temp_hum.ino的文件中,或者从这个项目的文件夹中获取完整的代码。

我们包括该计划的库:

#include <Wire.h> 
#include <LiquidCrystal_I2C.h> 
#include "DHT.h" 
#define DHTPIN 7  
#define DHTTYPE DHT11 

我们为液晶屏定义液晶屏地址:

LiquidCrystal_I2C lcd(0x3F,16,2); 
DHT dht(DHTPIN, DHTTYPE); 

我们启动液晶显示屏:

void setup() 
{ 
lcd.init(); 
lcd.backlight(); 
lcd.setCursor(1,0); 
lcd.print("Hello !!!"); 
lcd.setCursor(1,1); 
lcd.print("Starting ..."); 

我们定义dht传感器的开始:

dht.begin(); 
delay(2000); 
lcd.clear(); 
} 

我们读取传感器并将值保存在变量中:

void loop() 
{ 
  float temp = dht.readTemperature(); 
  float hum = dht.readHumidity(); 
  float sensor = analogRead(0); 
  float light = sensor / 1024 * 100; 

我们在液晶屏上显示数值:

  lcd.setCursor(0,0); 
  lcd.print("Temp:"); 
  lcd.print(temp,1); 
  lcd.print((char)223); 
  lcd.print("C"); 
  lcd.setCursor(0,1); 
  lcd.print("Hum:"); 
  lcd.print(hum); 
  lcd.print("%"); 
  lcd.setCursor(11,1); 
  //lcd.print("L:"); 
  lcd.print(light); 
  lcd.print("%"); 
  delay(700); 
} 

下一步是在 Arduino 板上下载示例;等一会儿,你会在液晶显示器上看到显示读数。这是一张正在进行的项目图片:

Displaying data on the LCD

我们将构建一个带有普通家庭自动化传感器的项目:运动传感器(PIR)。你有没有注意到那些在房子的一些房间的顶角的白色小塑料模块,当有人走在它们前面时,这些模块会变成红色?这正是我们在这个项目中要做的。

运动传感器必须有三个引脚:两个用于电源,一个用于信号。您还应该使用 5V 的电压水平来与 Arduino 卡兼容,该卡也以 5V 工作。下图显示了一个简单的运动传感器:

Detecting motion with a PIR sensor

出于实用目的,我们将使用信号输入 8 连接运动传感器、5 伏信号电压和接地 GND。

与 Arduino 接口的 PIR 传感器

PIR 传感器检测人体热量(红外线能量)。被动红外传感器是家庭安全系统中应用最广泛的运动探测器。一旦传感器变暖,它就可以检测周围区域的热量和运动,从而形成一个保护网格。如果一个移动物体阻挡了太多的网格区域,并且红外能量水平变化很快,传感器就会跳闸。

此时,我们将测试 Arduino 和运动传感器之间的通信。

我们定义变量和串行通信,定义数字引脚 8,输入信号,读取信号状态,并显示传感器的状态信号:

int sensor = 8;
void setup() {
Serial.begin(9600);
pinMode(sensor,INPUT);
}
void loop(){
// Readind the sensor
int state = digitalRead(sensor);
Serial.print("Detecting sensor: ");
Serial.println(state);
delay(100);
}

增加了一个示例,作为实现磁性传感器的选项,以便检测门或窗何时打开或关闭。

Detecting if the door is open with a reed switch

传感器检测到磁场时输出0,当磁场远离时输出为1;这样你就能确定门是开着还是关着。

Arduino 中的程序执行如下:

我们定义传感器的输入信号,并配置串行通信:

void setup() { 
  pinMode(sensor, INPUT_PULLUP); 
  Serial.begin(9600); 
} 

我们读取传感器的状态:

void loop() { 
state = digitalRead(sensor); 

它比较数字输入,并在串行接口中显示门的状态:

  if (state == LOW){ 
    Serial.println("Door Close"); 
  } 
  if (state == HIGH){ 
    Serial.println("Door Open"); 
  } 
} 

在这一部分,我们将创建一个项目,可以帮助我们制作一个完整的安全系统。在本项目中,指纹访问将通过使用指纹传感器读取指纹来解决,如下图所示:

Detecting who can get in the house with a fingerprint sensor

在这一部分,我们将看到如何连接和配置我们的硬件,以激活我们的继电器。

硬件配置:

像往常一样,我们将使用 Arduino Uno 板作为项目的大脑。这个项目最重要的部分是指纹传感器。

我们首先要看如何组装这个项目的不同部分。让我们从连接电源开始。将 Arduino 板上的 5V 引脚连接到红色电源轨,将 Arduino 板上的 GND 连接到试验板上的蓝色电源轨。

现在,让我们连接指纹传感器。首先,通过将电缆连接到试验板上各自的颜色来连接电源。然后,将传感器的白线连接到 Arduino 引脚 3,将绿线连接到引脚 2。

之后,我们将连接继电器模块。将 VCC 引脚连接到红色电源轨, GND 引脚连接到蓝色电源轨, EN 引脚连接到 Arduino 引脚 7:

Hardware configuration:

保存指纹:

下面的例子是直接从库中注册身份证的指纹Adafruit_Fingerprint

首先,我们定义库:

#include <Adafruit_Fingerprint.h> 
#include <SoftwareSerial.h> 

我们定义阅读的标识和注册过程的功能:

uint8_t id; 
uint8_tgetFingerprintEnroll(); 

我们定义与设备的串行通信:

SoftwareSerialmySerial(2, 3); 
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial); 

我们声明传感器的实例:

//Adafruit_Fingerprint finger = Adafruit_Fingerprint(&Serial1); 

我们设置并显示传感器是否正在配置:

void setup()   
{ 
  while (!Serial); 
  delay(500); 

我们显示传感器确认:

  Serial.begin(9600); 
  Serial.println("Adafruit Fingerprint sensor enrollment"); 
  // set the data rate for the sensor serial port 
  finger.begin(57600); 

如果传感器检测到:

  if (finger.verifyPassword()) { 
  Serial.println("Found fingerprint sensor!"); 
  } else { 
    Serial.println("Did not find fingerprint sensor :("); 
    while (1); 
    } 
  } 
  uint8_treadnumber(void) { 
  uint8_tnum = 0; 
  booleanvalidnum = false;  
  while (1) { 
    while (! Serial.available()); 
      char c = Serial.read(); 
      if (isdigit(c)) { 
        num *= 10; 
        num += c - '0'; 
        validnum = true; 
        } else if (validnum) { 
          returnnum; 
        } 
      } 
    } 

我们显示注册标识:

void loop()                     // run over and over again 
{ 
Serial.println("Ready to enroll a fingerprint! Please Type in the ID # you want to save this finger as..."); 
id = readnumber(); 
Serial.print("Enrolling ID #"); 
Serial.println(id); 

while (!  getFingerprintEnroll() ); 
} 

注册的功能如下:

uint8_tgetFingerprintEnroll() { 
int p = -1; 
Serial.print("Waiting for valid finger to enroll as #"); Serial.println(id); 
while (p != FINGERPRINT_OK) { 
    p = finger.getImage(); 
switch (p) { 
case FINGERPRINT_OK: 
Serial.println("Image taken"); 
break; 
case FINGERPRINT_NOFINGER: 
Serial.println("."); 
break; 
case FINGERPRINT_PACKETRECIEVEERR: 
Serial.println("Communication error"); 
break; 
case FINGERPRINT_IMAGEFAIL: 
Serial.println("Imaging error"); 
break; 
default: 
Serial.println("Unknown error"); 
break; 
    } 
  } 

如果传感器成功读取图像,您会看到以下内容:

  p = finger.image2Tz(1); 
switch (p) { 
case FINGERPRINT_OK: 
Serial.println("Image converted"); 
break; 
case FINGERPRINT_IMAGEMESS: 
Serial.println("Image too messy"); 
return p; 
case FINGERPRINT_PACKETRECIEVEERR: 
Serial.println("Communication error"); 
return p; 
case FINGERPRINT_FEATUREFAIL: 
Serial.println("Could not find fingerprint features"); 
return p; 
case FINGERPRINT_INVALIDIMAGE: 

如果它找不到指纹特征,您会看到以下内容:Serial.println(“找不到指纹特征”);

return p; 
default: 
Serial.println("Unknown error"); 
return p; 
  } 

卸下指纹传感器:

Serial.println("Remove finger"); 
delay(2000); 
  p = 0; 
while (p != FINGERPRINT_NOFINGER) { 
p = finger.getImage(); 
  } 
Serial.print("ID "); Serial.println(id); 
p = -1; 
Serial.println("Place same finger again"); 
while (p != FINGERPRINT_OK) { 
    p = finger.getImage(); 
switch (p) { 
case FINGERPRINT_OK: 
Serial.println("Image taken"); 
break; 
case FINGERPRINT_NOFINGER: 
Serial.print("."); 
break; 
case FINGERPRINT_PACKETRECIEVEERR: 
Serial.println("Communication error"); 
break; 
case FINGERPRINT_IMAGEFAIL: 
Serial.println("Imaging error"); 
break; 
default: 
Serial.println("Unknown error"); 
break; 
    } 
  } 

指纹传感器的图像:

  p = finger.image2Tz(2); 
switch (p) { 
case FINGERPRINT_OK: 
Serial.println("Image converted"); 
break; 
case FINGERPRINT_IMAGEMESS: 
Serial.println("Image too messy"); 
return p; 
case FINGERPRINT_PACKETRECIEVEERR: 
Serial.println("Communication error"); 
return p; 
case FINGERPRINT_FEATUREFAIL: 
Serial.println("Could not find fingerprint features"); 
return p; 
case FINGERPRINT_INVALIDIMAGE: 
Serial.println("Could not find fingerprint features"); 
return p; 
default: 
Serial.println("Unknown error"); 
return p; 
  } 

如果正确,您会看到以下内容:

Serial.print("Creating model for #");  Serial.println(id); 

  p = finger.createModel(); 
if (p == FINGERPRINT_OK) { 
Serial.println("Prints matched!"); 
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) { 
Serial.println("Communication error"); 
return p; 
  } else if (p == FINGERPRINT_ENROLLMISMATCH) { 
Serial.println("Fingerprints did not match"); 
return p; 
  } else { 
Serial.println("Unknown error"); 
return p; 
  }    

显示传感器的结果:

Serial.print("ID "); Serial.println(id); 
  p = finger.storeModel(id); 
if (p == FINGERPRINT_OK) { 
Serial.println("Stored!"); 
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) { 
Serial.println("Communication error"); 
return p; 
  } else if (p == FINGERPRINT_BADLOCATION) { 
Serial.println("Could not store in that location"); 
return p; 
  } else if (p == FINGERPRINT_FLASHERR) { 
Serial.println("Error writing to flash"); 
return p; 
  } else { 
Serial.println("Unknown error"); 
return p; 
}    
} 

测试传感器

打开串行监视器,然后键入上一步中保存的标识号:

Testing the sensor

以下截图表明您应该再次将同一根手指放在传感器上:

Testing the sensor

以下屏幕截图显示传感器响应表明数字指纹已成功保存:

Testing the sensor

在这一章中,我们看到了如何与连接到 Arduino 板上的不同传感器进行交互,例如用于能耗的流量电流、检测家中的风险、实现气体传感器、实现流量水传感器来测量水量、制作安全系统以及使用指纹传感器控制访问。所有这些传感器都可以集成为一个完整的系统,用于监视和控制您在任何项目中所做的一切。

在下一章中,我们将看到如何集成所有东西来监控一个完整的系统,并使用您的 Arduino 板和树莓 Pi Zero 作为中央界面来读取仪表板中的传感器和执行器。

教程来源于Github,感谢apachecn大佬的无私奉献,致敬!

技术教程推荐

趣谈Linux操作系统 -〔刘超〕

架构实战案例解析 -〔王庆友〕

分布式数据库30讲 -〔王磊〕

Django快速开发实战 -〔吕召刚〕

乔新亮的CTO成长复盘 -〔乔新亮〕

手把手带你写一门编程语言 -〔宫文学〕

遗留系统现代化实战 -〔姚琪琳〕

人人都用得上的数字化思维课 -〔付晓岩〕

Python实战 · 从0到1搭建直播视频平台 -〔Barry〕