|
本帖最后由 点点&木木 于 2019-4-12 11:28 编辑 介绍 我们是Polytech Sorbonne的3名学生,专门研究EI2I(电子和计算机科学) 我们项目的目标是创建一个由多个传感器组成的模块,以帮助来自其他专业(AGRAL:农业食品行业)的学生进行种植园的后续工作。 微控制器在屏幕上实时显示传感器发送的温度(空气和土壤),湿度(空气和土壤),光度等信息。同时,它可通过LPWAN网络Sigfox将数据发送到在线服务器Ubidots。
硬件组件 DHT22温度传感器 × 1 STMicroelectronics STM32 MCU Nucleo-32板 × 1 TSL2561 - Lux传感器 × 1 TCS34725 - RGB传感器 × 1 SSD1306 OLED - 屏幕 × 1 SigFox × 1 DFRobot土壤水分 × 1 模温探头 × 1 Li-Pro Rider Pro × 1 Accu Li-Ion 3,7 V 1050 mAh × 1 太阳能板 × 1 1)使用传感器 · 1. DHT22 - 空气传感器的温度和湿度
DHT 22 DHT22温度和湿度传感器通过串行端口与微控制器通信。传感器经过校准,不需要使用任何其他组件。 电源:3.3至6 Vdc 测量范围: - 温度:-40至+ 80°C - 湿度:0至100%RH 精确: - 温度:±0.5°C - 湿度:±2%RH 为了使用这个传感器,我们使用了Mbed中的预定义功能 · DHT22.h /** DHT Library for Digital-output Humidity and Temperature sensors * * Works with DHT11, DHT21, DHT22 * SEN11301P, Grove - Temperature&Humidity Sensor (Seeed Studio) * SEN51035P, Grove - Temperature&Humidity Sensor Pro (Seeed Studio) * AM2302 , temperature-humidity sensor * RHT01,RHT02, RHT03 , Humidity and Temperature Sensor (Sparkfun) * * Copyright (C) Wim De Roeve * based on DHT22 sensor library by HO WING KIT * Arduino DHT11 library * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documnetation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #ifndef MBED_DHT_H #define MBED_DHT_H #include "mbed.h" typedef enum eType eType; enum eType { DHT11 = 11, SEN11301P = 11, RHT01 = 11, DHT22 = 22, AM2302 = 22, SEN51035P = 22, RHT02 = 22, RHT03 = 22 }; typedef enum eError eError; enum eError { ERROR_NONE = 0, BUS_BUSY, ERROR_NOT_PRESENT, ERROR_ACK_TOO_LONG, ERROR_SYNC_TIMEOUT, ERROR_DATA_TIMEOUT, ERROR_CHECKSUM, ERROR_NO_PATIENCE }; typedef enum eScale eScale; enum eScale { CELCIUS = 0, FARENHEIT, KELVIN }; class DHT { public: DHT(PinName pin, eType DHTtype); ~DHT(); eError readData(void); float ReadHumidity(void); float ReadTemperature(eScale const Scale); float CalcdewPoint(float const celsius, float const humidity); float CalcdewPointFast(float const celsius, float const humidity); private: time_t _lastReadTime; float _lastTemperature; float _lastHumidity; PinName _pin; bool _firsttime; eType _DHTtype; uint8_t DHT_data[5]; float CalcTemperature(); float CalcHumidity(); float ConvertCelciustoFarenheit(float const); float ConvertCelciustoKelvin(float const); eError stall(DigitalInOut &io, int const level, int const max_time); }; #endif DHT22.cpp #include "DHT22.h" DHT22: HT22(PinName pin) {_data_pin = pin; } int DHT22::getTemperature() { return _temperature; } int DHT22::getHumidity() { return _humidity; } bool DHT22::sample() { DigitalInOut DHT22(_data_pin); int dht22_dat [5]; DHT22.output(); DHT22.write(0); wait_ms(18); DHT22.write(1); DHT22.input(); wait_us(40); wait_us(80); int i,j,result=0; for (i=0; i<5; i++) { result=0; for (j=0; j<8; j++) { while (DHT22); while (!DHT22); wait_us(50); int p; p=DHT22; p=p <<(7-j); result=result|p; } dht22_dat = result; } int dht22_check_sum; dht22_check_sum=dht22_dat[0]+dht22_dat[1]+dht22_dat[2]+dht22_dat[3]; dht22_check_sum= dht22_check_sum%256; if (dht22_check_sum==dht22_dat[4]) { _humidity=dht22_dat[0]*256+dht22_dat[1]; _temperature=dht22_dat[2]*256+dht22_dat[3]; return true; } return false; } 首先,您需要定义传感器所连接的引脚。 现在您可以使用传感器的功能。 #ifdef MesureDHT22void mesuresDHT22(){ CaptDHT.readData(); TemperatureAir = CaptDHT.ReadTemperature(CELCIUS); HumiditeAir = CaptDHT.ReadHumidity();}#endif2.亮度传感器
TSL2561 基于TSL2561的亮度传感器,可测量0.1至40000 Lux的亮度。它与微控制器通信。 电源:2.7至3.6 VDC TSL2561.h /** mbed library program * Luminosity sensor -- LIGHT-TO-DIGITAL CONVERTER (light intensity to a digital signal output) * TSL2561 by Texas Advanced Optoelectronic Solutions Inc. * #ifndef TSL2561_H #define TSL2561_H #include "mbed.h" // Luminosity sensor, TSL2561 // Address b7=0,b6=1,b5=1,b4=1,b3=0,b2=0,b1=1, b0=R/W #define TSL2561_ADDRESS_GND (0x29 << 1) #define TSL2561_ADDRESS_FLOAT (0x39 << 1) #define TSL2561_ADDRESS_VDD (0x49 << 1) ////////////// Registers ////////////////////////////////// // Register definition #define TSL2561_CONTROL 0x00 #define TSL2561_TIMING 0x01 #define TSL2561_THRESHLOWLOW 0x02 #define TSL2561_THRESHHIGHLOW 0x04 #define TSL2561_INTERRUPT 0x06 #define TSL2561_CRC 0x08 #define TSL2561_ID 0x0A #define TSL2561_DATA0LOW 0x0C #define TSL2561_DATA0HIGH 0x0D #define TSL2561_DATA1LOW 0x0E #define TSL2561_DATA1HIGH 0x0F ////////////// TIMING PARAMETER /////////////////////////// #define TIMING_GAIN_1 (0UL << 4) #define TIMING_GAIN_16 (1UL << 4) #define TIMING_TIME_13R7 (0x0) #define TIMING_TIME_101 (0x1) #define TIMING_TIME_402 (0x2) #define TIMING_TIME_MANU (0x3) #define TIMING_DEFAULT (TIMING_GAIN_1 + TIMING_TIME_402) ////////////// ID ///////////////////////////////////////// #define I_AM_TSL2561 0x50 #define REG_NO_MASK 0x0F ////////////// COMMAND //////////////////////////////////// #define CMD_CMDMODE (1UL << 7) #define CMD_CLEAR (1UL << 6) #define CMD_WORD (1UL << 5) #define CMD_BLOCK (1UL << 4) #define CMD_SINGLE (CMD_CMDMODE) #define CMD_MULTI (CMD_CMDMODE + CMD_WORD) /** Interface for Luminosity sensor, TSL2561 * @code * #include "mbed.h" * #include "TSL2561.h" * * // I2C Communication * TSL2561 lum(dp5,dp27); // TSL2561 SDA, SCL * // If you connected I2C line not only this device but also other devices, * // you need to declare following method. * I2C i2c(dp5,dp27); // SDA, SCL * TSL2561 lum(i2c); // TSL2561 SDA, SCL (Data available every 400mSec) * * int main() {; * while(true){ * printf("Illuminance: %+7.2f [Lux]\r\n", lum.lux()); * wait(1.0); * } * } * @endcode */ class TSL2561 { public: /** Configure data pin * @param data SDA and SCL pins TSL2561(PinName p_sda, PinName p_scl); TSL2561(PinName p_sda, PinName p_scl, uint8_t addr); /** Configure data pin (with other devices on I2C line) * @param I2C previous definition */ TSL2561(I2C& p_i2c); TSL2561(I2C& p_i2c, uint8_t addr); /** Get approximates the human eye response * in the commonly used Illuminance unit of Lux * @param none * @return Lux */ float lux(void); /** Set timing register * @param timing parameter * @return timing read data */ uint8_t set_timing_reg(uint8_t parameter); /** Read timing register * @param timing parameter * @return timing read data */ uint8_t read_timing_reg(void); /** Set I2C clock frequency * @param freq. * @return none */ void frequency(int hz); /** check Device ID number * @param none * @return TSL2561 = 1, others 0 */ uint8_t who_am_i(void); /** Read ID and Revision Number * @param none * @return ID + REVNO */ uint16_t read_ID(void); /** Power Up/Down * @param none * @return none */ void power_up(void); void power_down(void); protected: I2C *_i2c_p; I2C &_i2c; void init(void); private: bool TSL2561Initialised; uint8_t TSL2561_addr; uint8_t dt[4]; uint32_t ch0; uint32_t ch1; int8_t gain; uint8_t id_number; double integ_time; }; #endif // TSL2561_H TSL2561.cpp /** mbed library program * Luminosity sensor -- LIGHT-TO-DIGITAL CONVERTER (light intensity to a digital signal output) * TSL2561 by Texas Advanced Optoelectronic Solutions Inc. * * Created: Feburary 21st, 2015 * Revised: August 23rd, 2017 */ #include "TSL2561.h" TSL2561::TSL2561 (PinName p_sda, PinName p_scl) : _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p) { TSL2561_addr = TSL2561_ADDRESS_GND; init();} TSL2561::TSL2561 (PinName p_sda, PinName p_scl, uint8_t addr) : _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p) { TSL2561_addr = addr; init(); } TSL2561::TSL2561 (I2C& p_i2c) : _i2c(p_i2c) { TSL2561_addr = TSL2561_ADDRESS_GND; init(); } TSL2561::TSL2561 (I2C& p_i2c, uint8_t addr) : _i2c(p_i2c) { TSL2561_addr = addr; init(); } /////////////// Read Lux from sensor ////////////////////// /* For 0 < CH1/CH0 < 0.50 Lux = 0.0304 x CH0-0.062 x CH0 x ((CH1/CH0)1.4) For 0.50 < CH1/CH0 < 0.61 Lux = 0.0224 x CH0-0.031 x CH1 For 0.61 < CH1/CH0 < 0.80 Lux = 0.0128 x CH0-0.0153 x CH1 For 0.80 < CH1/CH0 < 1.30 Lux = 0.00146 x CH0-0.00112x CH1 For CH1/CH0 > 1.30 Lux = 0 */ float TSL2561::lux() { double lux0, lux1; double ratio; double dlux; dt[0] = CMD_MULTI + TSL2561_DATA0LOW; _i2c.write((int)TSL2561_addr, (char *)dt, 1, true); _i2c.read(TSL2561_addr, (char *)dt, 2, false); ch0 = dt[1] << 8 | dt[0]; dt[0] = CMD_MULTI + TSL2561_DATA1LOW; _i2c.write((int)TSL2561_addr, (char *)dt, 1, true); _i2c.read(TSL2561_addr, (char *)dt, 2, false); ch1 = dt[1] << 8 | dt[0]; if (ch0 == 0xFFFF) { return 2500.0; } lux0 = (double)ch0; lux1 = (double)ch1; ratio = lux1 / lux0; read_timing_reg(); lux0 *= (402.0/integ_time); lux1 *= (402.0/integ_time); lux0 /= gain; lux1 /= gain; if (ratio <= 0.5) { dlux = 0.03040 * lux0 - 0.06200 * lux0 * pow(ratio,1.4); } else if (ratio <= 0.61) { dlux = 0.02240 * lux0 - 0.03100 * lux1; } else if (ratio <= 0.80) { dlux = 0.01280 * lux0 - 0.01530 * lux1; } else if (ratio <= 1.30) { dlux = 0.00146 * lux0 - 0.00112 * lux1; } else { dlux = 0; } return (float)dlux; } /////////////// Initialize //////////////////////////////// void TSL2561::init() { _i2c.frequency(100000); power_up(); set_timing_reg(TIMING_DEFAULT); } /////////////// Timing Register /////////////////////////// uint8_t TSL2561::set_timing_reg(uint8_t parameter) { dt[0] = CMD_SINGLE + TSL2561_TIMING; dt[1] = parameter; _i2c.write((int)TSL2561_addr, (char *)dt, 2, false); dt[0] = CMD_SINGLE + TSL2561_TIMING; _i2c.write((int)TSL2561_addr, (char *)dt, 1, true); _i2c.read(TSL2561_addr, (char *)dt, 1, false); return dt[0]; } uint8_t TSL2561::read_timing_reg(void) { uint8_t i; dt[0] = CMD_SINGLE + TSL2561_TIMING; _i2c.write((int)TSL2561_addr, (char *)dt, 1, true); _i2c.read(TSL2561_addr, (char *)dt, 1, false); if (dt[0] & TIMING_GAIN_16){ gain = 16; } else { gain = 1; } i = dt[0] & 0x3; switch (i) { case 0: integ_time = 13.7; break; case 1: integ_time = 101.0; break; case 2: integ_time = 402.0; break; default: integ_time = 0; break; } return dt[0];} /////////////// ID //////////////////////////////////////// uint16_t TSL2561::read_ID() { dt[0] = CMD_SINGLE + TSL2561_ID; _i2c.write((int)TSL2561_addr, (char *)dt, 1, true); _i2c.read(TSL2561_addr, (char *)dt, 2, false); id_number = dt[0] << 8 | dt[1]; return id_number; } uint8_t TSL2561::who_am_i() { read_ID(); if ((id_number >> 4) == I_AM_TSL2561) { return 1; } else { return 0; } } /////////////// Power ON/OFF ////////////////////////////// void TSL2561::power_up() { dt[0] = CMD_SINGLE + TSL2561_CONTROL; dt[1] = 3; _i2c.write((int)TSL2561_addr, (char *)dt, 2, false); } void TSL2561::power_down() { dt[0] = CMD_SINGLE + TSL2561_CONTROL; dt[1] = 0; _i2c.write((int)TSL2561_addr, (char *)dt, 2, false); } /////////////// I2C Freq. ///////////////////////////////// void TSL2561::frequency(int hz) { _i2c.frequency(hz); } 对于此传感器,您需要选择用于营养和I2C的引脚(SCA,SDL) 3. RGB传感器
TCS34725 该模块用于检测光源或对象的颜色。它基于TCS34725传感器,通过I2C端口进行通信。传感器用于检测RGB颜色和白色。 电源:3.3至5 Vdc I2C协议 { CaptRGB.getRawData(&Red, &Green, &Blue, &Clear); uint32_t Sum = Clear; RedValue = Red; RedValue /= Sum; GreenValue = Green; GreenValue /= Sum; BlueValue = Blue; BlueValue /= Sum; RedValue *= 256; GreenValue *= 256; BlueValue *= 256;}#endif 4.地面温度
温度探针 温度探头是一种精确的防水温度传感器,工作温度范围为-40℃至105℃。 与其他温度传感器不同,它可以精确地报告温度,并且不需要任何其他组件。 5.地面湿度
传感器土壤水分 我们的土壤湿度传感器通过电容式传感测量土壤水分,而不像其他传感器那样测量电阻传感 该模块包括一个板载稳压器,工作电压范围为3.3~5.5V。 // Mesure de l'humidité du sol#ifdef MesureHumiditeSolvoid mesureHumiditeCSMS() { float a = -0.005312; float b = 0.92265; float SommeMesures = 0; for(int i = 0; i < NombreDeMesures; i++) { HumiditeSol = CSMS.read(); HumiditeSol = (1/a)*(HumiditeSol-b); if (HumiditeSol < 0) HumiditeSol = 0; if (HumiditeSol > 100) HumiditeSol = 100; SommeMesures += HumiditeSol; wait_ms(DelaiEntreMesures); } SommeMesures /= NombreDeMesures; HumiditeSol = SommeMesures; } #endif 6. STM32 Nucleo-32 L432KC
STM32 Nucleo-32 L432KC 所有传感器都连接到此卡,如下所示。
1)守则 为了开发这个的项目,我们使用了Mbed编译器,这是一个互联网上的软件,允许我们在任何计算机上工作,非常有用,在家里就可以完成项目。
Mbed编译器 我们开发了一个非常结构化的代码,以便能够非常轻松地进行调试。使用了一些#define和#ifdef,因此您可以通过仅在头文件上注释一行来轻松关闭传感器,该头文件包含许多全局变量,例如引脚名称,其中连接传感器以快速更改它。 Mbed的优势在于每个传感器都有许多的库。 程序将记录每个传感器的值,然后将它们显示在LCD屏幕上,并使用Sigfox发送这些记录以便稍后显示。 Mapping.h #ifndef __MAPPING_H__#define __MAPPING_H__ // Commenter pour désactiver certaines mesures ou fonctions #define MesureDHT22 #define MesureIntensiteLumineuse //I2C #define MesureRGB //I2C #define MesureTemperatureSol #define MesureHumiditeSol #define AffichageOLED #define Debug //#define SigfoxActif //#define DeepSleepEnable //Moyenne de mesures #define NombreDeMesures 10 #define DelaiEntreMesures 25 // exprimé en ms //Luxmètre #define COEF_TSL 10 //CSMS (Humidite du sol) #define pinCSMS A0 //DS1820 (Temperature du sol) #define pinDS1820 D12 //DHT22 (Temperature et humidite de l'air) #define pinDHT22 D9 //PA_8 #define modeleDHT AM2302 //I2C #define pinSDA D0 #define pinSCL D1 //Sigfox #define SigfoxTX D5 #define SigfoxRX D4 /*#define SigfoxTX A7 #define SigfoxRX A2*/ #define DelaiEnvoi 30 //Délai entre 2 envois en secondes //Deep Sleep #define DureeDeepSleep 3000 //Duree en secondes //Ecran OLED #define pinCS D6 #define pinRS D3 #define pinDC A5 #define pinCLK A4 #define pinDATA D2 #endif Main.cpp #include "mbed.h" #include "mapping.h" #include "ssd1306.h" #include "standard_font.h" #include "bold_font.h" #include "DHT.h" #include "TSL2561.h" #include "Adafruit_TCS34725.h" #include "DS1820.h" #include "WakeUp.h" /************************************ * Declaration des objets ***********************************/ #ifdef SigfoxActif Serial Sigfox(SigfoxTX, SigfoxRX); #endif #ifdef AffichageOLED SSD1306 oled(pinCS, pinRS, pinDC, pinCLK, pinDATA); #endif #if defined(MesureIntensiteLumineuse) || defined(MesureRGB) I2C i2c(pinSDA, pinSCL); #endif #ifdef MesureIntensiteLumineuse TSL2561 Lumiere(i2c,TSL2561_ADDRESS_FLOAT); #endif #ifdef MesureRGB Adafruit_TCS34725 CaptRGB(&i2c, TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X); #endif #ifdef MesureDHT22 DHT CaptDHT(pinDHT22, modeleDHT); #endif #ifdef MesureTemperatureSol DS1820 TemperatureSonde(pinDS1820); #endif #ifdef MesureHumiditeSol AnalogIn CSMS(pinCSMS); #endif DigitalOut myled(LED1); #ifdef Debug Serial pc(USBTX,USBRX); #endif /* #ifdef DeepSleepEnable WakeUp ModeVeille; ModeVeille.calibrate(); #endif */ /************************************ * Declaration des variables globales ************************************/ int TemperatureAir, HumiditeAir; int RGB; float Lux; float TemperatureSol; float HumiditeSol; float RedValue, GreenValue, BlueValue; uint16_t Clear, Red, Green, Blue; /************************************ * Fonctions de mesures ou affichage ***********************************/ // Fonction permettant l'affichage des mesures sur l'ecran #ifdef AffichageOLED void affichageOLED(){ oled.clear(); oled.set_font(bold_font, 8); oled.printf(" rojet AGRAL\r\n");oled.printf("\r\n"); oled.set_font(standard_font, 6); #ifdef MesureDHT22 oled.printf("Tempe Air : %d\r\n", TemperatureAir); oled.printf("Humidite : %d %%\r\n", HumiditeAir); #endif #ifdef MesureIntensiteLumineuse oled.printf("Lux : %.0f lux\r\n", Lux); #endif #ifdef MesureRGB oled.printf("RGB : %d %d %d\r\n", int(RedValue),int(GreenValue),int(BlueValue)); #endif #ifdef MesureTemperatureSol oled.printf("Temp Sol : %3.0f\r\n", TemperatureSol); #endif #ifdef MesureHumiditeSol oled.printf("Hum Sol : %.0f %%\r\n", HumiditeSol); #endif oled.update(); } #endif #ifdef Debug void debugPrintf(void){ #ifdef MesureDHT22 pc.printf("Temperature : %d\r\n", TemperatureAir); pc.printf("Humidite : %d %%\r\n", HumiditeAir); #endif #ifdef MesureTemperatureSol pc.printf("Temp Sol : %3.0f\r\n", TemperatureSol); #endif #ifdef MesureHumiditeSol pc.printf("Hum Sol : %.0f %%\r\n", HumiditeSol); #endif #ifdef MesureIntensiteLumineuse pc.printf("Lux : %.0f lux\r\n", Lux); #endif #ifdef MesureRGB pc.printf("RGB : %d %d %d\r\n", int(RedValue),int(GreenValue),int(BlueValue)); #endif #ifdef SigfoxActif pc.printf("\r\n"); pc.printf("AT$SF=%02x%02x%04x%02x%02x%02x%02x%02x\n\r", (int)TemperatureAir, (int)HumiditeAir, (int)Lux, (int)TemperatureSol, (int)HumiditeSol, (int)RedValue, (int)GreenValue, (int)BlueValue); pc.printf("\r\n"); #endif pc.printf("---------------------------------------------------\r\n"); } #endif // Mesure de la température et de l'humidité de l'air #ifdef MesureDHT22 void mesuresDHT22(){ CaptDHT.readData(); TemperatureAir = CaptDHT.ReadTemperature(CELCIUS); HumiditeAir = CaptDHT.ReadHumidity(); } #endif // Mesure du spectre de la lumière #ifdef MesureRGB void mesureRGB(){ CaptRGB.getRawData(&Red, &Green, &Blue, &Clear); uint32_t Sum = Clear; RedValue = Red; RedValue /= Sum; GreenValue = Green; GreenValue /= Sum; BlueValue = Blue; BlueValue /= Sum; RedValue *= 256; GreenValue *= 256; BlueValue *= 256; } #endif // Mesure de l'intensité lumineuse en Lux #ifdef MesureIntensiteLumineuse void MesureLux(){ //int i; Lux = 0; for(int i = 0; i < NombreDeMesures; i++){ Lux += COEF_TSL*Lumiere.lux(); wait_ms(DelaiEntreMesures); } Lux /= NombreDeMesures; } #endif // Mesure de la temperature du sol #ifdef MesureTemperatureSol void mesureTemperatureSonde(){ TemperatureSonde.convertTemperature(true, DS1820::all_devices); TemperatureSol = TemperatureSonde.temperature(); } #endif // Mesure de l'humidité du sol #ifdef MesureHumiditeSol void mesureHumiditeCSMS(){ float a = -0.005312; float b = 0.92265; float SommeMesures = 0; for(int i = 0; i < NombreDeMesures; i++){ HumiditeSol = CSMS.read(); HumiditeSol = (1/a)*(HumiditeSol-b); if (HumiditeSol < 0) HumiditeSol = 0; if (HumiditeSol > 100) HumiditeSol = 100; SommeMesures += HumiditeSol; wait_ms(DelaiEntreMesures); } SommeMesures /= NombreDeMesures; HumiditeSol = SommeMesures; } #endif void ClignotementLED(int duree){ myled = !myled; wait_ms(duree); myled = !myled; wait_ms(duree); myled = !myled; wait_ms(duree); myled = !myled; wait_ms(duree); } #ifdef AffichageOLED void eteindreEcran(){ oled.clear(); } #endif /*********************************** * Fonction main ************************************/ int main() { // Initialisation de l'écran #ifdef AffichageOLED oled.initialise(); oled.set_contrast(255); oled.clear(); #endif while (1) { #ifdef MesureDHT22 mesuresDHT22(); #endif #ifdef MesureIntensiteLumineuse MesureLux(); #endif #ifdef MesureRGB mesureRGB(); #endif #ifdef MesureTemperatureSol mesureTemperatureSonde(); #endif #ifdef MesureHumiditeSol mesureHumiditeCSMS(); #endif #ifdef AffichageOLED affichageOLED(); #endif #ifdef SigfoxActif Sigfox.printf("AT$SF="); //Sigfox.printf("15290107141f675e47"); //Sigfox.printf("65"); //Sigfox.printf("%02x%02x%04x%02x%02x%02x%02x%02x", (int)TemperatureAir, (int)HumiditeAir, (int)Lux, (int)TemperatureSol, (int)HumiditeSol, (int)RedValue, (int)GreenValue, (int)BlueValue); Sigfox.printf("%02x%02x%04x%02x", (int)TemperatureAir, (int)HumiditeAir, (int)Lux, (int)HumiditeSol); Sigfox.printf("\n\r"); ClignotementLED(40); //On indique quand un message est envoyé par Sigfox #endif #ifdef Debug debugPrintf(); #endif #ifdef SigfoxActif wait(DelaiEnvoi); #endif #ifdef DeepSleepEnable wait(2); eteindreEcran(); ClignotementLED(40); //ModeVeille.set(DureeDeepSleep); WakeUp::set_ms(30000); deepsleep(); #endif //NVIC_SystemReset(); } } 2)Ubidots Ubidots是一种物联网平台,通过易于使用的界面,可以开发和部署互联网连接的应用程序和解决方案。借助REST API,Cloud Plateform能够接收和处理HTTP请求。 变量 变量对应于封装到JSON字符串中的数据。变量必须与传感器的数据具有相同的名称,以便很好地分析数据。因此,我们创建了与传感器数据一样多的变量。
Ubidots的变量 3)图形界面 为了开发我们的项目,我们使用Ubidots教育云数据库,该数据库收集来自Sigfox的所有传感器数据。对Json脚本的所有值都会被自动检测到,然后我们只需要放置一些小部件并告诉哪些数据与之相关。
我们在Ubidots项目的仪表板 4)印刷板 最后,我们选择了EASYEDA来创建我们的PCB.EASYEDA也是一个在线共享工具,每个成员都可以编辑项目以及任何使其成为私有或公共的计算机。完成shematic后,软件将生成一个PCB,您必须找到将传感器引脚连接到电路板上引脚的正确方法。
我们项目的电路板示意图
原理图
PCB
|
STM32
超强工具——STM32CubeMX 你会用吗?
集结出发! STM32全国研讨会系列之一:ST智能门铃中国首秀
关于STM32启动文件的几个小问题
【银杏科技ARM+FPGA双核心应用】STM32H7系列35——USB_VCP_FS
【银杏科技ARM+FPGA双核心应用】STM32H7系列28——USB_HID
粉丝分享 | 图说CRC原理应用及STM32硬件CRC外设
STM32L151进入低功耗,并由RTC唤醒的故事
[转]stm32控制NFC模块(PN532)源码(P2P,模拟卡,读写卡等
STM32G070RB+LVGL移植
微信公众号
手机版