Example #1
0
/*
 * Update Current Sensors and update the Sensors data Cache
 */
void Sensors::update_sensors(void){
	 float curr_moisture=moisture_read();
	    float curr_temps= getTemp();
	    float curr_flowrate=getWaterFlowRate();
	    sensors_values.cached_moisture=curr_moisture;
	    sensors_values.cached_temperature=curr_temps;
		sensors_values.cached_waterlevel = getWaterLevel(); // Boolean indicates if we have water or not.
		sensors_values.cached_flowvolume+=curr_flowrate/60000;//FlowRate(L/m) to FlowRate(m3/s).
		sensors_values.cached_fieldCapacity=readFieldCapacity();
}
void demo_test(){
    tempcounter=2;
    char c=0;
    //if(SolarStatus()==1){
        if (BatteryCharged()){
//            if (ReadInitFlag()==0){                             //check if its first initialisation of device
//                GSM_ON();                                       //turn on GSM module
//                SIM900_SEND(2);                                 //send a configuration request message to server
//                SetInitFlag();                                  //set initcheck flag
//            }
            for (char d=0; d<TRANSMIT_FREQ; d++){
                days++;                                         //increment days
                for (int i=0; i<tempcounter; i++){
                    getTempHum();                               //get temperature and humidity sensor
                    while ((TEMP_INT==0)&&(c<=3)){              //check DHT11 sensor 3 times for reading if no data received
                        getTempHum();
                        c++;
                    }
                    DayTEMP[i]=TEMP_INT;
                    DayHUM[i]=RH_INT;
                    delay_1s(3);                               //wait 30 seconds between each temperature readings
                }
                avgTempHum();                                   //calculate average temperature and humidity
                minmaxTempHum();                                //calculate minimum and maximum temperature and humidity
                getWaterLevel();                                //get water level from ultrasonic sensor
                getConductivity();
                getSolarReading();
                getBatteryReading();
                ShiftData();                                    //shift gathered data by offset
                if ((WaterLevel-OFFSET) >= WATER_THRESHOLD){    //check if water level is too low
                    SMS_data[0]=WARNING_PREFIX;                 //initiate message with warning char
                    SMS_data[1]=WaterLevel;                     //put water level in text message
                    SMS_data[2]=DATA_SUFFIX;                    //end message with suffix

                    GSM_ON();                                   //turn on sim900
                    delay_1s(5);                               //wait for GSM to connect to network
                    SIM900_SEND(1);                             //Send data message to server
                    GSM_OFF();                                  //turn off sim900
                }
                SaveData();                                     //Sava sensor readings to memory
            }
        }
        if (!BatteryCharged()){
            MonitorBattery();
        }
    SMS_data[0]=DATA_PREFIX;                            //start message with prefix
    gatherData();                                       //read data from memory
    getCheckByte();                                     //calculate check byte
    GSM_ON();                                           //turn on sim900
    delay_1s(10);                                       //wait for GSM to connect to network
    puts1USART("AT\r\n");
    delay_1s(5);
    SIM900_SEND(1);                                     //Send data message to server
   //} //solarpanel check
}
// MAIN =======================================================================================================================
void WaterController::main() {
	wait(start_flag);
	for (;;) {
		wait(interval_clock);
		int newlevel = getNewWaterLevel();
		int level = getWaterLevel();
		if (level >= newlevel) {
			valving(0);	
			if (level > newlevel) {
				pumping(1);		
			}
		}
		else {
			pumping(0);	
			valving(1);
		}
		newlevel = getNewWaterLevel();
		level = getWaterLevel();
		if(level == newlevel) {
			wascontroller->setWaterLevelReached();
		}
	}
}
// MAIN =======================================================================================================================
void WaterController::main() {
	wait(start_flag);
	for (;;) {
		wait(interval_clock);
		int newlevel = getNewWaterLevel();
		//std::cout << newlevel << " dit is het nieuwe level\n";
		int level = getWaterLevel();
		//std::cout << level << " dit is het huidige level\n";
		if (level >= newlevel) {
			wascontroller->setWaterLevelReached();
			valving(0);	
			if (level > newlevel) {
				//std::cout << "teveel water.......\n";
				pumping(1);		
			}
		}
		else {
			//std::cout << "te weinig water... vullen\n";
			pumping(0);	
			valving(1);
		}
	}
}
void routine(){
        START:
        if(SolarStatus()==1){                                       //if solar-panel is on
            solarcounter = 0;

            while (BatteryCharged()){                               //if battery is charged
                if (ReadInitFlag()==0){                             //check if its first initialisation of device
                    GSM_ON();                                       //turn on GSM module
                    SIM900_SEND(2);                                 //send a configuration request message to server
                    SetInitFlag();                                  //set initcheck flag
                }
                char c=0;
                while ((TEMP_INT==0)&&(c<=3)){                      //check DHT11 sensor 3 times for reading if no data received
                    getTempHum();
                    c++;
                }
                DayTEMP[tempcounter]=TEMP_INT;
                DayHUM[tempcounter]=RH_INT;
                tempcounter++;
                delay_1ms(1);
                sleep();

                if (tempcounter==2){
                    days++;                                         //increment days
                    avgTempHum();                                   //calculate average temperature and humidity
                    minmaxTempHum();                                //calculate minimum and maximum temperature and humidity
                    getConductivity();                              //get conductivity value from sensor
                    getWaterLevel();                                //get water level from ultrasonic sensor

                    ShiftData();                                    //shift gathered data by offset
                    if ((WaterLevel-OFFSET) >= WATER_THRESHOLD){    //check if water level is too low
                        SMS_data[0]=WARNING_PREFIX;                 //initiate message with warning char
                        SMS_data[1]=WaterLevel;                     //put water level in text message
                        SMS_data[2]=DATA_SUFFIX;                    //end message with suffix

                        GSM_ON();                                   //turn on sim900
                        delay_1s(10);                               //wait for GSM to connect to network
                        SIM900_SEND(1);                             //Send data message to server
                    }
                }
            }
            if (!BatteryCharged()){
                MonitorBattery();
            }
            if (SolarStatus()==0)                                  //if solar-panel is off
                goto OFF;
            goto START;

        }
        else {                                                      //when solar-panel is off
            OFF:
            SaveData();                                             //Sava sensor readings to memory
            tempcounter=0;

            //check if data transmission frequency is met
            if (days >= TRANSMIT_FREQ){
                SMS_data[0]=DATA_PREFIX;                            //start message with prefix
                gatherData();                                       //read data from memory
                getCheckByte();                                     //calculate check byte
                GSM_ON();                                           //turn on sim900
                delay_1s(10);                                       //wait for GSM to connect to network
                SIM900_SEND(1);                                     //Send data message to server
                days=0;
            } //reset days counter only after successful tranmsission

            //sleep for 6h
            for (char z=0; z<3; z++){
                sleep();
            }

            while (SolarStatus()==2){ //if solar-panel is off
                for (char z=0; z<5; z++){
                    delay_1s(60);
                }
                solarcounter++;
                if (solarcounter > SOLAR_THRESHOLD){
                        //turn on Fault LED
                        goto START;
                }
            }
        }

}