With AC/DC Power
This commit is contained in:
parent
941a44cd82
commit
ab960ec8c9
|
|
@ -1,5 +1,5 @@
|
||||||
[platformio]
|
[platformio]
|
||||||
default_envs = tiny85
|
default_envs = nanoatmega328
|
||||||
|
|
||||||
[env:nanoatmega328]
|
[env:nanoatmega328]
|
||||||
platform = atmelavr
|
platform = atmelavr
|
||||||
|
|
@ -7,32 +7,10 @@ board = nanoatmega328
|
||||||
framework = arduino
|
framework = arduino
|
||||||
board_build.f_cpu = 16000000L
|
board_build.f_cpu = 16000000L
|
||||||
lib_deps =
|
lib_deps =
|
||||||
milesburton/DallasTemperature
|
#robtillaart/DHTStable
|
||||||
|
robtillaart/DHTNew
|
||||||
|
#https://github.com/adafruit/RadioHead
|
||||||
targets = upload, monitor
|
targets = upload, monitor
|
||||||
upload_port = /dev/ttyUSB0
|
upload_port = /dev/ttyUSB0
|
||||||
momitor_speed = 9600
|
momitor_speed = 9600
|
||||||
monitor_port = /dev/ttyUSB1
|
monitor_port = /dev/ttyUSB0
|
||||||
|
|
||||||
[env:tiny85]
|
|
||||||
platform = atmelavr
|
|
||||||
framework = arduino
|
|
||||||
#board = digispark-tiny
|
|
||||||
board = attiny85
|
|
||||||
board_build.f_cpu = 4000000L
|
|
||||||
build_flags =
|
|
||||||
-DRH_ASK_ATTINY_USE_TIMER1
|
|
||||||
-DRH_ASK_TX_ONLY
|
|
||||||
lib_deps =
|
|
||||||
milesburton/DallasTemperature
|
|
||||||
https://github.com/vlastahajek/RH_ASKTiny
|
|
||||||
upload_protocol = stk500v1
|
|
||||||
upload_flags =
|
|
||||||
-P$UPLOAD_PORT
|
|
||||||
-b$UPLOAD_SPEED
|
|
||||||
-V
|
|
||||||
targets = upload, monitor
|
|
||||||
#targets = upload
|
|
||||||
upload_speed = 19200
|
|
||||||
upload_port = /dev/ttyUSB0
|
|
||||||
momitor_speed = 9600
|
|
||||||
monitor_port = /dev/ttyACM0
|
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
#define LOGGER 1
|
#define LOGGER 0
|
||||||
#define SEND_DELAY 120
|
#define SEND_DELAY 180
|
||||||
#define SEND_DELAY_BATTERY 3600
|
#define SEND_DELAY_BATTERY 3600
|
||||||
|
|
|
||||||
266
src/main.ino
266
src/main.ino
|
|
@ -1,56 +1,25 @@
|
||||||
#include <avr/sleep.h>
|
|
||||||
#include <avr/wdt.h>
|
|
||||||
|
|
||||||
#include <RH_ASK.h>
|
#include <RH_ASK.h>
|
||||||
|
//#include <DHTStable.h>
|
||||||
|
#include <dhtnew.h>
|
||||||
|
|
||||||
#include <OneWire.h>
|
#define SENSORID 102
|
||||||
#include <DallasTemperature.h>
|
#define PIN_SEND 15
|
||||||
|
#define PIN_RECEIVE 2
|
||||||
|
#define PIN_DHT 14
|
||||||
|
|
||||||
//#include <math.h>
|
#define DELAYSEND 60000UL
|
||||||
|
|
||||||
#if defined(ARDUINO_AVR_NANO)
|
#define Log(l) Serial.print(l)
|
||||||
#include "pins-nano.h"
|
#define LogLn(l) Serial.println(l)
|
||||||
#elif defined(ARDUINO_AVR_ATTINYX5)
|
|
||||||
#include "pins-attiny85.h"
|
|
||||||
#else
|
|
||||||
#error "Pins undef for this core"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "config.h"
|
RH_ASK driver(2000, PIN_RECEIVE, PIN_SEND, 12, false);
|
||||||
|
//DHTStable DHT;
|
||||||
|
DHTNEW DHT(PIN_DHT);
|
||||||
|
|
||||||
#if LOGGER
|
//uint8_t rh_payload[4];
|
||||||
#warning "Logger"
|
uint8_t rh_payload[5];
|
||||||
#define Log(l) Serial.print(l)
|
|
||||||
#define LogLn(l) Serial.println(l)
|
|
||||||
#else
|
|
||||||
#warning "No Logger"
|
|
||||||
#define Log(l)
|
|
||||||
#define LogLn(l)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
uint16_t lastsendrh = 0;
|
||||||
OneWire oneWire(PIN_DS18B20);
|
|
||||||
DallasTemperature ds18b20(&oneWire);
|
|
||||||
|
|
||||||
#if !defined(ARDUINO_AVR_ATTINYX5) || (defined(ARDUINO_AVR_ATTINYX5) && !LOGGER)
|
|
||||||
//RH_ASK driver(2000, -1, PIN_SEND, -1, false);
|
|
||||||
RH_ASK driver(2000, -1, PIN_SEND, -1, false, 8);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
uint8_t rh_payload[6];
|
|
||||||
|
|
||||||
unsigned long myTime;
|
|
||||||
|
|
||||||
uint8_t sleeprepeat;
|
|
||||||
uint8_t sleeprepeatbat;
|
|
||||||
uint8_t sleepcount;
|
|
||||||
|
|
||||||
bool temp_enabled = false;
|
|
||||||
|
|
||||||
ISR(WDT_vect) {
|
|
||||||
// Nothing needs to be done, however interrupt handler must be defined to
|
|
||||||
// prevent a reset.
|
|
||||||
}
|
|
||||||
|
|
||||||
void setSensorType(uint8_t stype)
|
void setSensorType(uint8_t stype)
|
||||||
{
|
{
|
||||||
|
|
@ -60,160 +29,97 @@ void setSensorType(uint8_t stype)
|
||||||
rh_payload[0] += payload0;
|
rh_payload[0] += payload0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setBatteryStatus(uint8_t bstatus)
|
bool setTH()
|
||||||
{
|
{
|
||||||
if(bstatus == 1) {
|
int errno;
|
||||||
rh_payload[0] |= 0b00000001;
|
//if(DHT.read22(PIN_DHT) == DHTLIB_OK)
|
||||||
|
errno = DHT.read();
|
||||||
|
rh_payload[1] = (uint8_t) (errno*-1);
|
||||||
|
if(errno == 0) {
|
||||||
|
int16_t tempC = (int16_t) roundf(DHT.getTemperature()*100);
|
||||||
|
uint8_t humidity = (uint8_t) roundf(DHT.getHumidity());
|
||||||
|
Log("Send ");
|
||||||
|
Log("Temperature: ");
|
||||||
|
Log(tempC);
|
||||||
|
//LogF(DHT.temperature);
|
||||||
|
Log(" Humidity: ");
|
||||||
|
LogLn(humidity);
|
||||||
|
//LogF(DHT.humidity);
|
||||||
|
//rh_payload[1] = tempC >> 8;
|
||||||
|
//rh_payload[2] = tempC;
|
||||||
|
//rh_payload[3] = humidity;
|
||||||
|
rh_payload[2] = tempC >> 8;
|
||||||
|
rh_payload[3] = tempC;
|
||||||
|
rh_payload[4] = humidity;
|
||||||
|
return true;
|
||||||
} else {
|
} else {
|
||||||
rh_payload[0] &= 0b11111110;
|
rh_payload[2] = 0;
|
||||||
|
rh_payload[3] = 0;
|
||||||
|
rh_payload[4] = 0;
|
||||||
|
Log("DHT Error ");
|
||||||
|
LogLn(errno);
|
||||||
|
//return false;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setBatteryVoltage(uint16_t bvoltage)
|
|
||||||
{
|
|
||||||
uint16_t payloadbat = rh_payload[2];
|
|
||||||
payloadbat += rh_payload[1] << 8;
|
|
||||||
payloadbat &= 0b0000000001111111;
|
|
||||||
payloadbat += bvoltage << 7;
|
|
||||||
//Serial.println(payloadbat);
|
|
||||||
rh_payload[1] = payloadbat >> 8;
|
|
||||||
rh_payload[2] = payloadbat;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setBatteryPercent(uint8_t bpercent)
|
|
||||||
{
|
|
||||||
uint16_t payloadbat = rh_payload[2];
|
|
||||||
payloadbat += rh_payload[1] << 8;
|
|
||||||
payloadbat &= 0b1111111110000000;
|
|
||||||
payloadbat += bpercent;
|
|
||||||
//Serial.println(payloadbat);
|
|
||||||
rh_payload[1] = payloadbat >> 8;
|
|
||||||
rh_payload[2] = payloadbat;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setTemperature()
|
|
||||||
{
|
|
||||||
ds18b20.requestTemperaturesByIndex(0);
|
|
||||||
delay(500);
|
|
||||||
int16_t tempC = (int16_t) roundf(ds18b20.getTempCByIndex(0)*100);
|
|
||||||
if(tempC != DEVICE_DISCONNECTED_C) {
|
|
||||||
//int16_t tempC = (int16_t) (ds18b20.getTempCByIndex(0)*100.0);
|
|
||||||
LogLn(tempC);
|
|
||||||
rh_payload[3] = tempC >> 8;
|
|
||||||
rh_payload[4] = tempC;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void setHumidity()
|
|
||||||
{
|
|
||||||
rh_payload[5] = 33;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void setupWatchDogTimer(int time)
|
|
||||||
{
|
|
||||||
if (time > 9 )
|
|
||||||
time = 9; //Limit incoming amount to legal settings
|
|
||||||
|
|
||||||
cli();
|
|
||||||
MCUSR &= ~(1<<WDRF); // Clear watch dog reset flag
|
|
||||||
_WD_CONTROL_REG |= (1<<WDCE) | (1<<WDE); // Set WD_change enable, set WD enable
|
|
||||||
_WD_CONTROL_REG = (time & 7) | (time & 8) << 2;
|
|
||||||
_WD_CONTROL_REG |= (1<<WDIE); // enable interrupt
|
|
||||||
sei();
|
|
||||||
}
|
|
||||||
|
|
||||||
void powerDown(void)
|
|
||||||
{
|
|
||||||
setupWatchDogTimer(WDTO_8S);
|
|
||||||
#if defined(BODS) && defined(BODSE) //if MCU has bulit-in BOD it will be disabled, ATmega328P, ATtiny8>
|
|
||||||
sleep_bod_disable(); //disable Brown Out Detector (BOD) before going to sleep, saves mo>
|
|
||||||
#endif
|
|
||||||
sleep_enable();
|
|
||||||
sleep_mode();
|
|
||||||
sleep_disable();
|
|
||||||
}
|
|
||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
{
|
{
|
||||||
ADCSRA &= ~(1<<ADEN); //Disable ADC, saves ~230uA
|
Serial.begin(9600); // Debugging only
|
||||||
// setupWatchDogTimer(WDTO_8S);
|
delay(5000);
|
||||||
set_sleep_mode(SLEEP_MODE_PWR_DOWN); //Power down everything, wake up from WDT
|
|
||||||
|
|
||||||
if(SEND_DELAY < 8)
|
|
||||||
{
|
|
||||||
sleeprepeat = 1;
|
|
||||||
} else {
|
|
||||||
sleeprepeat = lround(SEND_DELAY / 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(SEND_DELAY_BATTERY < 8)
|
|
||||||
{
|
|
||||||
sleeprepeatbat = 1;
|
|
||||||
} else {
|
|
||||||
sleeprepeatbat = lround(SEND_DELAY_BATTERY / (sleeprepeat*8));
|
|
||||||
}
|
|
||||||
|
|
||||||
#if LOGGER
|
|
||||||
Serial.begin(9600); // Debugging only
|
|
||||||
#if defined(ARDUINO_AVR_ATTINYX5)
|
|
||||||
// Disable RX (free port PB1)
|
|
||||||
ACSR &=~(1<<ACIE);
|
|
||||||
ACSR |=~(1<<ACD);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#if !defined(ARDUINO_AVR_ATTINYX5) || (defined(ARDUINO_AVR_ATTINYX5) && !LOGGER)
|
|
||||||
driver.init();
|
|
||||||
driver.setHeaderId(SENSORID);
|
|
||||||
#endif
|
|
||||||
LogLn("Startup");
|
LogLn("Startup");
|
||||||
|
|
||||||
ds18b20.begin();
|
if (!driver.init()) { LogLn("RH init failed"); }
|
||||||
if(ds18b20.getDeviceCount() > 0) { temp_enabled = true; }
|
driver.setHeaderId(SENSORID);
|
||||||
|
|
||||||
//rh_payload[0]=10;
|
DHT.setType(22);
|
||||||
|
//DHT.setDisableIRQ(true);
|
||||||
|
TIMSK1 &= ~_BV(OCIE1A);
|
||||||
|
|
||||||
// Temperature initial (-100)
|
// Temperature initial (-100)
|
||||||
rh_payload[3] = 0xff;
|
//rh_payload[1] = 0xff;
|
||||||
rh_payload[4] = 0x9c;
|
//rh_payload[2] = 0x9c;
|
||||||
|
rh_payload[2] = 0xff;
|
||||||
|
rh_payload[3] = 0x9c;
|
||||||
|
|
||||||
setSensorType(1);
|
setSensorType(2);
|
||||||
setBatteryStatus(0);
|
|
||||||
|
|
||||||
setBatteryVoltage(123);
|
sendTH();
|
||||||
setBatteryPercent(50);
|
//driver.setModeRx();
|
||||||
|
|
||||||
//if(temp_enabled == true) { setTemperature(); }
|
}
|
||||||
//setHumidity();
|
|
||||||
|
void sendTH()
|
||||||
|
{
|
||||||
|
//Serial.println("Send");
|
||||||
|
if(setTH()==true) {
|
||||||
|
TIMSK1 |= _BV(OCIE1A);
|
||||||
|
//driver.setModeTx();
|
||||||
|
for(uint8_t i=0;i<4;i++)
|
||||||
|
{
|
||||||
|
driver.send(rh_payload, 5);
|
||||||
|
driver.waitPacketSent();
|
||||||
|
delay(100);
|
||||||
|
}
|
||||||
|
TIMSK1 &= ~_BV(OCIE1A);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop()
|
void loop()
|
||||||
{
|
{
|
||||||
//Serial.println("Send");
|
//uint8_t buf[RH_ASK_MAX_MESSAGE_LEN];
|
||||||
if(temp_enabled == true) { setTemperature(); }
|
//uint8_t buflen = sizeof(buf);
|
||||||
setHumidity();
|
|
||||||
|
|
||||||
#if !defined(ARDUINO_AVR_ATTINYX5) || (defined(ARDUINO_AVR_ATTINYX5) && !LOGGER)
|
delay(60000+random(5000));
|
||||||
for(uint8_t i=0;i<3;i++)
|
//delay(15000);
|
||||||
{
|
sendTH();
|
||||||
driver.send(rh_payload, 6);
|
/*if(millis() < lastsendrh || millis() > lastsendrh+DELAYSEND)
|
||||||
driver.waitPacketSent();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
LogLn("Before delay");
|
|
||||||
delay(15000);
|
|
||||||
myTime = millis();
|
|
||||||
LogLn(sleepcount);
|
|
||||||
LogLn(myTime);
|
|
||||||
if(sleepcount > sleeprepeatbat)
|
|
||||||
{
|
{
|
||||||
LogLn("Probe Battery");
|
lastsendrh=millis();
|
||||||
sleepcount = 0;
|
sendTH();
|
||||||
} else {
|
//driver.setModeRx();
|
||||||
sleepcount = sleepcount + 1;
|
|
||||||
}
|
}
|
||||||
//setupWatchDogTimer(WDTO_8S);
|
if (driver.recv(buf, &buflen)) {
|
||||||
for (uint8_t i=0; i<sleeprepeat; i++) { powerDown(); }
|
driver.printBuffer("Got:", buf, buflen);
|
||||||
//sleep_disable();
|
}*/
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue