Below is the arduino code I use for the Pro Mini. I’m going to post it in block quotes as well as a link to a txt file with the code. I feel that it’s commented well so I’m not going to go into details here. It uses the standard Wire, OneWire & AVR/Interrupt libraries as well as some found code for the DS18B20 reading. I’m planning on loading all my code to Github in the future so it’s all in one place. I just have to figure out how to do that appropriately. (Since some of the libraries I use for sensors come from other sources, ie: Adafruit)
#include <Wire.h>
#include <avr/interrupt.h>
#include <OneWire.h>// defining which I2C addres to use
#define SLAVE_ADDRESS 0x05
// setting he number used to request data from pro mini to send back to the pi
int number = 0;//setting up pins for sensors
const byte rainGauge = 2;
const byte windSpeed = 3;// setting up variables for sensors
volatile int rainCount = 0;
volatile int windCount = 0;
volatile int windCountSend = 0;
volatile int windCountSendMax = 0;
long rainDebouncingTime = 300; //Debouncing Time in Milliseconds
volatile unsigned long rainLastMicros;
long windDebouncingTime = 100; //Debouncing Time in Milliseconds
volatile unsigned long windLastMicros;
volatile int windDir = 0;int temp = 0;
// pin for DS18B20
OneWire ds(10); // on pin 10void setup() {
// initialize i2c as slave
Wire.begin(SLAVE_ADDRESS);// define callbacks for i2c communication
Wire.onReceive(receiveData);
Wire.onRequest(sendData);// setup pins for sensors and attach interrupts
pinMode(rainGauge, INPUT);
digitalWrite (rainGauge, HIGH); // internal pull-up resistor
attachInterrupt (0, debounceRain, FALLING); // attach interrupt handler
pinMode(windSpeed, INPUT);
digitalWrite (windSpeed, HIGH); // internal pull-up resistor
attachInterrupt (1, debounceWind, FALLING); // attach interrupt handler
Serial.begin(9600);}
void loop() {
//***********************************
// Read DS18B20
int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;byte i;
byte present = 0;
byte data[12];
byte addr[8];if ( !ds.search(addr)) {
ds.reset_search();
return;
}ds.reset();
ds.select(addr);
ds.write(0x44,1); // start conversion, with parasite power on at the enddelay(1000); // maybe 750ms is enough, maybe not
// we might do a ds.depower() here, but the reset will take care of it.present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpadfor ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();}
LowByte = data[0];
HighByte = data[1];
TReading = (HighByte << 8) + LowByte;
SignBit = TReading & 0x8000; // test most sig bit
if (SignBit) // negative
{
TReading = (TReading ^ 0xffff) + 1; // 2’s comp
}
Tc_100 = (6 * TReading) + TReading / 4; // multiply by (100 * 0.0625) or 6.25temp = Tc_100;
//************************************
// get wind speed
windCount = 0;
delay(10000);
windCountSend = windCount;
if (windCountSend > windCountSendMax){
windCountSendMax = windCountSend;
}}
// callback for received data
void receiveData(int byteCount){while(Wire.available()) {
number = Wire.read();
// setup to reset rain count. R-Pi sends this at midnight to reset
if (number == 8){
rainCount = 0;
}}
}// callback for sending data
void sendData(){
byte sendData[2];
int sendVal = 0;
if (number == 1){
sendVal = rainCount;}
// wind speed
else if (number == 2){
sendVal = windCountSend;}
// wind direction
else if (number == 3){
sendVal = analogRead(1);
}
// wind gust speed
else if (number == 4){
sendVal = windCountSendMax;
windCountSendMax = 0;}
// temperature
else if (number == 5){
sendVal = temp;
}
// humidity
else if (number == 6){
sendVal = analogRead(2);
}else {
sendVal = number;
}
// sending requested data to the Pi
sendData[0] = (byte) sendVal & 0xFF;
// Serial.println(sendData0, HEX);
sendData[1] = (byte) (sendVal >> 8) & 0xFF;
// Serial.println(sendData1, HEX);
Wire.write(sendData, 2);
//Wire.write(sendData0);
//Wire.write(sendData1);
}// debouncing of interrupt sensors so only count once per action
void debounceRain() {
if((long)(micros() – rainLastMicros) >= rainDebouncingTime * 1000) {
rainFunc();
rainLastMicros = micros();
}
}void debounceWind() {
if((long)(micros() – windLastMicros) >= windDebouncingTime * 1000) {
windFunc();
windLastMicros = micros();
}
}// incrementing the variables used for counting sensors
void rainFunc() {
rainCount++;
Serial.print(rainCount);
}void windFunc() {
windCount++;
Serial.println(windCount);
}
No comments