Bon, ca y est, ca transmet sur le reseau Lorawan Helium et j’arrive à avoir quelques données. Cependant je n’arrive que a avoir les données Température et humidité. Pour transmettre le poids je galère pour formater la donnée correctement selon le protocole ‹ Cayenne Low Power Protocole › Cayenne Docs.
Que je déclare cette donnée de mesure en float ou en int16_t ca ne marche pas. De plus il faut la mettre dans un tableau containeur de type data[] and déclarant 3 choses : le canal : ici 0x03, le type de données : voir liste (0x02 ?? analogic input ?), et la données mesuré (ici appel « units ») et pour les deux dernière je sèche.
Help ?
Le code corrigé donnerai ca mais ca ne marche pas :
#include <lmic.h>
#include <hal/hal.h>
#include <LowPower.h>
#include « HX711.h »
#include « DHT.h »
const lmic_pinmap lmic_pins = {
.nss = 10,.rxtx = LMIC_UNUSED_PIN,
.rst = 9,
.dio = {2, 5, LMIC_UNUSED_PIN},
};
#define TXPERIOD (5*60) // 5 minutes
#define DHTPIN A0 // Digital pin connected to the DHT sensor
#define DHTTYPE DHT22 // DHT 22 (AM2302)
#define DT 3 //capteur balance1 cable orange
#define SCK 4 //capteur balance1 cable jaune
HX711 balance;
DHT dht(DHTPIN, DHTTYPE);
float calibration_factor =-19900; // ma calibration pour mon capteur
float units;
static const u1_t PROGMEM APPEUI[8] = {0x60, 0x81, 0xF9, 0x45, 0xE1, 0x39, 0xC2, 0x59}; //Ma clé de Objet APIEUI
static const u1_t PROGMEM DEVEUI[8] = {0x60, 0x81, 0xF9, 0x76, 0x35, 0x6B, 0x36, 0x87}; //Ma clé d’objet DEVEUI
static const u1_t PROGMEM APPKEY[16] = {0x94, 0x6A, 0xF6, 0x6F, 0x09, 0xCF, 0x8E, 0xD9, 0xBD, 0x97, 0x75, 0x23, 0x6D, 0x57, 0x8D, 0xA4}; //Ma clé API d’objet
void os_getArtEui (u1_t* buf) {
for ( int i = 0 ; i < 8 ; i++ ) buf[7-i] = APPEUI[i];
}
void os_getDevEui (u1_t* buf) {
for ( int i = 0 ; i < 8 ; i++) buf[7-i] = DEVEUI[i];
}
void os_getDevKey (u1_t* buf) {
memcpy_P(buf, APPKEY, 16);
}
void setup() {
// Addon Balance
pinMode(A0, INPUT_PULLUP); // transforme le port A0 en port numerique set pull-up on analog pin 0$
Serial.begin(9600);
dht.begin();
delay(1000);
balance.begin(DT, SCK);
balance.set_scale(calibration_factor);
balance.tare(); //tare la balance: ajustement du zéro
long zero_factor = balance.read_average(); //Obtenez une lecture de base
//Fin programme balance
os_init(); // Intialisation de la bibliothèque
LMIC_reset();
LMIC_setClockError(MAX_CLOCK_ERROR * 10 / 100); // agrandit la fenetre de reception
LMIC_setAdrMode(0); // desactive le mode ADR
// Configure les canaux utilisables pour les communications
LMIC_setupChannel(0, 868100000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI);
LMIC_setupChannel(1, 868300000, DR_RANGE_MAP(DR_SF12, DR_SF7B), BAND_CENTI);
LMIC_setupChannel(2, 868500000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI);
LMIC_setupChannel(3, 867100000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI);
LMIC_setupChannel(4, 867300000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI);
LMIC_setupChannel(5, 867500000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI);
LMIC_setupChannel(6, 867700000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI);
LMIC_setupChannel(7, 867900000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI);
LMIC_setupChannel(8, 868800000, DR_RANGE_MAP(DR_FSK, DR_FSK), BAND_MILLI);
// Configure la vitesse et la puissance de transmission
LMIC.dn2Dr = SF9;
LMIC_setDrTxpow(DR_SF9,14);
LMIC_setLinkCheckMode(0);
}
//reveille la carte
boolean canSleep = true;
uint32_t temps = TXPERIOD; // transmettre au demarrage
uint8_t data[] = {
0x01, 0x68, 0x00, 0x02, 0x67, 0x00, 0x03, 0x02, 0x00 // canal 1, type de donnée Hygrometrie 1 ut = 0.5%, canal 2, type donnée température, canal 3, type de donnée ??
};
void loop() {
//Mesure temparature et hygrometrie
float h = dht.readHumidity();
float t = dht.readTemperature();
float f = dht.readTemperature(true);
delay(2000);
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println(F(« Failed to read from DHT sensor! »));
return;
}
balance.set_scale(calibration_factor); //ajuste au facteur de calibration
units = balance.get_units(), 10; //mesure la valeur de la balance dans « units »
if ( temps >= TXPERIOD ) {
canSleep = false; //entre chaque mesure : dodo!
// lecture de la donnée du capteur
// enregistrement des données mesurées dans la variable data
data[2] = h;
data[5] = t;
data[8] = units;
// emission de la valeur
LMIC_setDrTxpow(DR_SF9,14);
lmic_tx_error_t err = LMIC_setTxData2(1, data, sizeof(data), 0);
temps=0;
}
// put your main code here, to run repeatedly:
os_runloop_once();
if ( canSleep ) {
LowPower.powerDown(SLEEP_8S, ADC_OFF,BOD_OFF);
temps += 8;
}
}
void onEvent (ev_t ev) {
switch(ev) {
case EV_JOINED:
LMIC_setLinkCheckMode(0);
break;
case EV_TXCOMPLETE:
canSleep = true;
break;
default:
canSleep = false;
break;
}
}