
本帖最后由 点点&木木 于 2019-4-11 23:10 编辑 $ I" L0 a T! O, b$ P* y0 \ 0 O5 P, a. H1 G0 p 介绍(转载) 我们是Polytech Sorbonne的5名工程专业的学生。 我们已经创建了一个自主设备来监控我们工程学院的农业食品学生种植作物的环境。以下段落解释了我们项目的主要功能与实现。那么它是如何工作的呢?我们采用微控制器实现对作物环境的各项数值进行测量(如:空气/土壤温度/湿度,亮度和光谱)。然后,数据显示在OLED屏幕上并发送到Sigfox后端,在后端解析并最终发送到Ubidots,以便在仪表板中显示它们。该设备由3.7V电池供电,由太阳能电池板充电。因此,该系统在能源方面完全自主。 * a* l: E( m2 I! v# k- h* f. u ![]() ' w; r. U! A% `4 _ 这个项目中使用的东西 硬件组件 Capteurd'hifiditéetde T°Grove 101020019 × 1 DFRobotCapteurd'hifiditéGravitySEN0193 × 1 Seeed -CapteurdetempératureGrove101990019 × 1 AdafruitCapteurdeluminositéTSL2561 × 1 AdafruitCapteur de couleur ADA1334 × 1 STM32NUCLEO-L432KC × 1 模块Sigfox × 1 Cellulesolaire SOL2W 5,5 V / 360 mA × 1 Accu Li-Ion3,7 V 1050 mA × 1 Adafruit单色0.96“128x64 OLED图形显示器 × 1 ConnecteurUSB mini-USB B型 × 1 Commutateur × 1 / v4 C% O J" L手动工具和制造机器 手臂Mbed mbed 3D打印机(通用) ! A8 E, r6 M; y1 i( s 下面是我们项目的一些步骤: 1)Sigfox回调设置 Sigfox后端接收对应于测量数据的字节线程。每个数据都遵循前一个数据,因此有必要对它们进行解析。 ![]() Sigfox回调 在自定义有效负载配置部分,我们指出哪个字节对应于微控制器发送的变量。例如,8个第一位与空气温度匹配,其中8个是空气湿度等... 完成后,变量将使用我们的Sigfox设备的URL模式发送到相应的Ubidots帐户。 / p' Q# m, D* Y$ ]9 a$ p, Z2 m6 X8 ^3 Y" q 2)Ubidots 这是我们的Ubidots仪表板的视图。 ![]() ![]() 我们的仪表板 & d# _& F0 U. L8 U: w! G: ?您可以找到一个图表,显示作物环境的演变,以便快速浏览具有精确数据值的表格去了解作物环境,以获得更高的准确性。 ![]() : g" _( H) w, W 有关数据的其他工作,您可以通过电子邮件以.csv格式向自己或他人发送测量值。 6 I6 N2 `( O; w* H$ w* k 3)PCB板 我们使用Software Eagle实现了两块PCB板,一块用于传感器,另一块用于电源。 对于传感器PCB板,我们首先在labdec上测试它是否可以正常工作以确保正确的电路。确定电路图后,我们在库中查找相关组件。对于不在库中的组件,我们根据数据表将原件添加到库中并完成。 为了最终完成PCB,我们优化了布局并多次更改了组件的引脚。当然,每次优化都必须伴随Labdec测试。这是一个漫长但谨慎的过程,最后确保我们的PCB能够正常工作。 值得一提的是,与第一版PCB相比,上一版增加了三极管和屏幕开关来控制能耗。 ![]() 9 z( s& A6 V- h0 ~ ![]() 对于电源PCB板,基于lipo rider pro的电路,我们重新选择了该设备以优化能耗。根据所选器件的数据表,我们计算并设计了适当的电路,以完成系统的正常供电。 ![]() 7 ]" h! K$ W/ ? }+ w5 ]. k 2 U" s9 j8 d6 U% Y6 G ![]() Z! M. y; u9 n' O& K 7 S% [' f: Q1 b* B 4)盒子 这部分是关于包装我们的系统。我们使用Solidworks绘制并模型化了我们的盒子,这是一个允许您开发3D CAD设计的软件。 根据所需的空间,盒子是最小的,所有系统都可以放在里面。您可以在附件中找到我们框的Solidworks文件。 5)代码 我们使用Mbed开发了我们的项目,一个协作的在线编程软件。由于它包含众多库,因此实现代码的设计是非常容易并且非常直观。 每隔十分钟我们就会测量不同的数据并将它们发送到Sigfox后端。同时,数据显示在OLED屏幕上。这项工作取决于您可以在Mbed平台上找到的库。 您可以在附件中找到此项目的代码。 相关代码 #include "mbed.h" #include "DS18B20.h" //OneWire Temperature #include "DS1820.h" #include "DHT.h" //DHT22 #include "TSL2561_I2C.h" // Lux #include "TCS34725.h" //RGB #include "Adafruit_SSD1306.h" //OLED ' A7 g& b) S/ C c/ M6 k #include "mespings.h" " K9 c/ @9 p8 V2 Y) c #include "WakeUp.h" //Low Power Energy & A/ a) A. i; u3 p9 K #include "Sigfox.h" . ^) t3 X' V' b0 ] //SIGFOX Serial Sigfox(SIGFOX_RX, SIGFOX_TX); ' f4 e( G5 d: x* N void SendData( int TempAir, int HumiAir,int TempSol, int HumiSol, int Lumiere, int Red, int Green, int Blue){ ) U9 G- ^# r4 H- [& J Sigfox.printf("AT$SF=%02x%02x%02x%02x%04x%02x%02x%02x\r\n", TempAir, HumiAir, TempSol, HumiSol, Lumiere , Red,Green, Blue); } q* k; b, P2 h //OLED " F a Y; M# W) f( N I2 W class OLEDSPI : public SPI , R2 j2 K$ `' N3 F { 0 e, v5 ~) t% V* J public: 0 U1 j( r9 M9 p: @, u OLEDSPI(PinName mosi, PinName miso, PinName clk) : SPI(mosi,miso,clk) { format(8,3); frequency(2000000); }; }; OLEDSPI gSpi(MOSI,MISO,CLK); Adafruit_SSD1306_SpiOLED(gSpi,DC,RST,CS,LARGEUR_OLED,LONGUER_OLED); //sol_hum 9 w$ n' g5 D# K: B9 p! o AnalogIn MOIST_sensor(MOIST_DATA); 7 c5 C" p C$ h7 p float ReadSolHum(){ float Humidity=0.0; for (int i=0;i<NB_MESURES;i++){ / G; ~- B6 v. t# Q6 z3 X Humidity = Humidity + ((1 -MOIST_sensor.read()-MIN_MESURES)/(MAX_MESURES -MIN_MESURES ))*100; } Humidity /= NB_MESURES; # D4 g" D% S$ W( V9 ^$ a# C return Humidity; } //sol_temp ) H- |. N$ O) X4 } //DS18B20 Temperature(true, true, false,ONEWIRE_TEMP_PIN); // Temperature( crcOn, useAddress, parasitic, mbed pin ) DS1820 ONEWIRE_sensor(SOL_TEMP_DATA); //Capteur Température/Humidité de l'air DHT DHT_sensor(A0,DHT22); 9 N8 T2 S; t3 i- n6 n: j% M C* W TSL2561_I2C LUM_sensor(LUM_I2C_SDA,LUM_I2C_SCL); TCS34725 RGB_sensor(RGB_I2C_SDA,RGB_I2C_SCL); DigitalOut tr(D7); int main() { // Variables float Air_Temp = 0.0; float Air_Hum = 0.0; float Sol_Hum = 0.0; float Sol_Temp = 0.0; float Lum = 0.0; uint16_t R; uint16_t G; uint16_t B; uint16_t C; int OLEDLine = 0; // Initialisation de l'écran OLED.fillRect(ZERO,ZERO,LONGUER_OLED,LARGEUR_OLED,BLACK); OLED.setTextCursor(ZERO,DIX); OLED.printf(" EISE4-PROJET"); OLED.setTextCursor(ZERO,DEMI); OLED.printf(" PLANTSIGFOX"); OLED.display(); while(1){ tr = 1; // Initialisation des capteur while(DHT_sensor.readData()); ONEWIRE_sensor.begin(); LUM_sensor.enablePower(); ONEWIRE_sensor.startConversion(); RGB_sensor.init(TCS34725_INTEGRATIONTIME_2_4MS, TCS34725_GAIN_4X ); // OLED Reset OLED.clearDisplay(); OLED.fillRect(0,0,LARGEUR_OLED,LONGUER_OLED,BLACK); OLEDLine = 0; //obtenir des donnees Air_Temp=DHT_sensor.ReadTemperature(CELCIUS); Air_Hum=DHT_sensor.ReadHumidity(); RGB_sensor.getColor(R,G,B,C); Lum=LUM_sensor.getLux(); Sol_Temp=ONEWIRE_sensor.read(); Sol_Hum=ReadSolHum(); //affiche OLED.setTextCursor(0,OLEDLine); OLED.printf("Air TEMP = %4.2f C",Air_Temp); OLEDLine +=DIX; OLED.setTextCursor(0,OLEDLine); OLED.printf("Air HUM = %4.2f %%RH",Air_Hum); OLEDLine +=DIX; OLED.setTextCursor(0,OLEDLine); OLED.printf("Sol TEMP = %4.2f C ",Sol_Temp); OLEDLine +=DIX; OLED.setTextCursor(0,OLEDLine); OLED.printf("Sol Hum = %4.2f %%RH",Sol_Hum); OLEDLine +=DIX; OLED.setTextCursor(0,OLEDLine); OLED.printf("Light = %4.2f Lux", Lum); OLEDLine +=DIX; OLED.setTextCursor(0,OLEDLine); OLED.printf("R = %d G= %d B= %d",R,G,B); OLEDLine +=DIX; OLED.setTextCursor(0,OLEDLine); OLED.printf("Clear = %d",C); OLEDLine +=DIX; OLED.display(); SendData((int) Air_Temp, (int) Air_Hum, (int) Sol_Temp, (int) Sol_Hum,(int) Lum , R, G, B); tr = 0; sleep wait (TIME_TRAVAIL); OLED.fillRect(0,0,LONGUER_OLED,LARGEUR_OLED,BLACK); OLED.display(); WakeUp::set_ms(TIME_SLEEP); deepsleep(); } } 0 p8 Z- J/ i/ E! ^& l |