A Banana Pro Weather Logger
wl_jobs; a C program to run the weather logger
Previously in Mark I and Mark II weather loggers I turned things on and off and polled data with a bunch of short BASH scripts. This time around I put together a C program, wl_jobs to do it all with different options for different tasks.
/*/////////////////////////////////////////////////////////////// / ws-jobs.c RM20190428 / / / / This program is used to control Gpio pins in order to power / / up/down the circuit board, blink the LED, monitor a pin that / / records rain guage bucket tips and shuts down the Banana Pro / / when the shut down button is pressed. / / Usage: wl_jobs [OPTION] / / -u Power up circuit board and LED. / / -b Blink LED / / -d Shut down circuit board and / / -p Poll LeoStick and get weather data. / / -s Monitor tip count pin and shutdown pin. / / When wl_jobs monitors the tip and shutdown pins with a 50ms / / delay the CPU usage on my Banana Pro is never more than.03%. / ///////////////////////////////////////////////////////////////*/ #include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <wiringPi.h> int main(int argc, char *argv[]) { int optchar; while((optchar = getopt (argc, argv, "ubdps")) != -1) { wiringPiSetup(); switch (optchar){ case 'u': // Power up circuit pinMode(7, OUTPUT); // Power pin = 7 pinMode(0, OUTPUT); // LED pin = 0 pinMode(1, OUTPUT); // Poll pin =1 // Power up circuit board digitalWrite(7, HIGH); // Turn on LED digitalWrite(0, HIGH); // Set Poll pin to Low digitalWrite(1, LOW); break;
Note below that th "-p" option uses a system call to run get_w_data after setting GPIO 0 High so that fresh data will be available on the LeoStick. The command wl_jobs -p is used by the BASH script weather-logger.sh (to be discussed in a subsequent section) to poll data which it will process and format before appending it to the weather-data.csv file.
case 'b': // Blink LED pinMode(0, OUTPUT); // LED pin = 0 int count_blinks = 1; while(count_blinks <= 12){ digitalWrite(0, LOW); delay(75); digitalWrite(0, HIGH); delay (75); count_blinks++; } break; case 'd': // Power down circuit board pinMode(7, OUTPUT); // Power pin = 7 pinMode(0, OUTPUT); // LED pin = O pinMode(1, OUTPUT); // Poll pin = 1 // Power down circuit board digitalWrite(7, LOW); // Turn off LED digitalWrite(0, LOW); //Set Poll pin 1 to LOW digitalWrite(1, LOW); break; case 'p': // Poll pin 1 was set LOW when circuit powered up. // Now set it HIGH so LeoStick polls sensors then // run get_w_data to poll data on the LeoStick then // set pin 1 back to LOW. pinMode(1, OUTPUT); digitalWrite(1, HIGH); system("/usr/local/bin/get_w_data"); digitalWrite(1, LOW); break;
When run with the "-s" option an instance of wl_jobs will run in the background and monitor GPIO pins 2 and 3. GPIO pin 2 is connected to the rain guage. If the rain guage bucket tips a digitalRead on pin 2 will return "1" and a system call will run a short script that increments the number of bucket tips by 1. GPIO pin 3 is connected to a push button switch. If a digitalRead returns "1" on that pin the Banana Pro will shutdown.
On my Banana Pro this program running in the background with a 50 millisecond delay uses 0.3 of the CPU resources and 0.1&% of memory.
case 's': // Either count rain guage bucket tips or // shut down system depending on which pin // goes LOW, i.e. 1. pinMode(2, INPUT); // Tip counter pin = 2 pinMode(3, INPUT); // Shutdown pin = 3 for(;;){ delay(50); int countval = digitalRead(2); int killval = digitalRead(3); if (countval == 1){ delay(100); system("/usr/local/bin/count-tips.sh"); } if (killval == 1){ system("/sbin/shutdown -h now"); } } } // Closes switch } // Closes while loop return 0; }