Working weather station
Dependencies: DHT MS5637 NRF2401P mbed
main.cpp@0:47c7fddba92c, 2015-06-12 (annotated)
- Committer:
- ree5yd
- Date:
- Fri Jun 12 14:18:48 2015 +0000
- Revision:
- 0:47c7fddba92c
Working weather station!
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ree5yd | 0:47c7fddba92c | 1 | #include "mbed.h" |
ree5yd | 0:47c7fddba92c | 2 | #include "ms5637.h" |
ree5yd | 0:47c7fddba92c | 3 | #include "DHT.h" |
ree5yd | 0:47c7fddba92c | 4 | #include "NRF2401P.h" |
ree5yd | 0:47c7fddba92c | 5 | #include "nRF24l01.h" |
ree5yd | 0:47c7fddba92c | 6 | |
ree5yd | 0:47c7fddba92c | 7 | ms5637 ms(PTC9,PTC8); // i2c pins used |
ree5yd | 0:47c7fddba92c | 8 | Serial pc(USBTX, USBRX); // local terminal interface |
ree5yd | 0:47c7fddba92c | 9 | AnalogIn ldr(PTB3); |
ree5yd | 0:47c7fddba92c | 10 | DHT sensor(PTE5,SEN11301P); |
ree5yd | 0:47c7fddba92c | 11 | Serial myarduino(PTE0, PTE1); |
ree5yd | 0:47c7fddba92c | 12 | |
ree5yd | 0:47c7fddba92c | 13 | int main (void) { |
ree5yd | 0:47c7fddba92c | 14 | //pc.baud(921600); // set up USB serial speed |
ree5yd | 0:47c7fddba92c | 15 | |
ree5yd | 0:47c7fddba92c | 16 | // set up the ms5637 |
ree5yd | 0:47c7fddba92c | 17 | pc.printf("\n\nInitializing the MS5637..\n"); |
ree5yd | 0:47c7fddba92c | 18 | ms.cmd_reset(); |
ree5yd | 0:47c7fddba92c | 19 | pc.printf("Ready\n"); |
ree5yd | 0:47c7fddba92c | 20 | |
ree5yd | 0:47c7fddba92c | 21 | float Vo; |
ree5yd | 0:47c7fddba92c | 22 | // float R = 10000; // 10k |
ree5yd | 0:47c7fddba92c | 23 | // float Vin = 3.3; // input from 3V3 |
ree5yd | 0:47c7fddba92c | 24 | |
ree5yd | 0:47c7fddba92c | 25 | int err; |
ree5yd | 0:47c7fddba92c | 26 | printf("\r\n Test program"); |
ree5yd | 0:47c7fddba92c | 27 | printf("\r\n******************\r\n"); |
ree5yd | 0:47c7fddba92c | 28 | |
ree5yd | 0:47c7fddba92c | 29 | //NRF |
ree5yd | 0:47c7fddba92c | 30 | long long addr1=0xAB01CD; // setup address - any 5 byte number - same as RX |
ree5yd | 0:47c7fddba92c | 31 | int channel =0x10; // [0-126] setup channel, must be same as RX |
ree5yd | 0:47c7fddba92c | 32 | bool txOK; |
ree5yd | 0:47c7fddba92c | 33 | char msg[32]; |
ree5yd | 0:47c7fddba92c | 34 | char ackData[32]; |
ree5yd | 0:47c7fddba92c | 35 | char len; |
ree5yd | 0:47c7fddba92c | 36 | |
ree5yd | 0:47c7fddba92c | 37 | // Setup |
ree5yd | 0:47c7fddba92c | 38 | NRF2401P nrf1(PTD2,PTD3, PTD1,PTD5, PTD0); //mosi, miso, sclk, csn, ce) |
ree5yd | 0:47c7fddba92c | 39 | nrf1.quickTxSetup(channel, addr1); // sets nrf24l01+ as transmitter |
ree5yd | 0:47c7fddba92c | 40 | printf("set up complete \n\r"); |
ree5yd | 0:47c7fddba92c | 41 | // |
ree5yd | 0:47c7fddba92c | 42 | |
ree5yd | 0:47c7fddba92c | 43 | //initialise data to be sent |
ree5yd | 0:47c7fddba92c | 44 | char bufferL[50]; |
ree5yd | 0:47c7fddba92c | 45 | char bufferT[50]; |
ree5yd | 0:47c7fddba92c | 46 | char bufferP[50]; |
ree5yd | 0:47c7fddba92c | 47 | char bufferH[50]; |
ree5yd | 0:47c7fddba92c | 48 | |
ree5yd | 0:47c7fddba92c | 49 | int nL; |
ree5yd | 0:47c7fddba92c | 50 | int nT; |
ree5yd | 0:47c7fddba92c | 51 | int nP; |
ree5yd | 0:47c7fddba92c | 52 | int nH; |
ree5yd | 0:47c7fddba92c | 53 | |
ree5yd | 0:47c7fddba92c | 54 | myarduino.baud(9600); |
ree5yd | 0:47c7fddba92c | 55 | |
ree5yd | 0:47c7fddba92c | 56 | wait(1); // wait 1 second for device stable status |
ree5yd | 0:47c7fddba92c | 57 | |
ree5yd | 0:47c7fddba92c | 58 | while(1) { |
ree5yd | 0:47c7fddba92c | 59 | // Humidity and temperature DHT11 sensor |
ree5yd | 0:47c7fddba92c | 60 | err = sensor.readData(); |
ree5yd | 0:47c7fddba92c | 61 | if (err == 0) { |
ree5yd | 0:47c7fddba92c | 62 | printf("\n\r\n\rHumidity is %4.2f \r\n",sensor.ReadHumidity()); |
ree5yd | 0:47c7fddba92c | 63 | printf("Temperature is %4.2f C \r\n",sensor.ReadTemperature(CELCIUS)); |
ree5yd | 0:47c7fddba92c | 64 | } else { |
ree5yd | 0:47c7fddba92c | 65 | while ( err != 0 ) { |
ree5yd | 0:47c7fddba92c | 66 | err = sensor.readData(); |
ree5yd | 0:47c7fddba92c | 67 | } |
ree5yd | 0:47c7fddba92c | 68 | printf("\n\r\n\rHumidity is %4.2f \r\n",sensor.ReadHumidity()); |
ree5yd | 0:47c7fddba92c | 69 | printf("Temperature is %4.2f C \r\n",sensor.ReadTemperature(CELCIUS)); |
ree5yd | 0:47c7fddba92c | 70 | } |
ree5yd | 0:47c7fddba92c | 71 | |
ree5yd | 0:47c7fddba92c | 72 | // Temperature and pressure sensor ms |
ree5yd | 0:47c7fddba92c | 73 | double Temp2 = ms.calcTemp(); //calculate press and temp, then returns current temperature in degC |
ree5yd | 0:47c7fddba92c | 74 | double Press = ms.calcPressure(); //calculate press and temp, then returns current pressure in mb |
ree5yd | 0:47c7fddba92c | 75 | double GetPress = ms.getPressure(); //returns current pressure in mb. Does no calculations. Ususally done after calcTemp() |
ree5yd | 0:47c7fddba92c | 76 | |
ree5yd | 0:47c7fddba92c | 77 | pc.printf("Temp: %.2f degC\n\r", Temp2); |
ree5yd | 0:47c7fddba92c | 78 | pc.printf("Barometer: %.1f mB %.3f in/Hg\n\r", Press, Press * 0.0295301); |
ree5yd | 0:47c7fddba92c | 79 | |
ree5yd | 0:47c7fddba92c | 80 | // Light Sensor LDR |
ree5yd | 0:47c7fddba92c | 81 | Vo = ldr.read(); |
ree5yd | 0:47c7fddba92c | 82 | // float Rt = (Vo*R)/(Vin - Vo); |
ree5yd | 0:47c7fddba92c | 83 | // float FTC = (powf(10,5.57644))*(powf(Rt,-1.211743)); |
ree5yd | 0:47c7fddba92c | 84 | // float Lux = FTC*10.76; |
ree5yd | 0:47c7fddba92c | 85 | // FAULTY:float pd = (-3.4099 *10000000)*(Vo)*Vo + (3.1612e5)*(Vo) - 266.5672; |
ree5yd | 0:47c7fddba92c | 86 | float pd = 1.7833/Vo; |
ree5yd | 0:47c7fddba92c | 87 | printf("Sensor reading (Vo): %f V\r\n", Vo); |
ree5yd | 0:47c7fddba92c | 88 | printf("Sensor reading (power density): %f W/m^2\r\n\r\n", pd); |
ree5yd | 0:47c7fddba92c | 89 | |
ree5yd | 0:47c7fddba92c | 90 | // printf("FTC: %f\r\n",FTC); |
ree5yd | 0:47c7fddba92c | 91 | // printf("Lux: %f\r\n\r\n",Lux); |
ree5yd | 0:47c7fddba92c | 92 | |
ree5yd | 0:47c7fddba92c | 93 | wait(2); |
ree5yd | 0:47c7fddba92c | 94 | |
ree5yd | 0:47c7fddba92c | 95 | |
ree5yd | 0:47c7fddba92c | 96 | //Light |
ree5yd | 0:47c7fddba92c | 97 | sprintf(msg, "l%0.3fL\n\r",pd); |
ree5yd | 0:47c7fddba92c | 98 | txOK= nrf1.transmitData(msg,strlen(msg)); |
ree5yd | 0:47c7fddba92c | 99 | printf("L sent \n\r"); |
ree5yd | 0:47c7fddba92c | 100 | |
ree5yd | 0:47c7fddba92c | 101 | // read ack data if available |
ree5yd | 0:47c7fddba92c | 102 | if (nrf1.isAckData()) { |
ree5yd | 0:47c7fddba92c | 103 | len= nrf1.getRxData(ackData); // len is number of bytes in ackData |
ree5yd | 0:47c7fddba92c | 104 | ackData[len]=0; |
ree5yd | 0:47c7fddba92c | 105 | printf("%s\n\r\n\r",ackData); |
ree5yd | 0:47c7fddba92c | 106 | } |
ree5yd | 0:47c7fddba92c | 107 | //Temperature |
ree5yd | 0:47c7fddba92c | 108 | sprintf(msg, "t%0.3fT\n\r",Temp2); |
ree5yd | 0:47c7fddba92c | 109 | txOK= nrf1.transmitData(msg,strlen(msg)); |
ree5yd | 0:47c7fddba92c | 110 | printf("T sent \n\r"); |
ree5yd | 0:47c7fddba92c | 111 | |
ree5yd | 0:47c7fddba92c | 112 | // read ack data if available |
ree5yd | 0:47c7fddba92c | 113 | if (nrf1.isAckData()) { |
ree5yd | 0:47c7fddba92c | 114 | len= nrf1.getRxData(ackData); // len is number of bytes in ackData |
ree5yd | 0:47c7fddba92c | 115 | ackData[len]=0; |
ree5yd | 0:47c7fddba92c | 116 | printf("%s\n\r\n\r",ackData); |
ree5yd | 0:47c7fddba92c | 117 | } |
ree5yd | 0:47c7fddba92c | 118 | //Pressure |
ree5yd | 0:47c7fddba92c | 119 | sprintf(msg, "p%0.3fP\n\r",Press); |
ree5yd | 0:47c7fddba92c | 120 | txOK= nrf1.transmitData(msg,strlen(msg)); |
ree5yd | 0:47c7fddba92c | 121 | printf("P sent \n\r"); |
ree5yd | 0:47c7fddba92c | 122 | |
ree5yd | 0:47c7fddba92c | 123 | // read ack data if available |
ree5yd | 0:47c7fddba92c | 124 | if (nrf1.isAckData()) { |
ree5yd | 0:47c7fddba92c | 125 | len= nrf1.getRxData(ackData); // len is number of bytes in ackData |
ree5yd | 0:47c7fddba92c | 126 | ackData[len]=0; |
ree5yd | 0:47c7fddba92c | 127 | printf("%s\n\r\n\r",ackData); |
ree5yd | 0:47c7fddba92c | 128 | } |
ree5yd | 0:47c7fddba92c | 129 | //Humidity |
ree5yd | 0:47c7fddba92c | 130 | sprintf(msg, "h%0.3fH\n\r",sensor.ReadHumidity()); |
ree5yd | 0:47c7fddba92c | 131 | txOK= nrf1.transmitData(msg,strlen(msg)); |
ree5yd | 0:47c7fddba92c | 132 | printf("H sent \n\r\n\r"); |
ree5yd | 0:47c7fddba92c | 133 | |
ree5yd | 0:47c7fddba92c | 134 | // read ack data if available |
ree5yd | 0:47c7fddba92c | 135 | if (nrf1.isAckData()) { |
ree5yd | 0:47c7fddba92c | 136 | len= nrf1.getRxData(ackData); // len is number of bytes in ackData |
ree5yd | 0:47c7fddba92c | 137 | ackData[len]=0; |
ree5yd | 0:47c7fddba92c | 138 | printf("%s\n\r\n\r",ackData); |
ree5yd | 0:47c7fddba92c | 139 | } |
ree5yd | 0:47c7fddba92c | 140 | } |
ree5yd | 0:47c7fddba92c | 141 | } |