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 carpetasrc\sensor
para el nuevo sensor. -
Paso 2: Definir la clase del sensor e implementar las funciones
init()
ysample()
.
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();
}
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 Grove | Nombre del Registro | Dirección del Registro (Hexadecimal) | Dirección del Registro (Decimal) |
---|---|---|---|
Grove - Sensor de CO2, Temperatura y Humedad (SCD41) | Temperatura | 0x0004 | 04 |
Humedad | 0x0006 | 06 | |
CO2 | 0x0008 | 08 | |
Grove - Sensor de Luz v1.2 | Luz | 0x000A | 10 |
Grove - Sensor de Llama | Llama | 0x000C | 12 |
Grove - Sensor de Oxígeno (MIX8410) | Oxígeno | 0x000E | 14 |
Grove - Sensor de luz solar (SI1151) | Intensidad de Luz | 0x0010 | 16 |
Luz Visible | 0x0012 | 18 | |
UV | 0x0014 | 20 | |
Grove Sensor de Temperatura y Barómetro (BMP280) | Temperatura Barométrica | 0x0016 | 22 |
Presión Atmosférica | 0x0018 | 24 | |
Altura | 0x001A | 26 | |
Grove - Sensor de Temperatura, Humedad, Presión y Gas (BME680) | Temperatura | 0x001C | 28 |
Presión Atmosférica | 0x001E | 30 | |
Humedad | 0x0020 | 32 | |
Calidad del Aire (VOC) | 0x0022 | 34 | |
Grove - Sensor de Gas V2 (Multicanal) | N02 | 0x0024 | 36 |
C2H50H | 0x0026 | 38 | |
VOC | 0x0028 | 40 | |
CO | 0x002A | 42 | |
Grove - Sensor UV | Intensidad UV | 0x002C | 44 |
Grove - Medidor de Sensor de Turbidez V1.0 | Turbidez | 0x002E | 46 |
Grove - Sensor TDS | TDS | 0x0030 | 48 |
Grove - Medidor Ultrasónico de Distancia | Distancia | 0x0032 | 50 |
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.
- Paso 3: Encuentre el valor de x y reemplácelo con Calibration_Value en el programa y cargue el programa al microcontrolador.
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
- Puede consultar la Librería del Sensor de Voltaje AC Grove para más información.
- Más detalles sobre el cálculo se pueden encontrar aquí
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.
- Grove - Sensor de Temperatura y Barómetro (BMP280)
- Grove - Sensor de Oxígeno (MIX8410)
- Grove - Sensor de CO2, Temperatura y Humedad - SCD41
- Grove - Sensor de Luz Solar - SI1151
- Grove - Sensor de Luz v1.2 - Fototransistor LS06-S
- Grove - Sensor de Llama
- Grove - Sensor de Gas (BME680)
- Grove - Sensor de Gas Multicanal v2
- Grove - Sensor/Medidor TDS Para Calidad del Agua (Sólidos Disueltos Totales)
- Grove - Sensor UV
- Grove - Sensor de Distancia Ultrasónico
- Grove - Sensor de Turbidez
- Grove - Sensor de Rayos
- Grove - Sensor de Corriente DC/AC ±5A (ACS70331)
✨ Proyecto de Colaboradores
- Este proyecto está respaldado por el Proyecto de Colaboradores de Seeed Studio.
- Gracias a los esfuerzos de Mohammed Adnan Khan y tu trabajo será exhibido.
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.