|
本帖最后由 点点&木木 于 2019-4-12 12:15 编辑 介绍 我们是PolytechSorbonne的3名工程专业的学生,专门从事电子和计算机科学。我们的项目是帮助其他学生的工作。我们必须收集很多不同的DATA,如地面和空气的温度,湿度...... 问题:我们的项目需要低消耗,抗水和耐用,因为它意味着在山上野外 微控制器恢复传感器的数据,并在屏幕上实时显示信息。它还通过SigFox天线将这些数据发送到名为Ubidots的在线服务器。 该系统完全自主:它由太阳能电池板充电的电池供电,每小时唤醒一次以收集和发送数据。
硬件组件 STM32 Nucleo L432KC × 1 DHT22温度传感器 × 1 Adafruit防水DS18B20数字温度传感器 × 1 DFRobot SEN0193 × 1 Adafruit BMP183 × 1 MPU9250 × 1 1)代码 为了开发我们的项目,我们使用了Mbed。这是一个在线编程软件。它的特殊之处在于它是一个协作平台,你可以找到很多由传感器支持的库。它易于使用。
为了消耗尽可能少的能量,我们在卡上使用了睡眠模式,这使得我们的盒子在等待时几乎没有任何消耗。我们决定每小时唤醒一次,以便在再次入睡之前收集并发送数据。 此外,允许盒子通过一个小开关使用它的液晶显示器,只有当人们在周围时,在野外时他们可以让盒子关闭它。 2)在线服务器 我们使用Sigfox技术,发送数据,然后通过回调,所有内容都以Json格式发送给ubidot Text。这项技术很有意思,因为它具有非常好的覆盖范围,完全符合我们的项目问题,例如从阿尔卑斯山发送数据。
所有数据都可以显示在仪表板上。然后可以在CSV文件中下载所有内容。为了使我们的数据更精确一点,每个变量在发送时被100倍除以ubidot 100,并获得浮动数据
3)卡 我们选择ALTIUM DESIGNER来制作我们的PCB。在这张卡上,我们放置了微控制器和所有传感器。 原理图
代码 // PROGRAMME PRINCIPALE #include "mbed.h" #include "DHT.h" #include "ssd1306.h" #include "standard_font.h" #include "bold_font.h" #include "DS1820.h" #include "BMP183.h" //#include "MPU9250.h" #define TIMERR 2 #define DEBUG 0 #define SLEEPTIME 3600 Serial sig(D1,D0); Serial sig2(USBTX,USBRX); DigitalOut ChipSelectBaro(A3); //SPI spi(SPI_MOSI, SPI_MISO, SPI_SCK) SPI spi(D11, D12, D13); AnalogIn moisture(A0); DHT C1(A2,AM2302); DigitalOut myled(LED1); SSD1306 oled(D3 /* cs */, D6/* reset */, A5 /* dc */, A4 /* clock */, D2 /* data */); DS1820 probe(A1); int Dht22(void); int Ds1820(void); int Sen0193(void); int Baro(BMP183 baro); int InitBaro(BMP183 baro); float temp,hum,tempS; float pres,alt; float humS; int varReveil; void callbackReveil (void){ varReveil = 0; } Ticker flipper; int main() { int test =0; // BMP183 baro(SPI_MOSI, SPI_MISO, SPI_SCK, D2); BMP183 baro(D11, D12, D13, A3); oled.initialise(); oled.clear(); oled.set_contrast(255); // max contrast oled.set_font(bold_font, 8); oled.printf("Petit Callou\r\n Des Alpes\r\n"); oled.set_font(standard_font, 6); // oled.printf("\r\n Test program\n"); //oled.printf("******************\r\n"); wait(1); // wait 1 second for device stable status oled.update(); test = InitBaro(baro); baro.getCalibrationData(); int i=0; while(1){ Dht22(); Ds1820(); Sen0193(); if(test == 1); Baro(baro); oled.printf("\r\n****Petit Caillou****\r\n"); oled.printf("Temp Air: %2.2fC \r\nSol: %2.2fC\r\n",temp,tempS); oled.printf("Hum Air: %2.2f/100 \r\nSol: %2.2f/100\r\n",hum,humS/10); oled.printf("Pres %2.2fPa \r\nAlt: %2.2fm\r\n", pres, alt); oled.update(); temp = temp*100; hum = hum *100; tempS = tempS*100; humS = humS/10; sig.printf("AT$SF="); sig.printf("%04x%04x%04x%04x%04x%04x",(int)temp,(int)hum,(int)tempS,(int)pres,(int)alt,(int)humS); sig.printf("\r\n"); sig2.printf("AT$SF="); sig2.printf("%04x%04x%04x%04x%04x%04x",(int)temp,(int)hum,(int)tempS,(int)pres,(int)alt,(int)humS); sig2.printf("\r\n"); if(DEBUG == 1) { oled.printf("Msg Envoye\n\r"); } i++; varReveil = 1; flipper.attach(&callbackReveil, SLEEPTIME); while(varReveil==1){ sleep(); } flipper.detach(); // wait(6); } } int InitBaro(BMP183 baro){ int status; int go = -1; status = baro.getID(); if(status != 0x55) { go = -1; oled.printf("Communication to Barofailed...\n"); }else { oled.printf("Baro OK!\n\r"); go = 1; } return go; } int Baro(BMP183 baro){ baro.read(); pres = baro.Pressure; alt = baro.Altitude; if(DEBUG == 1) { oled.printf("\r\n*****BMP183****\r\n"); oled.printf("Temp.: %f\r\n", baro.Temperature); oled.printf("Pres.: %f\r\n", pres); oled.printf("Alt.: %f\r\n", alt); oled.printf("***************\r\n"); oled.update(); } return 0; } int Ds1820(void){ probe.convertTemperature(true, DS1820::all_devices); //Start temperature conversion, wait until ready tempS = probe.temperature(); if(DEBUG == 1) { oled.printf("\r\n*****Ds1820****\r\n"); oled.printf("It is %3.1foC\r\n", tempS); oled.printf("***************\r\n"); oled.update(); } // wait(TIMERR); return 0; } int Dht22(void){ // float temp,hum; C1.readData(); hum = C1.ReadHumidity(); temp = C1.ReadTemperature(CELCIUS); if(DEBUG == 1) { oled.printf("\r\n******DHT22******\r\n"); oled.printf("temp = %6.2f C\r\n", temp); oled.printf("hum = %6.2f%\r\n", hum); oled.printf("*****************\r\n"); oled.update(); } // wait(TIMERR); return 0; } int Sen0193(void){ float value = 0.0f,valuefin=0.0f; int valueint=0; value = moisture; valueint = moisture *100; valuefin = (78-valueint )* 100 / 40; humS=valuefin; if(DEBUG == 1) { oled.printf("\r\n*****SEN0193****\r\n"); oled.printf("hum du sol : %2.2f // :%2.2f/100\n", value,valuefin); oled.printf("\r\n*****************\r\n"); oled.update(); } // wait(TIMERR); return 0; } |
| 好东西 值得欣赏 谢谢 |
| 路过 |
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移植
微信公众号
手机版