Created
February 27, 2016 23:23
-
-
Save dwblair/e000b76bc360d3f395e9 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <OneWire.h> | |
#include <DallasTemperature.h> | |
// Data wire is plugged into port 2 on the Arduino | |
#define ONE_WIRE_BUS 6 | |
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) | |
OneWire oneWire(ONE_WIRE_BUS); | |
// Pass our oneWire reference to Dallas Temperature. | |
DallasTemperature sensors(&oneWire); | |
// arrays to hold device address | |
DeviceAddress insideThermometer; | |
#include <SPI.h> | |
#include <RH_RF95.h> | |
//#define FREQUENCY 434 | |
#define FREQUENCY 915 | |
// Singleton instance of the radio driver | |
#ifdef __AVR_ATmega1284P__ | |
#define LED 15 // Moteino MEGAs have LEDs on D15 | |
#define FLASH_SS 23 // and FLASH SS on D23 | |
#else | |
#define LED 9 // Moteinos have LEDs on D9 | |
#define FLASH_SS 8 // and FLASH SS on D8 | |
#endif | |
RH_RF95 rf95; | |
void setup(void) | |
{ | |
pinMode(LED, OUTPUT); | |
if (!rf95.init()) | |
Serial.println("init failed"); | |
else { Serial.print("init OK - "); Serial.print(FREQUENCY); Serial.print("mhz"); } | |
// Defaults after init are 434.0MHz, 13dBm, Bw = 125 kHz, Cr = 4/5, Sf = 128chips/symbol, CRC on | |
rf95.setFrequency(FREQUENCY); | |
rf95.setTxPower(23); //high power -- originally 13, range= 5 to 23 | |
// temp measurement | |
// start serial port | |
Serial.begin(9600); | |
Serial.println("Dallas Temperature IC Control Library Demo"); | |
// locate devices on the bus | |
Serial.print("Locating devices..."); | |
sensors.begin(); | |
Serial.print("Found "); | |
Serial.print(sensors.getDeviceCount(), DEC); | |
Serial.println(" devices."); | |
// report parasite power requirements | |
Serial.print("Parasite power is: "); | |
if (sensors.isParasitePowerMode()) Serial.println("ON"); | |
else Serial.println("OFF"); | |
// assign address manually. the addresses below will beed to be changed | |
// to valid device addresses on your bus. device address can be retrieved | |
// by using either oneWire.search(deviceAddress) or individually via | |
// sensors.getAddress(deviceAddress, index) | |
//insideThermometer = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 }; | |
// Method 1: | |
// search for devices on the bus and assign based on an index. ideally, | |
// you would do this to initially discover addresses on the bus and then | |
// use those addresses and manually assign them (see above) once you know | |
// the devices on your bus (and assuming they don't change). | |
if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0"); | |
// method 2: search() | |
// search() looks for the next device. Returns 1 if a new address has been | |
// returned. A zero might mean that the bus is shorted, there are no devices, | |
// or you have already retrieved all of them. It might be a good idea to | |
// check the CRC to make sure you didn't get garbage. The order is | |
// deterministic. You will always get the same devices in the same order | |
// | |
// Must be called before search() | |
//oneWire.reset_search(); | |
// assigns the first address found to insideThermometer | |
//if (!oneWire.search(insideThermometer)) Serial.println("Unable to find address for insideThermometer"); | |
// show the addresses we found on the bus | |
Serial.print("Device 0 Address: "); | |
printAddress(insideThermometer); | |
Serial.println(); | |
// set the resolution to 9 bit (Each Dallas/Maxim device is capable of several different resolutions) | |
sensors.setResolution(insideThermometer, 9); | |
Serial.print("Device 0 Resolution: "); | |
Serial.print(sensors.getResolution(insideThermometer), DEC); | |
Serial.println(); | |
} | |
// function to print the temperature for a device | |
float printTemperature(DeviceAddress deviceAddress) | |
{ | |
// method 1 - slower | |
//Serial.print("Temp C: "); | |
//Serial.print(sensors.getTempC(deviceAddress)); | |
//Serial.print(" Temp F: "); | |
//Serial.print(sensors.getTempF(deviceAddress)); // Makes a second call to getTempC and then converts to Fahrenheit | |
// method 2 - faster | |
float tempC = sensors.getTempC(deviceAddress); | |
Serial.print("Temp C: "); | |
Serial.print(tempC); | |
Serial.print(" Temp F: "); | |
Serial.println(DallasTemperature::toFahrenheit(tempC)); // Converts tempC to Fahrenheit | |
return tempC; | |
} | |
void loop(void) | |
{ | |
// call sensors.requestTemperatures() to issue a global temperature | |
// request to all devices on the bus | |
Serial.print("Requesting temperatures..."); | |
sensors.requestTemperatures(); // Send the command to get temperatures | |
Serial.println("DONE"); | |
// It responds almost immediately. Let's print out the data | |
float t = printTemperature(insideThermometer); // Use a simple function to print out the data | |
char charVal[] = "3"; | |
dtostrf(t, 4, 4, charVal); //4 is mininum width, 4 is precision; float value is copied onto buff | |
Serial.print("charVal="); | |
Serial.println(charVal); | |
Serial.print("dwb temp is:"); | |
Serial.println(t); | |
if (rf95.available()) | |
{ | |
// Should be a message for us now | |
uint8_t buf[RH_RF95_MAX_MESSAGE_LEN]; | |
uint8_t len = sizeof(buf); | |
if (rf95.recv(buf, &len)) | |
{ | |
digitalWrite(LED, HIGH); | |
// RH_RF95::printBuffer("request: ", buf, len); | |
Serial.print("got request: "); | |
Serial.println((char*)buf); | |
Serial.print("RSSI: "); | |
Serial.println(rf95.lastRssi(), DEC); | |
// Send a reply | |
uint8_t data[] = "And hello back to you"; | |
//uint8_t data[] = charVal; | |
rf95.send(charVal, sizeof(charVal)); | |
rf95.waitPacketSent(); | |
Serial.println("Sent a reply"); | |
digitalWrite(LED, LOW); | |
} | |
else | |
{ | |
Serial.println("recv failed"); | |
} | |
} | |
delay(1000); | |
} | |
// function to print a device address | |
void printAddress(DeviceAddress deviceAddress) | |
{ | |
for (uint8_t i = 0; i < 8; i++) | |
{ | |
if (deviceAddress[i] < 16) Serial.print("0"); | |
Serial.print(deviceAddress[i], HEX); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment