// Incluir bibliotecas e inicializar los pines de control.
#include <ThingSpeak.h>
#include <WiFi101.h>
#define triggerPin 0
#define echoPin 5
#define LEDpin 4
//Definir e inicializar las variables. Asegúrese de editar la información de la red inalámbrica, la ID del canal y las claves API. Encuentra el ID de tu canal en la parte superior de la página principal de tu canal.
// información de red
const char* ssid = "sagemcomC4B9";
const char* password = "JGNWUWKNWZ53QDN";
// información de ThingSpeak
char* writeAPIKey = "DYU2527WSP7ACFNO";
char* readAPIKey = "ZD5Z4QF758QG200U";
const long channelID = 000000;
const unsigned int firstReadFieldNumber = 2;
const unsigned int secondReadFieldNumber = 3;
const unsigned int switchField = 4; // Número de campo (1-8) que se utilizará para cambiar el estado del dispositivo. Determina si los datos se leen desde ThingSpeak.
// Otras constantes
const unsigned long postingInterval = 60L * 1000L; // Publicar datos cada 60 segundos
// Variables globales
unsigned long lastConnectionTime = 0;
long lastUpdateTime = 0;
float distanceThreshold = 0;
bool getInfo = 1; // Establece esto en cero si ya no deseas leer datos de ThingSpeak (es decir, calibración completa)
int points = 7;
WiFiClient client;
// Inicialice los pines de entrada y salida y lea los parámetros de calibración por primera vez en la setuprutina.
void setup() {
Serial.begin(9600);
pinMode(triggerPin, OUTPUT);
pinMode(LEDpin, OUTPUT);
pinMode(echoPin, INPUT);
connectWifi();
Serial.println("Start");
// Obtener los parámetros iniciales de ThingSpeak.
distanceThreshold = readTSData(channelID, firstReadFieldNumber, readAPIKey);
points = readTSData(channelID, secondReadFieldNumber, readAPIKey);
}
//Cada vez que se ejecuta el bucle principal, tome varias medidas.
//Si los datos no se han escrito en ThingSpeak durante un tiempo, escríbalos en el canal de salida.
//Además, si la última vez que el indicador de lectura fue leído como verdadero,
//verifique los datos de calibración y los indicadores en cada ciclo.
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); //realiza una medición, almacena la suma de todas las mediciones
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) {
// Escribe datos en el canal ThingSpeak.
writeTSData(channelID, 1, distance, writeAPIKey);
}
}
delay(500); // // Proporcionar cierto retraso entre mediciones.
// Utilice estas funciones para leer y escribir datos hacia y desde ThingSpeak Utilice estas funciones para leer y escribir datos hacia y desde 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) Utilícelo getDistancepara obtener una única medición del sensor.
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;
}
//Conecte su dispositivo a una red inalámbrica usando la connectWiFifunción.
int connectWifi() {
while (WiFi.status() != WL_CONNECTED) {
WiFi.begin(ssid, password);
delay(2500);
Serial.println("Connecting to WiFi");
}
Serial.println("Connected");
ThingSpeak.begin(client);
}