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;
}