Git initial commit

This commit is contained in:
Lars Hahn 2023-08-19 23:38:38 +02:00
commit c025d15a75
80 changed files with 3953368 additions and 0 deletions

200
Analysis.R Normal file
View File

@ -0,0 +1,200 @@
library(gplots)
setwd("/home/pi/Desktop/SoilAirSensors/data/")
FlankLength = 30
Steps = 30
MinS = -1
MaxS = 1
CorCols = colorRampPalette(c('blue','grey','green'))(n=Steps)
CorBreaks = seq(from=MinS,to=MaxS,length.out=(Steps+1))
Date = paste(format(Sys.Date()-1,c("%Y","%-m","%-d")),collapse="-")
Data = read.table(paste("filter/soilair_",Date,".dat",sep=""),head=T)
pdf(file=paste("pdf/soilair_",Date,".pdf",sep=""))
MeanData = data.frame(
DailySecond = Data$DailySecond,
GPIO_C = rep(NA,nrow(Data)),
GPIO_PY = rep(NA,nrow(Data)),
Humidity = rep(NA,nrow(Data)),
Temperature = rep(NA,nrow(Data)),
Pressure = rep(NA,nrow(Data))
)
MedData = data.frame(
DailySecond = Data$DailySecond,
GPIO_C = rep(NA,nrow(Data)),
GPIO_PY = rep(NA,nrow(Data)),
Humidity = rep(NA,nrow(Data)),
Temperature = rep(NA,nrow(Data)),
Pressure = rep(NA,nrow(Data))
)
for(idx in seq(FlankLength,(nrow(Data)-FlankLength),FlankLength)){
MeanData$GPIO_C[idx] = mean(Data$GPIO_C[ (idx-FlankLength+1) : (idx+FlankLength)])
MeanData$GPIO_PY[idx] = mean(Data$GPIO_PY[ (idx-FlankLength+1) : (idx+FlankLength)])
MeanData$Humidity[idx] = mean(Data$Humidity[ (idx-FlankLength+1) : (idx+FlankLength)])
MeanData$Temperature[idx] = mean(Data$Temperature[ (idx-FlankLength+1) : (idx+FlankLength)])
MeanData$Pressure[idx] = mean(Data$Pressure[ (idx-FlankLength+1) : (idx+FlankLength)])
MedData$GPIO_C[idx] = median(Data$GPIO_C[ (idx-FlankLength+1) : (idx+FlankLength)])
MedData$GPIO_PY[idx] = median(Data$GPIO_PY[ (idx-FlankLength+1) : (idx+FlankLength)])
MedData$Humidity[idx] = median(Data$Humidity[ (idx-FlankLength+1) : (idx+FlankLength)])
MedData$Temperature[idx] = median(Data$Temperature[ (idx-FlankLength+1) : (idx+FlankLength)])
MedData$Pressure[idx] = median(Data$Pressure[ (idx-FlankLength+1) : (idx+FlankLength)])
}
MeanData = na.omit(MeanData)
rownames(MeanData) = 1:nrow(MeanData)
MedData = na.omit(MedData)
rownames(MedData) = 1:nrow(MedData)
write.table(MeanData,file=paste("filter/soilair-mean_",Date,".dat",sep=""),col.names = T,row.names = F)
write.table(MedData,file=paste("filter/soilair-median_",Date,".dat",sep=""),col.names = T,row.names = F)
heatmap.2(
main="Pearson Correlation - Original",
cor(Data,method="pearson"),
Colv=F,
Rowv=F,
dendrogram="none",
breaks=CorBreaks,
col=CorCols
)
heatmap.2(
main=paste("Pearson Correlation - Mean of",FlankLength,"+1"),
cor(MeanData,method="pearson"),
Colv=F,
Rowv=F,
dendrogram="none",
breaks=CorBreaks,
col=CorCols
)
heatmap.2(
main=paste("Pearson Correlation - Median of",FlankLength,"+1"),
cor(MeanData,method="pearson"),
Colv=F,
Rowv=F,
dendrogram="none",
breaks=CorBreaks,
col=CorCols
)
###### PLOT DAILY SECOND; VIEW DATA ######
plot(GPIO_C~DailySecond,Data,main=paste("GPIO_C",Date),xlab="Daily Second [s]",ylab="Frequency [Hz]",pch=19,cex=0.2)
points(GPIO_C~DailySecond,MeanData,col="red",pch=19,cex=0.2)
points(GPIO_C~DailySecond,MedData,col="green",pch=19,cex=0.2)
abline(h=mean(Data$GPIO_C),col="red")
abline(h=median(Data$GPIO_C),col="green")
plot(GPIO_PY~DailySecond,Data,main=paste("GPIO_PY",Date),xlab="Daily Second [s]",ylab="Frequency [Hz]",pch=19,cex=0.2)
points(GPIO_PY~DailySecond,MeanData,col="red",pch=19,cex=0.2)
points(GPIO_PY~DailySecond,MedData,col="green",pch=19,cex=0.2)
abline(h=mean(Data$GPIO_PY),col="red")
abline(h=median(Data$GPIO_PY),col="green")
plot(Humidity~DailySecond,Data,pch=19,cex=0.2,main=Date)
points(Humidity~DailySecond,MeanData,pch=19,cex=0.2,col="red")
points(Humidity~DailySecond,MedData,pch=19,cex=0.2,col="green")
plot(Temperature~DailySecond,Data,pch=19,cex=0.2,main=Date)
points(Temperature~DailySecond,MeanData,pch=19,cex=0.2,col="red")
points(Temperature~DailySecond,MedData,pch=19,cex=0.2,col="green")
plot(Pressure~DailySecond,Data,pch=19,cex=0.2,main=Date)
points(Pressure~DailySecond,MeanData,pch=19,cex=0.2,col="red")
points(Pressure~DailySecond,MedData,pch=19,cex=0.2,col="green")
###### PLOT ENVIRONMENT AGAINST ENVIRONMENT; VIEW DATA ######
plot(Humidity~Temperature,Data,pch=19,cex=0.2,main=Date)
points(Humidity~Temperature,MeanData,pch=19,cex=0.2,col="red")
points(Humidity~Temperature,MedData,pch=19,cex=0.2,col="green")
plot(Temperature~Humidity,Data,pch=19,cex=0.2,main=Date)
points(Temperature~Humidity,MeanData,pch=19,cex=0.2,col="red")
points(Temperature~Humidity,MedData,pch=19,cex=0.2,col="green")
plot(Humidity~Pressure,Data,pch=19,cex=0.2,main=Date)
points(Humidity~Pressure,MeanData,pch=19,cex=0.2,col="red")
points(Humidity~Pressure,MedData,pch=19,cex=0.2,col="green")
plot(Pressure~Humidity,Data,pch=19,cex=0.2,main=Date)
points(Pressure~Humidity,MeanData,pch=19,cex=0.2,col="red")
points(Pressure~Humidity,MedData,pch=19,cex=0.2,col="green")
plot(Pressure~Temperature,Data,pch=19,cex=0.2,main=Date)
points(Pressure~Temperature,MeanData,pch=19,cex=0.2,col="red")
points(Pressure~Temperature,MedData,pch=19,cex=0.2,col="green")
plot(Temperature~Pressure,Data,pch=19,cex=0.2,main=Date)
points(Temperature~Pressure,MeanData,pch=19,cex=0.2,col="red")
points(Temperature~Pressure,MedData,pch=19,cex=0.2,col="green")
###### PLOT GPIO AGAINST ENVIRONMENT; VIEW DATA ######
plot(GPIO_C~Humidity,Data,pch=19,cex=0.2,main=Date)
points(GPIO_C~Humidity,MeanData,pch=19,cex=0.2,col="red")
points(GPIO_C~Humidity,MedData,pch=19,cex=0.2,col="green")
plot(GPIO_PY~Humidity,Data,pch=19,cex=0.2,main=Date)
points(GPIO_PY~Humidity,MeanData,pch=19,cex=0.2,col="red")
points(GPIO_PY~Humidity,MedData,pch=19,cex=0.2,col="green")
plot(GPIO_C~Temperature,Data,pch=19,cex=0.2,main=Date)
points(GPIO_C~Temperature,MeanData,pch=19,cex=0.2,col="red")
points(GPIO_C~Temperature,MedData,pch=19,cex=0.2,col="green")
plot(GPIO_PY~Temperature,Data,pch=19,cex=0.2,main=Date)
points(GPIO_PY~Temperature,MeanData,pch=19,cex=0.2,col="red")
points(GPIO_PY~Temperature,MedData,pch=19,cex=0.2,col="green")
plot(GPIO_C~Pressure,Data,pch=19,cex=0.2,main=Date)
points(GPIO_C~Pressure,MeanData,pch=19,cex=0.2,col="red")
points(GPIO_C~Pressure,MedData,pch=19,cex=0.2,col="green")
plot(GPIO_PY~Pressure,Data,pch=19,cex=0.2,main=Date)
points(GPIO_PY~Pressure,MeanData,pch=19,cex=0.2,col="red")
points(GPIO_PY~Pressure,MedData,pch=19,cex=0.2,col="green")
###### PLOT GPIO AGAINST GPIO; VIEW DATA ######
plot(GPIO_PY~GPIO_C,Data,pch=19,cex=0.2,main=Date)
plot(GPIO_PY~GPIO_C,MedData,pch=19,cex=0.2,main=paste("Median",Date))
abline(lm(GPIO_PY~GPIO_C,MedData),col="red")
###### Missing Data Analysis ######
MissingTimePoint = c()
for(i in 2:nrow(Data)){
if(Data$DailySecond[i] - Data$DailySecond[i-1] != 1){
MissingTimePoint[length(MissingTimePoint)+1] = i
}
}
plot(1:length(MissingTimePoint),MissingTimePoint,pch=19,cex=0.2)
MaxDiff = 0
for( i in 2:length(MissingTimePoint)){
MaxDiff = max(MaxDiff, MissingTimePoint[i] - MissingTimePoint[i-1] )
}
MisDist = rep(0,length(MissingTimePoint)-1)
for( i in 2:length(MissingTimePoint)){
MisDist[i-1] = MissingTimePoint[i] - MissingTimePoint[i-1]
}
hist(MisDist)
plot(1:length(MisDist),MisDist,type="b",pch=19,cex=0.2)
dev.off()

15
SoilAirMerge.R Normal file
View File

@ -0,0 +1,15 @@
setwd("/home/pi/Desktop/SoilAirSensors/data/")
Date = format(Sys.Date()-1,c("%Y","%-m","%-d"))
DataA = read.table(paste("raw/airdata_",Date[1],"-",Date[2],"-",Date[3],".dat",sep=""),head=T)
DataSC = read.table(paste("raw/soildata-c_",Date[1],"-",Date[2],"-",Date[3],".dat",sep=""),head=T)
colnames(DataSC)[2] = "GPIO_C"
DataSP = read.table(paste("raw/soildata-py_",Date[1],"-",Date[2],"-",Date[3],".dat",sep=""),head=T)
colnames(DataSP)[2] = "GPIO_PY"
Data = merge(DataSP,DataSC,by="DailySecond")
Data = merge(Data,DataA,by="DailySecond")
write.table(Data,file=paste("merge/soilairdata_",Date[1],"-",Date[2],"-",Date[3],".dat",sep=""),col.names = T,row.names = F,sep=" ")
SubData = subset(Data,select=c("DailySecond","GPIO_PY","GPIO_C","Humidity","Temperature","Pressure"))
write.table(SubData,file=paste("filter/soilair_",Date[1],"-",Date[2],"-",Date[3],".dat",sep=""),col.names = T,row.names = F,sep=" ")

59
airsensor.py Normal file
View File

@ -0,0 +1,59 @@
#!/usr/bin/python3
import time
import argparse
import board
import busio
import adafruit_bme280
def get_i2c_data(bme):
return "{:.2f}\t{:.1f}\t{:.2f}\t{:.1f}\t{:.2f}".format(bme.humidity,bme.temperature,bme.pressure,bme.altitude,bme.sea_level_pressure)
def dayseconds():
Now = time.localtime()
return Now.tm_hour*60*60 + Now.tm_min*60 + Now.tm_sec
def file_name(Prefix=""):
Start = time.localtime()
return Prefix+"airdata_{}-{}-{}.dat".format(Start.tm_year,Start.tm_mon,Start.tm_mday)
Parser = argparse.ArgumentParser(description="DataCollection of the bme280 Sensor from adafruit. Tmeperature, Humidity, Pressure and more is shown and stored at the same time")
Parser.add_argument("--prefix",metavar="PATH",help="Prefix for the OUPUT-FILE; usually a certain folder",type=str,required=False)
Args = Parser.parse_args()
i2c = busio.I2C(board.SCL, board.SDA)
bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c)
bme280.sea_level_pressure = 1029
Head = "DailySecond\tHumidity\tTemperature\tPressure\tAltitude\tSeaLevelPressure"
Units = "#[s]\t[%]\t[°C]\t[hPa]\t[m]"
Prefix = ""
Time = 0
TimeLast = 0
if Args.prefix:
Prefix = Args.prefix
if Prefix[-1] != "/":
Prefix += "/"
File = open(file_name(Prefix),"w",buffering=1)
File.write("#Starting on {}\n".format(time.ctime()))
File.write(Head+"\n")
File.write(Units+"\n")
print("#Starting on {}".format(time.ctime()))
print(Head)
print(Units)
Time = dayseconds()
while TimeLast <= Time:
Data = repr(Time) + "\t" + get_i2c_data(bme280)
File.write("{}\n".format(Data))
print(Data)
#print and write everything; AFTERWARDS reset; sothat nothing interrupts the tally function call at loop start
time.sleep(0.7)
TimeLast = Time
Time = dayseconds()
print("END")

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

85954
data/raw/airdata_2019-1-1.dat Normal file

File diff suppressed because it is too large Load Diff

85943
data/raw/airdata_2019-1-2.dat Normal file

File diff suppressed because it is too large Load Diff

85955
data/raw/airdata_2019-1-3.dat Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

1
smb.dat Normal file
View File

@ -0,0 +1 @@
smbclient //rasppinas.local/public -U " "%" "

281
soilsensor.c Normal file
View File

@ -0,0 +1,281 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <unistd.h>
#include <time.h>
#include <pigpio.h>
/*
2014-08-20
gcc -o freq_count_1 freq_count_1.c -lpigpio -lpthread
$ sudo ./freq_count_1 4 7 8
This program uses the gpioSetAlertFunc function to request
a callback (the same one) for each gpio to be monitored.
EXAMPLES
Monitor gpio 4 (default settings)
sudo ./freq_count_1 4
Monitor gpios 4 and 8 (default settings)
sudo ./freq_count_1 4 8
Monitor gpios 4 and 8, sample rate 2 microseconds
sudo ./freq_count_1 4 8 -s2
Monitor gpios 7 and 8, sample rate 4 microseconds, report every second
sudo ./freq_count_1 7 8 -s4 -r10
Monitor gpios 4,7, 8, 9, 10, 23 24, report five times a second
sudo ./freq_count_1 4 7 8 9 10 23 24 -r2
Monitor gpios 4, 7, 8, and 9, report once a second, sample rate 1us,
generate 2us edges (4us square wave, 250000 highs per second).
sudo ./freq_count_1 4 7 8 9 -r 10 -s 1 -p 2
*/
#define MAX_GPIOS 32
#define OPT_P_MIN 1
#define OPT_P_MAX 1000
#define OPT_P_DEF 20
#define OPT_R_MIN 1
#define OPT_R_MAX 10
#define OPT_R_DEF 10
#define OPT_S_MIN 1
#define OPT_S_MAX 10
#define OPT_S_DEF 5
static char * Prefix = ".";
static volatile int g_pulse_count[MAX_GPIOS];
static volatile int g_reset_counts;
static uint32_t g_mask;
static int g_num_gpios;
static int g_gpio[MAX_GPIOS];
static int g_opt_p = OPT_P_DEF;
static int g_opt_r = OPT_R_DEF;
static int g_opt_s = OPT_S_DEF;
static int g_opt_t = 0;
void usage()
{
fprintf
(stderr,
"\n" \
"Usage: sudo ./freq_count_1 gpio ... [OPTION] ...\n" \
" -p value, sets pulses every p micros, %d-%d, TESTING only\n" \
" -r value, sets refresh period in deciseconds, %d-%d, default %d\n" \
" -s value, sets sampling rate in micros, %d-%d, default %d\n" \
" -f path, sets the prefix for output data" \
"\nEXAMPLE\n" \
"sudo ./freq_count_1 4 7 -r2 -s2\n" \
"Monitor gpios 4 and 7. Refresh every 0.2 seconds. Sample rate 2 micros.\n" \
"\n",
OPT_P_MIN, OPT_P_MAX,
OPT_R_MIN, OPT_R_MAX, OPT_R_DEF,
OPT_S_MIN, OPT_S_MAX, OPT_S_DEF
);
}
void fatal(int show_usage, char *fmt, ...)
{
char buf[128];
va_list ap;
va_start(ap, fmt);
vsnprintf(buf, sizeof(buf), fmt, ap);
va_end(ap);
fprintf(stderr, "%s\n", buf);
if (show_usage) usage();
fflush(stderr);
exit(EXIT_FAILURE);
}
static int initOpts(int argc, char *argv[])
{
int i, opt;
while ((opt = getopt(argc, argv, "p:r:s:f:")) != -1)
{
i = -1;
switch (opt)
{
case 'p':
i = atoi(optarg);
if ((i >= OPT_P_MIN) && (i <= OPT_P_MAX))
g_opt_p = i;
else fatal(1, "invalid -p option (%d)", i);
g_opt_t = 1;
break;
case 'r':
i = atoi(optarg);
if ((i >= OPT_R_MIN) && (i <= OPT_R_MAX))
g_opt_r = i;
else fatal(1, "invalid -r option (%d)", i);
break;
case 's':
i = atoi(optarg);
if ((i >= OPT_S_MIN) && (i <= OPT_S_MAX))
g_opt_s = i;
else fatal(1, "invalid -s option (%d)", i);
break;
case 'f':
Prefix = optarg;
break;
default: /* '?' */
usage();
exit(-1);
}
}
return optind;
}
void edges(int gpio, int level, uint32_t tick)
{
int g;
if (g_reset_counts)
{
g_reset_counts = 0;
for (g=0; g<MAX_GPIOS; g++) g_pulse_count[g] = 0;
}
/* only record low to high edges */
if (level == 1) g_pulse_count[gpio]++;
}
int main(int argc, char *argv[])
{
int i, rest, g, wave_id, mode,Time,TimeLast;
gpioPulse_t pulse[2];
int count[MAX_GPIOS];
char buf[0x100];
time_t now;
struct tm *tm;
/* command line parameters */
rest = initOpts(argc, argv);
/*File Write*/
now = time(0);
tm = localtime(&now);
snprintf(buf, sizeof(buf), "%s/soildata-c_%d-%d-%d.dat",Prefix,tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday);
FILE *f = fopen(buf, "w");
if (f == NULL)
{
printf("Error opening file!\n");
exit(1);
}
printf("%s\n",buf);
/* get the gpios to monitor */
g_num_gpios = 0;
for (i=rest; i<argc; i++)
{
g = atoi(argv[i]);
if ((g>=0) && (g<32))
{
g_gpio[g_num_gpios++] = g;
g_mask |= (1<<g);
}
else fatal(1, "%d is not a valid g_gpio number\n", g);
}
if (!g_num_gpios) fatal(1, "At least one gpio must be specified");
printf("#Monitoring gpios");
for (i=0; i<g_num_gpios; i++) printf(" %d", g_gpio[i]);
printf("\n#Sample rate %d micros, refresh rate %d deciseconds\n",
g_opt_s, g_opt_r);
gpioCfgClock(g_opt_s, 1, 1);
if (gpioInitialise()<0) return 1;
gpioWaveClear();
pulse[0].gpioOn = g_mask;
pulse[0].gpioOff = 0;
pulse[0].usDelay = g_opt_p;
pulse[1].gpioOn = 0;
pulse[1].gpioOff = g_mask;
pulse[1].usDelay = g_opt_p;
gpioWaveAddGeneric(2, pulse);
wave_id = gpioWaveCreate();
/* monitor g_gpio level changes */
for (i=0; i<g_num_gpios; i++) gpioSetAlertFunc(g_gpio[i], edges);
mode = PI_INPUT;
if (g_opt_t)
{
gpioWaveTxSend(wave_id, PI_WAVE_MODE_REPEAT);
mode = PI_OUTPUT;
}
for (i=0; i<g_num_gpios; i++) gpioSetMode(g_gpio[i], mode);
printf("DailySecond\tGPIO_%d",g_gpio[0]);
fprintf(f,"DailySecond\tGPIO_%d",g_gpio[0]);
for (i=1; i<g_num_gpios; i++)
{
printf("\tGPIO_%d",g_gpio[i]);
fprintf(f,"\tGPIO_%d",g_gpio[i]);
}
fprintf(f,"\n");
printf("\n");
gpioDelay(g_opt_r * 100000);
now = time(0);
tm = localtime(&now);
TimeLast = 0;
Time = tm->tm_hour*60*60 + tm->tm_min*60 + tm->tm_sec;
while (TimeLast <= Time)
{
for (i=0; i<g_num_gpios; i++) count[i] = g_pulse_count[g_gpio[i]];
printf("%d\t%d",Time,count[0]);
fprintf(f,"%d\t%d",Time,count[0]);
for (i=1; i<g_num_gpios; i++)
{
printf("\t%d",count[i]);
fprintf(f,"\t%d",count[i]);
}
printf("\n");
fprintf(f,"\n");
g_reset_counts = 1;
gpioDelay(g_opt_r * 100000);
TimeLast = Time;
now = time(0);
tm = localtime(&now);
Time = tm->tm_hour*60*60 + tm->tm_min*60 + tm->tm_sec;
}
fclose(f);
gpioTerminate();
}

82
soilsensor.py Normal file
View File

@ -0,0 +1,82 @@
#!/usr/bin/python3
import argparse
import time
import pigpio
def dayseconds():
Now = time.localtime()
return Now.tm_hour*60*60 + Now.tm_min*60 + Now.tm_sec
def file_name(Prefix=""):
Start = time.localtime()
print(Prefix)
return Prefix+"soildata-py_{}-{}-{}.dat".format(Start.tm_year,Start.tm_mon,Start.tm_mday)
Parser = argparse.ArgumentParser(description="DataCollection of the bme280 Sensor from adafruit. Tmeperature, Humidity, Pressure and more is shown and stored at the same time.")
Parser.add_argument("--prefix",metavar="PATH",help="Prefix for the OUPUT-FILE; usually a certain folder.",type=str,required=False)
Parser.add_argument("-p",metavar="N",help="Set Pulse to N µs, default p = 20µs.", default=[20], type=int,nargs=1,required=False)
Parser.add_argument("-s",metavar="N",help="Set sample rate to N deciseconds [10^-1 s]; default s = 10.",default=[10],type=int,nargs=1,required=False)
Parser.add_argument("-g",metavar="N",help="Listen to GPIO-Pin(s) N, where soil humidity sensors are connected.",nargs="+",type=int,required=True)
Args = Parser.parse_args()
Sensors = Args.g #Read from GPIO XX
Head = "DailySecond\t"+"\t".join("GPIO_"+str(Gpio) for Gpio in Sensors)
Units = "#[s]\t"+"\t".join("[Hz]" for Gpio in Sensors)
Prefix = ""
PulseMS = 10
PulseDelay = 20
PinMask = 0
Time = 0
TimeLast = 0
if Args.prefix:
Prefix = Args.prefix
if Prefix[-1] != "/":
Prefix += "/"
if Args.p:
PulseDelay = Args.p[0]
if Args.s:
PulseMS = Args.s[0]
for Pin in Sensors:
PinMask |= 1<<Pin
PI = pigpio.pi()
PI.wave_clear()
for Gpio in Sensors:
PI.set_mode(Gpio,pigpio.INPUT)
PulseGpio = [pigpio.pulse(PinMask,0,PulseDelay),pigpio.pulse(0,PinMask,PulseDelay)]
PI.wave_add_generic(PulseGpio)
WaveID = PI.wave_create()
#next function can have 3 parameter; third is user-defined callback function; if not defined, just count edges: CallBacks[X].tally() or .reset_tally()
CallBacks = [PI.callback(Gpio, pigpio.RISING_EDGE) for Gpio in Sensors]
File = open(file_name(Prefix),"w",buffering=1)
File.write("#Starting on {}\n".format(time.ctime()))
File.write(Head+"\n")
File.write(Units+"\n")
print("#Starting on {}".format(time.ctime()))
print(Head)
print(Units)
for Call in CallBacks:
Call.reset_tally()
time.sleep(0.1*PulseMS)
Time = dayseconds()
while TimeLast <= Time:
Time = dayseconds()
Data = repr(Time) + "\t" + "\t".join(str(Call.tally()) for Call in CallBacks)
File.write("{}\n".format(Data))
print(Data)
#print and write everything; AFTERWARDS reset; sothat nothing interrupts the tally function call at loop start
for Call in CallBacks:
Call.reset_tally()
time.sleep(0.1*PulseMS)
TimeLast = Time
Time = dayseconds()
PI.wave_delete(WaveID)
PI.stop()
i2c.deinit()
File.close()
print("END")

11
submit.bash Normal file
View File

@ -0,0 +1,11 @@
#!/bin/bash
PRFX="/home/pi/Desktop/SoilAirSensors/data/raw/"
DATE=`date '+%Y-%-m-%-d' -d "yesterday"`
AIR_FILE=$PRFX"airdata_"$DATE".dat"
SOIL_FILE=$PRFX"soildata-py_"$DATE".dat"
PSWD=""
echo "sending "$AIR_FILE
sshpass -p '$PSWD' scp $AIR_FILE raspberrypi3bp:$PRFX
echo "sending "$SOIL_FILE
sshpass -p '$PSWD' scp $SOIL_FILE raspberrypi3bp:$PRFX