std::string DHT22::message() { std::stringstream ss; ss << "Hum: "<< humidity()<<" Temp: "<<temperature() << " Total Errors: "<<errors() << " Error Rate: "<<error_rate() << " Cycle: "<<cycles()<<std::endl; return ss.str(); }
void calibrate_countdown(void) { lcd.print("Starting rover"); lcd.display(); for (int i = 5; i > 0; i--) { _count(i*2 - 1); delay(1000); _count(i*2 - 2); humidity(); moisture(); delay(1000); } lcd.clear(); }
/*{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*} * Name: * Desc: * {*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{**/ void soiltemp_initprofile (REAL rr_wi[], REAL rr_ti[]) { int i; Copy_Array ( rr_w, rr_wi); Copy_Array ( rr_wn, rr_wi); Copy_Array ( rr_t, rr_ti); Copy_Array ( rr_tn, rr_ti); for ( i = 0; i <= e_mplus1; i++ ) { rr_p[i] = -exp ( 13.82 * ( 1 - rr_w[i] / r_xo ) ); rr_w[i] = watercontent ( rr_p[i], r_xo, &rr_dwdp[i]); rr_h[i] = humidity ( rr_p[i], rr_t[i], &rr_dhdp[i] ); rr_kev[i] = 0; rr_u[i] = 0; rr_enh[i] = 0; } }
void colour_humidity (Planet_colours& c, const Planet& p, const Season& s) { static const Colour water = Colour(1.0, 1.0, 1.0); static const Colour land_dry = Colour(1.0, 1.0, 0.5); static const Colour land_mid = Colour(1.0, 1.0, 0.0); static const Colour land_humid = Colour(0.0, 0.7, 0.0); for (const Tile& t : tiles(p)) { double h = humidity(nth_tile(s, id(t))) / saturation_humidity(temperature(nth_tile(s, id(t)))); if (is_water(nth_tile(terrain(p), id(t)))) { c.tiles[id(t)] = water; } else { if (h <= 0.5) { double d = h / 0.5; c.tiles[id(t)] = interpolate(land_dry, land_mid, d); } else { double d = (h-0.5)/0.5; c.tiles[id(t)] = interpolate(land_mid, land_humid, d); } } } }
/*{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*} * Name: soiltemp_step * Desc: This code was converted from orginal Pascal code, not really sure * what it exactly does * Note-1: Change 11-6-05, put work around for bug found. * Code can get stuck in an infinite loop. Discovered this with * some of DL's batch data. * I checked back with the orginal Pascal code and verified that * I converted the code correctly which it looks like I did. * This function the and code that call it have some serious logic * errors, see the i_its variable below, it never gets incremented * but is checked in the loop as a break control. I tried implementing * it but didn't completly help as the calling functions loop * would keep calling it again and again, seems that calling loop * doesn't have a way of timing out. * The inputs being sent into the upper lever Soil Sim via the * d_SI input struct that cause this problem are, roughly speaking, * because they seem vary with ranges are approx. fi 89, time 180 * moisture 25 'WET' * ER suggest we just put a check in to time out the loop and report * back to user that Soil Sim doesn't handle the situation * NOTE: I modified this function from a void to and int return, * and return 0 for the bug loop time out * Ret: 1 ok, else 0 = error, read above * * {*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{*}{**/ int soiltemp_step (REAL r_Rabs, REAL r_dt, int *ai_success, REAL r_time) { int i,i_its; int iN_SoilBug; iN_SoilBug = 0; /* REAL fff; */ rr_tn[0] = (REAL)e_Tair; i_its = 0; /*....................................................................... */ while (1) { /* {begin heat and water solutions} */ r_seh = 0; r_sev = 0; rr_ke[0] = 0; /* {hc}; {hc taken out so that surf. temp. not needed} */ rr_kev[0] = 6.2e-9 * (REAL)e_hc; /* {6.2e-9*hc makes heat and water cond. equal} */ rr_psat[0] = vaporpressure (rr_tn[0]); rr_h[0] = (REAL)e_airvp / rr_psat[0]; rr_psat[1] = vaporpressure (rr_tn[1]); r_wav = 0.5 * (rr_wn[1] + rr_wn[2]); rr_s[1] = slope (rr_tn[1], rr_psat[1]); rr_Hvap[1] = Hv (rr_tn[1]); rr_kh[1] = tcond (rr_tn[1], r_wav, r_xs, r_ls, r_ga, r_xwo, r_cop, rr_h[1] * rr_psat[1], rr_s[1], &rr_enh[1]); rr_AirPor[1] = (r_xws - r_wav); rr_kv[1] = rr_enh[1] * rr_AirPor[1] * (REAL)e_tor * Kvap(rr_t[1], rr_psat[1] * rr_h[1]); /*..........................................................................*/ for ( i = 1; i <= r_m; i++ ) { rr_cp[i] = rr_v[i] * (0.87 * r_bd + 4.18e6 * rr_wn[i]) / r_dt; rr_psat[i+1] = vaporpressure (rr_tn[i+1]); if ( i < r_m ) { r_wav = 0.5 * (rr_wn[i+1] + rr_wn[i+2]); r_tav = 0.5 * (rr_tn[i+1] + rr_tn[i+2]) + 273; } else { r_wav = rr_wn[e_mplus1]; r_tav = rr_tn[i+1] + 273; } rr_conv[i] = 0.5 * (rr_u[i-1] + rr_u[i]) * 1200 * 293 / r_tav; rr_vcon[i] = rr_conv[i] * (REAL)e_Mw / ( (REAL)e_R * 1200 * 293); rr_s[i+1] = slope(rr_tn[i+1], rr_psat[i+1]); rr_Hvap[i+1] = Hv (rr_tn[i+1]); rr_kh[i+1] = tcond (rr_tn[i+1], r_wav, r_xs, r_ls, r_ga, r_xwo, r_cop, rr_h[i+1] * rr_psat[i+1], rr_s[i+1], &rr_enh[i+1]); rr_ke[i] = (rr_kh[i]) / ((rr_z[i+1] - rr_z[i])) + rr_conv[i]; rr_AirPor[i+1] = (r_xws - r_wav); rr_kv[i+1] = rr_enh[i+1] * rr_AirPor[i+1] * (REAL)e_tor * Kvap (rr_t[i+1], rr_psat[i+1] * rr_h[i+1]); rr_kev[i] = (rr_kv[i] + rr_kv[i+1]) / (2 * (rr_z[i+1] - rr_z[i])) + rr_vcon[i]; r_dJv = rr_kev[i-1] * (rr_psat[i] * rr_h[i] - rr_psat[i-1] * rr_h[i-1]) - rr_kev[i] * (rr_psat[i+1] * rr_h[i+1] - rr_psat[i] * rr_h[i]); r_dJvdt = rr_s[i] * rr_h[i] * (rr_kev[i-1] + rr_kev[i]); r_dJvdp = rr_psat[i] * (rr_kev[i-1] + rr_kev[i]) * rr_dhdp[i]; r_dC = rr_ke[i-1] * (rr_tn[i] - rr_tn[i-1]) - rr_ke[i] * (rr_tn[i+1] - rr_tn[i]) + rr_cp[i] * (rr_tn[i] - rr_t[i]) - rr_Hvap[i] * (REAL)e_dw * rr_v[i] * (rr_wn[i] - rr_w[i]) / r_dt; r_dv = r_dJv + (REAL)e_dw * rr_v[i] * (rr_wn[i] - rr_w[i]) / r_dt; r_dCdp = - rr_Hvap[i] * (REAL)e_dw * rr_v[i] * rr_dwdp[i] / r_dt; r_dvdp = r_dJvdp + (REAL)e_dw * rr_v[i] * rr_dwdp[i] / r_dt; r_dvdt = r_dJvdt; r_dCdt = rr_ke[i] + rr_ke[i-1] + rr_cp[i]; if ( i == 1) { r_tk = rr_tn[1] + 273; r_tk3 = r_tk * r_tk * r_tk; r_dC = r_dC - r_Rabs + 5.67e-8 * r_tk * r_tk3; r_dCdt = r_dCdt + 4 * 5.67e-8 * r_tk3; } r_sev = r_sev + abs_Real(r_dv); r_seh = r_seh + abs_Real(r_dC); r_dtn = (r_dv * r_dCdp - r_dC * r_dvdp) / (r_dCdp * r_dvdt - r_dCdt * r_dvdp); if ( r_dtn < -100 ) r_dtn = -100; rr_tn[i] = rr_tn[i] - r_dtn; r_dtn = ( r_dv - r_dvdt * r_dtn) / r_dvdp; rr_p[i] = rr_p[i] - r_dtn; if ( rr_p[i] > 0 ) rr_p[i] = ( rr_p[i] + r_dtn ) * 0.5; if ( rr_p[i] < -1e20 ) rr_p[i] = -1e20; rr_wn[i] = watercontent (rr_p[i], r_xo, &rr_dwdp[i]); rr_h[i] = humidity (rr_p[i], rr_tn[i], &rr_dhdp[i]); } /* for i end */ /*...........................................................................*/ /* Change 11-6-05, Catch infinite loop bug, See Note-1 above */ iN_SoilBug++; if ( iN_SoilBug >= 50 ) return 0; /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ if ( (r_sev < (REAL)e_epsw && r_seh < (REAL)e_epse) || i_its > e_maxits ) break; } /* while (1) end */ /*.........................................................................*/ if ( i_its < e_maxits ) { *ai_success = 1; /* changed 3-27-00 */ /* rr_u[r_m] = 0; got error when compliling as C++ */ rr_u[(int)r_m] = 0; for ( i = r_m; i >= 1; i-- ) { r_gvol = (REAL)e_dw * rr_v[i] * (REAL)e_R * (rr_tn[i] + 273) * (rr_w[i] - rr_wn[i]) / (r_dt * rr_AirPor[i] * (REAL)e_Mw * (REAL)e_Patm); if ( r_gvol < 0 ) r_gvol = 0; rr_u[i-1] = rr_u[i] + r_gvol; } for ( i = 1; i <= e_mplus1; i++ ) { r_ch = rr_wn[i] - rr_w[i]; rr_w[i] = rr_wn[i]; rr_wn[i] = rr_w[i] + r_ch; r_ch = rr_tn[i] - rr_t[i]; rr_t[i] = rr_tn[i]; rr_tn[i] = rr_t[i] + r_ch; } } else *ai_success = 0; return 1; }
/* Construct Packet */ void Construct_Packet(void) { //Serial.println("construct packet top"); //Variable for Index and uptime unsigned long uptime_ms; //Put schema number in packet G_packet.schema = 297; //Update data uptime_ms = millis(); //Put uptime in packet G_packet.uptime_ms = uptime_ms; //Poll and put battery and panel data in packet for(int p = 0; p < 6; p++) { G_packet.batt_mv[p] = battery(); G_packet.panel_mv[p] = panel(); delay(400); } //Poll and put panel data in packet /*for(int p = 0; p < 6; p++) { G_packet.panel_mv[p] = panel(); delay(400); }*/ G_packet.bmp185_press_pa = pressure(); G_packet.bmp185_temp_decic = temp(); G_packet.humidity_centi_pct = humidity(); //Poll and put irradiance data in packet for(int i = 0; i < 20; i++) { G_packet.solar_irr_w_m2[i] = irradiance(); delay(300); } /*//Hardcoded Test Packet G_packet.uptime_ms = 1; for(int p = 0; p <= 4; p++) { G_packet.batt_mv[p] = 1; Serial.print("Battery"); Serial.println(G_packet.batt_mv[p]); delay(400); } for(int p = 0; p <= 4; p++) { G_packet.panel_mv[p] = 2; Serial.print("Panel"); Serial.println(G_packet.panel_mv[p]); delay(400); } G_packet.bmp185_press_pa = 3; Serial.print("Pressure"); Serial.println(G_packet.bmp185_press_pa); G_packet.bmp185_temp_decic = 4; Serial.print("Temp"); Serial.println(G_packet.bmp185_temp_decic); G_packet.humidity_centi_pct = 5; Serial.print("Humidity"); Serial.println(G_packet.humidity_centi_pct); for(int i = 0; i <= 14; i++) { G_packet.solar_irr_w_m2[i] = 6; Serial.print("Solar"); Serial.println(G_packet.solar_irr_w_m2[i]); delay(1000); }*/ }
//****************************************************************************** void SHSensors::handleUpdate() { const float fToC = 9.0 / 5.0; const float fOffset = 32; //*** read all data *** while ( imu_->IMURead() ) { //*** get IMU data *** RTIMU_DATA imuData = imu_->getIMUData(); //*** pressure / temperature *** if ( ((enabled_ & IMU_PRESSURE) || (enabled_ & IMU_TEMP)) && pressure_ ) { pressure_->pressureRead( imuData ); if ( enabled_ & IMU_PRESSURE ) { //*** pressure in hPa *** emit pressure( imuData.pressure, RTMath::convertPressureToHeight(imuData.pressure) ); } if ( enabled_ & IMU_TEMP ) { //*** temp celsius, fahrenheit *** emit temperature( imuData.temperature, imuData.temperature * fToC + fOffset ); } } //*** humidity *** if ( (enabled_ & IMU_HUMIDITY) && humidity_ ) { humidity_->humidityRead( imuData ); //*** relative humidity *** emit humidity( imuData.humidity ); } //*** gyroscope *** if ( enabled_ & IMU_GYRO ) { //*** gyroscope in degrees per second *** emit gyro( imuData.gyro.x() * RTMATH_RAD_TO_DEGREE, imuData.gyro.y() * RTMATH_RAD_TO_DEGREE, imuData.gyro.z() * RTMATH_RAD_TO_DEGREE ); } //*** accelerometer *** if ( enabled_ & IMU_ACCEL ) { //*** acceleration in g's ***' emit accel( imuData.accel.x(), imuData.accel.y(), imuData.accel.z(), imuData.accel.length() ); } //*** compass *** if ( enabled_ & IMU_COMPASS ) { //*** compas (magnetometer) in uT *** emit compass( imuData.compass.x(), imuData.compass.y(), imuData.compass.z(), imuData.compass.length() ); } //*** always emit fusion data - degrees *** float fusionX = imuData.fusionPose.x() * RTMATH_RAD_TO_DEGREE; float fusionY = imuData.fusionPose.y() * RTMATH_RAD_TO_DEGREE; float fusionZ = imuData.fusionPose.z() * RTMATH_RAD_TO_DEGREE; emit fusionPose( fusionX, fusionY, fusionZ ); } }