Main Content

本页采用了机器翻译。点击此处可查看最新英文版本。

使用声纳接近传感器进行原型设计

此示例展示了如何使用 Wi-Fi 连接的 Arduino® 板通过 ThingSpeak™ 进行原型设计。

您可以使用 ThingSpeak 通信库读取和写入通道数据。在此示例中,从 ThingSpeak 读取可调整阈值以创建接近检测器。该硬件由带有声纳传感器的 Arduino MKR100 和用于显示物体何时存在的 LED 指示灯组成。

传感器项目原型设计可能需要多次重新刷新代码以微调校准参数,例如温度传感器的校准参数。硬件调整会增加复杂性、降低可靠性,并且在部署项目时可能难以实现。相反,您可以从 ThingSpeak 读取校准参数并实时更改参数。当您调整 ThingSpeak 上存储的调整参数时,您可以提高测量质量。

支持的硬件

  • Arduino MKR1000

  • 具有无线网络或以太网连接的 Arduino Uno、Mega、Due 或 Leonardo

  • 粒子光子(带有一些代码和原理图调整)

在此示例中,声纳传感器监控订书机并将测量结果发布到您的通道。声纳传感器的工作原理是发送声音脉冲并测量脉冲从物体返回所需的时间。系统使用从 ThingSpeak 读取的距离阈值,并将该阈值与测量的距离进行比较。当有订书机时 LED 亮起。

PrototypingWithSonarProximitySensorTSExample_01.png

完成此示例后,您将看到通道中的邻近数据和设置。ThingSpeak通道视图显示以下接近数据和设置:

  • 阈值设置为 15 厘米

  • 每个平均值进行十次测量

  • 读取标志设置为强制读取校准参数

  • 数据显示,有人在上午 11 点“借用”了订书机,随后又将其归还到新位置

所需硬件

  • Arduino MKR1000 或其他具有以太网或无线网络连接的 Arduino

  • HC-SR04声纳传感器

  • 跳线(至少 4 条)

  • LED

  • 小电阻 (100 Ω – 1 kΩ)

  • USB电缆

通道设置

1)创建ThingSpeak通道,如Collect Data in a New Channel所示。将数据存储在第一个字段中,并将设备设置存储在后续字段中。设备设置包括距离阈值、平均测量次数以及控制设备是否更新每个循环上的设置的标志。

2) 启用“通道设置”视图中的字段 1、2、3 和 4。为了区分这些字段,请为每个字段提供描述性名称。此图显示了配置为在第一个字段中收集数据并将校准参数存储在字段 2、3 和 4 中的单个通道。

3) 请注意“通道设置”视图中“API 密钥”“”选项卡中适当的读取和写入 API 密钥(图中圈出)。

4) 使用浏览器窗口填充校准字段。您可以从“API 密钥”选项卡复制文本,或使用您的写入 API 密钥修改此文本。将每个 URL 直接输入到浏览器的地址栏中,将您的写入 API 密钥更改为您通道的写入 API 密钥。

a.设置检测对象的阈值(50 厘米是一个很好的起点):

https://api.thingspeak.com/update?api_key=YOUR WRITE API KEY&field2=THRESHOLD

b.设置要平均的测量次数:

https://api.thingspeak.com/update?api_key=YOUR WRITE API KEY&field3=NUMTOAVERAGE

设置控制标志,以便设备定期检查新设置:

https://api.thingspeak.com/update?api_key=YOUR WRITE API KEY&field4=1

浏览器返回通道中的条目数。如果您刚刚创建通道,则在填充三个必需的校准字段时,您会看到 1、2 和 3。

原理图和连接

1) 将 VCC 连接到 MKR-1000 上的 5 V。

2) 将传感器地连接到Arduino地。

3) 将 Trig 引脚连接到 Arduino 引脚 8。

4) 将 Echo 引脚连接到 Arduino 引脚 12。

5) 将电阻连接到Arduino引脚5,并将电阻连接到LED指示灯。将 LED 的阳极接地。

为您的 Arduino 编程

1)下载最新的Arduino IDE。

2) 将ThingSpeak Library for Arduino and ESP8266添加到库管理器中。选择Sketch> Include Library> Manage Libraries。选择 ThingSpeak 将其添加到代码中。

3)在库管理器中添加WiFi101库。注意: 确保安装该库的 0.13 版本。0.14版本有一个bug,导致发帖失败。选择Sketch> Include Library> Manage Libraries。选择 WiFi101 将其添加到代码中。

4) 创建应用。在 Arduino IDE 中打开一个新窗口并保存文件。添加代码部分中提供的代码。请务必编辑无线网络信息、通道ID 和 API 密钥。

5) 成功上传程序后,您可以使用串行监视器监视输出。如果某个物体的距离小于设定阈值,您的设备会将距离发布到您的通道。尝试尝试平均测量次数,看看测量的波动如何变化。设置参数后,您可以将读取标志的值从 1 更改为 0。一旦您的设备读取此标志为 0,它就会停止检查 ThingSpeak 参数,从而节省电量和带宽。

代码

1) 包含库并初始化控制引脚。

#include <ThingSpeak.h>
#include<WiFi101.h>

#define triggerPin 8
#define echoPin 12
#define LEDpin 6

2) 定义并初始化变量。请务必编辑无线网络信息、通道ID 和 API 密钥。在您的通道通道。

// Network information
const char* ssid = "SSID";
const char* password = "xxxxxxxxxx";

// ThingSpeak information
char* writeAPIKey = "XXXXXXXXXXXXXXXX";
char* readAPIKey = "YYYYYYYYYYYYYYYY"; 
const long channelID = 000000; 
const unsigned int firstReadFieldNumber = 2;
const unsigned int secondReadFieldNumber = 3; 
const unsigned int switchField = 4; // Field number (1-8) to use to change status of device.  Determines if data is read from ThingSpeak.

// Other constants
const unsigned long postingInterval = 60L * 1000L;   // Post data every 60 seconds

// Global variables
unsigned long lastConnectionTime = 0;
long lastUpdateTime = 0;
float distanceThreshold = 0;
bool getInfo = 1;  // Set this to zero if you don’t want to read data from ThingSpeak anymore (i.e. calibration complete)
int points = 7; 
WiFiClient client; 

3) 初始化输入输出引脚,并在setup例程中首次读取校准参数。

void setup() {
  Serial.begin (9600); 
  pinMode(triggerPin, OUTPUT); 
  pinMode(LEDpin, OUTPUT);
  pinMode(echoPin, INPUT);
  connectWifi();
  Serial.println("Start");

  // Get the initial parameters from ThingSpeak.
  distanceThreshold = readTSData(channelID,firstReadFieldNumber,readAPIKey); 
  points = readTSData(channelID,secondReadFieldNumber,readAPIKey);   
}

4) 每次执行主循环时,进行多次测量。如果一段时间内未将数据写入 ThingSpeak,请将数据写入输出通道。另外,如果上次读取标志为真,请检查每个周期中的校准数据和标志。

void loop() {
  
  float  distance=0;

  // Make sure there is an Internet connection.
  if(WiFi.status() != WL_CONNECTED){
    
    connectWifi();  
    }

     for (uint16_t loops = 0; loops < points; loops++){
      distance += getDistance(triggerPin,echoPin);  //make a measurement, store the sum of all measurements
      delay(5);  
     }
     
     distance = distance/points;
     
    if (distance < distanceThreshold){
      digitalWrite(LEDpin,HIGH);
      }
    
     else{
      
      digitalWrite(LEDpin,LOW); 
      }
      
     
     Serial.println("Ave: "+ String(distance)+ " cm");
      
    if (millis() - lastUpdateTime >=  postingInterval) {  
      
      lastUpdateTime = millis();
      
           if (!(getInfo==0)){
            
            distanceThreshold = readTSData(channelID,firstReadFieldNumber,readAPIKey);
            points = readTSData(channelID,secondReadFieldNumber,readAPIKey);
            getInfo = (bool)readTSData(channelID,switchField,readAPIKey);
            }
            
       if (distance < distanceThreshold){
        
      // Write data to ThingSpeak channel.
       writeTSData(channelID, 1, distance, writeAPIKey);
       }
       
      }
      
    delay(500);    // Provide some delay between measurements.
    
}

5) 使用这些函数在 ThingSpeak 中读取和写入数据。

int writeTSData(long TSChannel,unsigned int TSField,float data,char* ReadAPIKey){
  int  writeSuccess = ThingSpeak.writeField(TSChannel, TSField, data, writeAPIKey); //write the data to the channel
  return writeSuccess;
}

// Use this function if you want multiple fields simultaneously.
/*
int writeTDData(long TSChannel,unsigned int TSField1,float data1,unsigned int TSField2,data2,char* ReadAPIKey){
  ThingSpeak.setField(TSField1,data1);
  ThingSpeak.setField(TSField1,data2);
   
  writeSuccess = ThingSpeak.writeFields(TSChannel, writeAPIKey);
  return writeSuccess;
}
*/
 
float readTSData(long TSChannel,unsigned int TSField,char* ReadAPIKey){
  
  float data = 0;
  
  data = ThingSpeak.readFloatField(TSChannel,TSField,ReadAPIKey);
  Serial.println(" Data read from ThingSpeak "+String(data));
  return data;
}

6) 使用 getDistance 从传感器获取单个测量值。

float getDistance(int tPin,int ePin){
  
  long duration, distance;
    
  digitalWrite(tPin, LOW);  // Reset the trigger pin.
  delayMicroseconds(2); 
  digitalWrite(tPin, HIGH);  // Start a measurement.
  delayMicroseconds(10); // 
  digitalWrite(tPin, LOW);   // Complete the pulse.
  duration = pulseIn(ePin, HIGH);  // Wait for a reflection pulse.
  distance = (duration/2) / 29.1;     // Calculate the appropriate distance using the estimated speed of sound.

  // This section is useful when debugging the sensor.
/*
  if (distance >= 200 || distance <= 0){
    Serial.println("Out of range");
  }
  else {
   Serial.print(distance);
   Serial.println(" cm");
  }
  */
  return distance;
}

7) 使用 connectWiFi 功能将您的设备连接到无线网络。

int connectWifi(){
     
    while (WiFi.status() != WL_CONNECTED) {
       WiFi.begin(ssid, password);
       delay(2500);
       Serial.println("Connecting to WiFi");
    }
    
    Serial.println("Connected");
    ThingSpeak.begin(client);
  }