Skip to main content

Descripción general

En este wiki, estamos introduciendo cómo añadir más módulos Grove al SenseCAP S2110 Sensor Builder y listar todos los compatibles.

Añadir Grove - Sensor de Corriente DC/AC ±5A (ACS70331) al builder y aplicarlo

1. Construir nuevas librerías usando el código fuente de GitHub

Los contenidos aquí están en GitHub donde mantenemos el código.

  • Paso 1: Añadir un archivo sensorNew.hpp a la carpeta src\sensor para el nuevo sensor.

  • Paso 2: Definir la clase del sensor e implementar las funciones init() y sample().

La clase del sensor debe heredar de la clase sensorClass, e implementar las funciones init() y sample(). La función init() se usa para inicializar el sensor, y luego devuelve un valor de desplazamiento de registro para la comunicación Modbus. La función sample() se usa para leer los datos del sensor, devuelve true cuando los datos son válidos, y devuelve false cuando los datos son inválidos.

  • Paso 3: Incluir el archivo sensorNEW.hpp y llamarlo.

Añadir la línea #include "sensorNew.hpp" al archivo src\sensor\sensorBuilder.hpp. En la función setup() del archivo sensorBuilder.ino, crear el objeto de la nueva clase del sensor y llamar a la función SensorBuilder.addSensor() con él como argumento.

Consulte el siguiente código:

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

/* sensor list */
sensorUltrasonic *ultrasonic = new sensorUltrasonic();
SensorBuilder.addSensor(ultrasonic);

// add new sensor to sensor list
sensorNew *newSensor = new sensorNew();
SensorBuilder.addSensor(newSensor);

SensorBuilder.begin();
}
note

La dirección de registro Modbus para el nuevo sensor comenzará desde 0x0034, el ancho de bit del registro para cada valor de medición es 32, por lo que el desplazamiento de dirección de registro entre dos valores de medición adyacentes es 2.

2. Conocimiento de la Tabla de Registros Modbus

Las direcciones de registro Modbus 0x0000 a 0x0003 están reservadas para almacenar información del sistema del módulo, donde 0x0000 es la dirección modbus con un valor predeterminado de 1 y un valor máximo de 247, 0x0001 es la velocidad de baudios del puerto serie con un valor predeterminado de 96 (correspondiente a 9600), y 0x0002 a 0x0003 son para la versión del software.

Nombre del Sensor GroveNombre del RegistroDirección del Registro
(Hexadecimal)
Dirección del Registro
(Decimal)
Grove - Sensor de CO2, Temperatura y Humedad (SCD41)Temperatura0x000404
Humedad0x000606
CO20x000808
Grove - Sensor de Luz v1.2Luz0x000A10
Grove - Sensor de LlamaLlama0x000C12
Grove - Sensor de Oxígeno (MIX8410)Oxígeno0x000E14
Grove - Sensor de luz solar (SI1151)Intensidad de Luz0x001016
Luz Visible0x001218
UV0x001420
Grove Sensor de Temperatura y Barómetro (BMP280)Temperatura Barométrica0x001622
Presión Atmosférica0x001824
Altura0x001A26
Grove - Sensor de Temperatura, Humedad, Presión y Gas (BME680)Temperatura0x001C28
Presión Atmosférica0x001E30
Humedad0x002032
Calidad del Aire (VOC)0x002234
Grove - Sensor de Gas V2 (Multicanal)N020x002436
C2H50H0x002638
VOC0x002840
CO0x002A42
Grove - Sensor UVIntensidad UV0x002C44
Grove - Medidor de Sensor de Turbidez V1.0Turbidez0x002E46
Grove - Sensor TDSTDS0x003048
Grove - Medidor Ultrasónico de DistanciaDistancia0x003250

3. Conocimiento de la Conexión de Hardware

Conecta el pin SIG (señal) del sensor a uno de los pines analógicos de cualquier microcontrolador, suministra 5V-3.3V a VCC y GND a Tierra del microcontrolador.

El sensor Grove viene con un potenciómetro montado en él, que permite al usuario ajustar finamente la ganancia, haciéndolo ajustable para adaptarse a diferentes voltajes de entrada. Esto ayuda a cambiar la sensibilidad del sensor.

4. A partir de los pasos anteriores, podemos tener la biblioteca para el sensor AC Grove:

Siguiendo los pasos anteriores, tenemos la biblioteca para aplicar el sensor AC Grove.

#ifndef _SENSOR_AC_H
#define _SENSOR_AC_H

#include "sensorClass.hpp"

#define AC_ADC_PIN A2
#define ADC_BITS 12
#define ADC_COUNTS (1<<ADC_BITS)

class sensorAC : public sensorClass
{
public:
sensorAC(): sensorClass("AC"){};
~sensorAC(){};

uint16_t init(uint16_t reg, bool i2c_available);
bool connected();
bool sample();

enum
{
AC = 0,
MAX
};
private:
double voltCal = 523.56;
double phaseCal = 1.7;
unsigned int cycles = 20;
unsigned int timeout = 2000;
int SupplyVoltage = 3300;
int sampleV;
double lastFilteredV,filteredV;
double offsetV = ADC_COUNTS >> 1;
double phaseShiftedV;
double sqV,sumV;
int startV;
boolean lastVCross,checkVCross;
};

uint16_t sensorAC::init(uint16_t reg, bool i2c_available){
uint16_t t_reg = reg;

for (uint16_t i = 0; i < sensorAC::MAX; i++)
{
sensorClass::reg_t value;
value.addr = t_reg;
value.type = sensorClass::regType_t::REG_TYPE_S32_ABCD;
value.value.s32 = 0;
t_reg += sensorClass::valueLength(value.type);
m_valueVector.emplace_back(value);
}

_connected = i2c_available ? false : true;
//_connected = true;
return t_reg - reg;
}

bool sensorAC::sample()
{

GROVE_SWITCH_ADC;
pinMode(AC_ADC_PIN, INPUT);

unsigned int crossCount = 0;
unsigned int numberOfSamples = 0;

unsigned long start = millis();

while(1){
int startV = analogRead(AC_ADC_PIN);
if((startV<(ADC_COUNTS*0.51)) && (startV>(ADC_COUNTS*0.49)))
break;
if((millis()-start)>timeout)
break;
}

start = millis();

while((crossCount<cycles) && ((millis()-start)<timeout))
{
numberOfSamples++;
lastFilteredV = filteredV;

sampleV = analogRead(AC_ADC_PIN);
offsetV = offsetV + ((sampleV - offsetV)/ADC_COUNTS);
filteredV = sampleV - offsetV;

sqV = filteredV * filteredV;
sumV += sqV;

phaseShiftedV = lastFilteredV + phaseCal * (filteredV - lastFilteredV);

lastVCross = checkVCross;
if(sampleV>startV)
checkVCross = true;
else
checkVCross = false;
if(numberOfSamples == 1)
lastVCross = checkVCross;
if(lastVCross !=checkVCross)
crossCount++;
}

double V_RATIO = voltCal * ((SupplyVoltage/1000.0)/(ADC_COUNTS));
float value = V_RATIO * sqrt(sumV/numberOfSamples);
m_valueVector[AC].value.s32 = value * SCALE;
//Serial.println(value);
sumV = 0;

return true;
}

bool sensorAC::connected()
{
return _connected;
}

#endif

5. Usar Arduino para programar y probar primero

El programa toma algunos parámetros que necesitan ser inicializados antes de ejecutar el programa. Esto asegura que el programa esté funcionando correctamente con el sensor y para obtener valores precisos.

Primero carga el programa en el microcontrolador, luego calibra los parámetros para ajustar las lecturas.

#define AC_ADC_PIN A2				//here pin A2 is used
#define ADC_BITS 12 //depends on microcontroller to microcontroller
#define Calibration_Value 523.56 //depends on the calibration result
#define Phase_Shift 1.7 //depends on the calibration result

void setup() {
Serial.begin(115200);
pinMode(AC_ADC_PIN, INPUT);
}

int ADC_COUNTS = (1<<ADC_BITS);
double voltCal = Calibration_Value;
double phaseCal = Phase_Shift;
unsigned int cycles = 10; //Number of AC Cycles you want to measure
unsigned int timeout = 500; //Timeout
int SupplyVoltage = 3300;
int sampleV;
double lastFilteredV,filteredV;
double offsetV = ADC_COUNTS >> 1;
double phaseShiftedV;
double sqV,sumV;
int startV;
boolean lastVCross,checkVCross;

void loop() {
unsigned int crossCount = 0;
unsigned int numberOfSamples = 0;

unsigned long start = millis();

while(1){
int startV = analogRead(AC_ADC_PIN);
if((startV<(ADC_COUNTS*0.51)) && (startV>(ADC_COUNTS*0.49)))
break;
if((millis()-start)>timeout)
break;
}

start = millis();

while((crossCount<cycles) && ((millis()-start)<timeout))
{
numberOfSamples++;
lastFilteredV = filteredV;

sampleV = analogRead(AC_ADC_PIN);
offsetV = offsetV + ((sampleV - offsetV)/ADC_COUNTS);
filteredV = sampleV - offsetV;

sqV = filteredV * filteredV;
sumV += sqV;

phaseShiftedV = lastFilteredV + phaseCal * (filteredV - lastFilteredV);

lastVCross = checkVCross;
if(sampleV>startV)
checkVCross = true;
else
checkVCross = false;
if(numberOfSamples == 1)
lastVCross = checkVCross;
if(lastVCross !=checkVCross)
crossCount++;
}

double V_RATIO = voltCal * ((SupplyVoltage/1000.0)/(ADC_COUNTS));
float value = V_RATIO * sqrt(sumV/numberOfSamples);
Serial.println(value);
sumV = 0;

}

6. Obtener valor de calibración

Inicialmente el pin analógico está configurado en el pin A2, puede cambiarse según sus requerimientos, usando el parámetro AC_ADC_PIN. Los valores de Calibration_Value y Phase_Shift necesitan cambiarse cada vez que cambie la fuente de voltaje ya que el voltaje AC varía de país a país o a veces incluso de enchufe a enchufe.

El programa envía el valor del sensor al monitor serie. También se puede abrir el plotter serie para ver la gráfica de voltaje vs tiempo.

  • Paso 1: Tome el multímetro y mida el voltaje AC y anótelo.
  • Paso 2: De manera similar anote el voltaje mostrado en el monitor serie.

Aquí en mi caso, la lectura del multímetro es 220V voltaje RMS, mientras que el sensor muestra 718.87V en el monitor serie, para obtener un valor de calibración preciso, necesitamos hacer matemáticas simples, usando la siguiente fórmula.

Mains Voltage / x = Sensor voltage / Initial Calibration

  • Paso 3: Encuentre el valor de x y reemplácelo con Calibration_Value en el programa y cargue el programa al microcontrolador.

x = (mains voltage × initial calibration) / Sensor voltage Puede cambiar los otros parámetros como Phase_Shift, Número de ciclos AC y timeout según su configuración o mantenerlos por defecto.

Referencia

La lista de módulos Grove compatibles para SenseCAP S2110 Sensor Builder

Actualmente, SenseCAP S2110 Sensor Builder soporta los siguientes módulos Grove listos para usar para comunicarse con SenseCAP Data Logger y enviar los datos del sensor a la plataforma SenseCAP vía LoRa.

✨ Proyecto de Colaboradores

Soporte Técnico y Discusión de Productos

¡Gracias por elegir nuestros productos! Estamos aquí para brindarte diferentes tipos de soporte para asegurar que tu experiencia con nuestros productos sea lo más fluida posible. Ofrecemos varios canales de comunicación para satisfacer diferentes preferencias y necesidades.

Loading Comments...