First commit
This commit is contained in:
commit
adb0fe2037
|
|
@ -0,0 +1,12 @@
|
||||||
|
junk: :09000000
|
||||||
|
fuse0: 00
|
||||||
|
fuse1: 00
|
||||||
|
fuse2: 02
|
||||||
|
fuse3: FF
|
||||||
|
fuse4: 00
|
||||||
|
fuse5: F6
|
||||||
|
fuse6: 07
|
||||||
|
fuse7: 00
|
||||||
|
fuse8: 00
|
||||||
|
junk: F9
|
||||||
|
more junk: :00000001FF
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
[platformio]
|
||||||
|
default_envs = tiny1614
|
||||||
|
|
||||||
|
[env:tiny1614]
|
||||||
|
platform = atmelmegaavr
|
||||||
|
platform_packages = framework-arduino-megaavr-megatinycore @ https://github.com/SpenceKonde/megaTinyCore/
|
||||||
|
board = ATtiny1614
|
||||||
|
framework = arduino
|
||||||
|
board_build.f_cpu = 4000000L
|
||||||
|
board_hardware.bod = disabled
|
||||||
|
lib_deps =
|
||||||
|
robtillaart/SHT4x
|
||||||
|
upload_protocol = serialupdi
|
||||||
|
#upload_flags =
|
||||||
|
# -P$UPLOAD_PORT
|
||||||
|
# -b$UPLOAD_SPEED
|
||||||
|
# -V
|
||||||
|
targets = upload, monitor
|
||||||
|
#targets = upload
|
||||||
|
#upload_speed = 19200
|
||||||
|
monitor_filters = time
|
||||||
|
upload_port = /dev/ttyACM0
|
||||||
|
monitor_speed = 9600
|
||||||
|
monitor_port = /dev/ttyUSB0
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
void sendInfactory(int pin, uint8_t id, uint8_t channel, bool batteryOK, bool button, uint8_t humidity, float temperature);
|
||||||
|
|
@ -0,0 +1,97 @@
|
||||||
|
uint8_t msg[5];
|
||||||
|
uint8_t pin_tx;
|
||||||
|
|
||||||
|
uint8_t crc4(uint8_t const message[], unsigned nBytes, uint8_t polynomial, uint8_t init)
|
||||||
|
{
|
||||||
|
unsigned remainder = init << 4; // LSBs are unused
|
||||||
|
unsigned poly = polynomial << 4;
|
||||||
|
unsigned bit;
|
||||||
|
|
||||||
|
while (nBytes--) {
|
||||||
|
remainder ^= *message++;
|
||||||
|
for (bit = 0; bit < 8; bit++) {
|
||||||
|
if (remainder & 0x80) {
|
||||||
|
remainder = (remainder << 1) ^ poly;
|
||||||
|
} else {
|
||||||
|
remainder = (remainder << 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return remainder >> 4 & 0x0f; // discard the LSBs
|
||||||
|
}
|
||||||
|
|
||||||
|
void sendInfactory(int pin, uint8_t id, uint8_t channel, bool batteryOK, bool button, uint8_t humidity, float temperature) {
|
||||||
|
pin_tx = pin;
|
||||||
|
// put your setup code here, to run once:
|
||||||
|
msg[0] = id;
|
||||||
|
msg[4] = channel + ((humidity%10) << 4 );
|
||||||
|
msg[3] = humidity/10;
|
||||||
|
|
||||||
|
//int binTemp = ((temperature * 9./5) + 32 + 90)*10;
|
||||||
|
int binTemp = (temperature+90)*10;
|
||||||
|
msg[3] += (binTemp & 0x0F) << 4;
|
||||||
|
msg[2] = binTemp >> 4;
|
||||||
|
|
||||||
|
//msg[1] = batteryOK << 2;
|
||||||
|
msg[1] = button << 3;
|
||||||
|
msg[1] = msg[1] | (!batteryOK << 2);
|
||||||
|
|
||||||
|
msg[1] = (msg[1] & 0x0F) | (msg[4] & 0x0F) << 4;
|
||||||
|
// crc4() only works with full bytes
|
||||||
|
uint8_t crc = crc4(msg, 4, 0x13, 0); // Koopmann 0x9, CCITT-4; FP-4; ITU-T G.704
|
||||||
|
crc ^= msg[4] >> 4; // last nibble is only XORed
|
||||||
|
|
||||||
|
msg[1] = (msg[1] & 0x0F) | (crc & 0x0F) << 4;
|
||||||
|
|
||||||
|
//for (int i=0; i<=4; i++){
|
||||||
|
// Serial.print(msg[i],HEX);
|
||||||
|
// Serial.print(" ");
|
||||||
|
//}
|
||||||
|
|
||||||
|
sendRF();
|
||||||
|
}
|
||||||
|
|
||||||
|
void sendRF()
|
||||||
|
{
|
||||||
|
/*low long 4000
|
||||||
|
low short 1800
|
||||||
|
high short 700
|
||||||
|
*/
|
||||||
|
|
||||||
|
noInterrupts();
|
||||||
|
//for (int n=0; n<6; n++)
|
||||||
|
for (int n=0; n<2; n++)
|
||||||
|
{
|
||||||
|
for (int i=0; i<8; i++){
|
||||||
|
digitalWrite(pin_tx, !(i%2));
|
||||||
|
delayMicroseconds(1000);
|
||||||
|
}
|
||||||
|
digitalWrite(pin_tx, HIGH);
|
||||||
|
delayMicroseconds(550);
|
||||||
|
digitalWrite(pin_tx, LOW);
|
||||||
|
delayMicroseconds(8000);
|
||||||
|
|
||||||
|
for (int i = 0; i<5; i++) {
|
||||||
|
for (int b = 7; b>=0; b--) {
|
||||||
|
digitalWrite(pin_tx, HIGH);
|
||||||
|
//delayMicroseconds(700);
|
||||||
|
delayMicroseconds(550);
|
||||||
|
digitalWrite(pin_tx, LOW);
|
||||||
|
if (bitRead(msg[i], b)){
|
||||||
|
delayMicroseconds(4000);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
//delayMicroseconds(1800);
|
||||||
|
delayMicroseconds(2000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
digitalWrite(pin_tx, HIGH);
|
||||||
|
delayMicroseconds(550);
|
||||||
|
digitalWrite(pin_tx, LOW);
|
||||||
|
|
||||||
|
delayMicroseconds(16000);
|
||||||
|
}
|
||||||
|
interrupts();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,155 @@
|
||||||
|
#include <avr/sleep.h>
|
||||||
|
#include "Wire.h"
|
||||||
|
#include "SHT4x.h"
|
||||||
|
|
||||||
|
#include "inFactoryTransmit.h"
|
||||||
|
|
||||||
|
#define PIN_TX 3
|
||||||
|
#define CHANNEL 1
|
||||||
|
#define ID 11
|
||||||
|
|
||||||
|
SHT4x sht;
|
||||||
|
|
||||||
|
bool butval = false;
|
||||||
|
bool batval = true;
|
||||||
|
int8_t sendfromstart = 0;
|
||||||
|
int8_t sendcountbat = 0;
|
||||||
|
|
||||||
|
void RTC_init(void)
|
||||||
|
{
|
||||||
|
/* Initialize RTC: */
|
||||||
|
while (RTC.STATUS > 0)
|
||||||
|
{
|
||||||
|
; /* Wait for all register to be synchronized */
|
||||||
|
}
|
||||||
|
RTC.CLKSEL = RTC_CLKSEL_INT32K_gc; /* 32.768kHz Internal Ultra-Low-Power Oscillator (OSCULP32K) */
|
||||||
|
|
||||||
|
RTC.PITINTCTRL = RTC_PI_bm; /* PIT Interrupt: enabled */
|
||||||
|
|
||||||
|
RTC.PITCTRLA = RTC_PERIOD_CYC16384_gc /* RTC Clock Cycles 16384, resulting in 32.768kHz/16384 = 2Hz */
|
||||||
|
| RTC_PITEN_bm; /* Enable PIT counter: enabled */
|
||||||
|
}
|
||||||
|
|
||||||
|
ISR(RTC_PIT_vect)
|
||||||
|
{
|
||||||
|
RTC.PITINTFLAGS = RTC_PI_bm; /* Clear interrupt flag by writing '1' (required) */
|
||||||
|
}
|
||||||
|
|
||||||
|
void sleepNSeconds(uint16_t val) {
|
||||||
|
// Serial.flush();
|
||||||
|
// first cycle may not be full cycle
|
||||||
|
//disableAllPeripherals(); // all off
|
||||||
|
for (uint16_t i = 0; i < (val*2) ; i++) {
|
||||||
|
//diagnosticPinLow(); // set low to show sleeping
|
||||||
|
sleep_cpu(); // put MCU to sleep
|
||||||
|
//diagnosticPinHigh(); // set high to show awake
|
||||||
|
}
|
||||||
|
// now awake, sleep cycles complete, continue on
|
||||||
|
//initSerialGPIO(); // initialize serial and GPIO
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//returns Vdd volts*100 (3.21v = return 321)
|
||||||
|
uint16_t readVdd() {
|
||||||
|
uint16_t ret;
|
||||||
|
//ADC0.CTRLA |= ADC_ENABLE_bm;
|
||||||
|
//adc0 VREF = 1v1
|
||||||
|
VREF.CTRLA = (VREF.CTRLA & ~VREF_ADC0REFSEL_gm) | VREF_ADC0REFSEL_1V1_gc;
|
||||||
|
ADC0.CTRLB = ADC_SAMPNUM_ACC64_gc; //64 samples
|
||||||
|
ADC0.CTRLC = ADC_REFSEL_VDDREF_gc | ADC_PRESC_DIV16_gc | ADC_SAMPCAP_bm;
|
||||||
|
ADC0.CTRLD = ADC_INITDLY_DLY64_gc;
|
||||||
|
ADC0.MUXPOS = ADC_MUXPOS_INTREF_gc;
|
||||||
|
ADC0.CTRLA = 1; //enable adc
|
||||||
|
ADC0.COMMAND = 1; //start
|
||||||
|
while( ADC0.COMMAND ){} //wait
|
||||||
|
//Vdd*100 = 1023*1.1*100*64/res (64 samples, so *64 also)
|
||||||
|
|
||||||
|
ret = (1023*1.1*100ul*64) / ADC0.RES;
|
||||||
|
|
||||||
|
ADC0.CTRLA &= ~ADC_ENABLE_bm;
|
||||||
|
|
||||||
|
//Serial.print("Vdd: ");
|
||||||
|
//Serial.println(ret);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool batok() {
|
||||||
|
return (readVdd()-240)/0.4 < 20 ? false : true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup(void)
|
||||||
|
{
|
||||||
|
RTC_init(); /* Initialize the RTC timer */
|
||||||
|
set_sleep_mode(SLEEP_MODE_PWR_DOWN); /* Set sleep mode to POWER DOWN mode */
|
||||||
|
sleep_enable(); /* Enable sleep mode, but not going to sleep yet */
|
||||||
|
ADC0.CTRLA &= ~ADC_ENABLE_bm; // Disable ADC
|
||||||
|
TCA0.SPLIT.CTRLA = 0; // Disable Timers
|
||||||
|
pinMode(PIN_PA0, INPUT_PULLUP);
|
||||||
|
pinMode(PIN_PA1, INPUT_PULLUP);
|
||||||
|
pinMode(PIN_PA2, INPUT_PULLUP);
|
||||||
|
pinMode(PIN_PA3, INPUT_PULLUP);
|
||||||
|
pinMode(PIN_PA4, INPUT_PULLUP);
|
||||||
|
pinMode(PIN_PA5, INPUT_PULLUP);
|
||||||
|
pinMode(PIN_PA6, INPUT_PULLUP);
|
||||||
|
|
||||||
|
USART0.CTRLB &= ~USART_RXEN_bm & ~USART_TXEN_bm; // disable USART
|
||||||
|
pinMode(PIN_PB2, INPUT_PULLUP);
|
||||||
|
pinMode(PIN_PB3, INPUT_PULLUP);
|
||||||
|
|
||||||
|
//Serial.begin(9600);
|
||||||
|
//Serial.println("Hello ATTiny1614");
|
||||||
|
|
||||||
|
pinMode(PIN_TX, OUTPUT);
|
||||||
|
|
||||||
|
batval = batok();
|
||||||
|
|
||||||
|
Wire.begin();
|
||||||
|
sht.begin();
|
||||||
|
sht.setHeatProtection(false);
|
||||||
|
sht.read();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop(void)
|
||||||
|
{
|
||||||
|
//readVdd();
|
||||||
|
if(sht.read() == true) {
|
||||||
|
float temperature = sht.getFahrenheit();
|
||||||
|
//float temperature = sht.getTemperature();
|
||||||
|
uint8_t humidity = (uint8_t) sht.getHumidity();
|
||||||
|
//Serial.print("Temperature ");
|
||||||
|
//Serial.println(sht.getTemperature(), 1);
|
||||||
|
//Serial.print("Humidity ");
|
||||||
|
//Serial.println(humidity, 1);
|
||||||
|
if(sendfromstart == 10)
|
||||||
|
{
|
||||||
|
butval = false;
|
||||||
|
sendfromstart = -1;
|
||||||
|
sendcountbat = 0;
|
||||||
|
} else if(sendfromstart >= 0)
|
||||||
|
{
|
||||||
|
butval = true;
|
||||||
|
sendfromstart++;
|
||||||
|
}
|
||||||
|
if(sendcountbat == 2)
|
||||||
|
//if(sendcountbat == 60)
|
||||||
|
{
|
||||||
|
sendcountbat = 0;
|
||||||
|
batval = batok();
|
||||||
|
} else {
|
||||||
|
sendcountbat++;
|
||||||
|
}
|
||||||
|
sendInfactory(PIN_TX, ID, CHANNEL, batval, butval, humidity, temperature);
|
||||||
|
} else {
|
||||||
|
//Serial.print("SHT Error ");
|
||||||
|
//Serial.println(sht.getError());
|
||||||
|
}
|
||||||
|
if(butval == true) {
|
||||||
|
//Serial.println("Sleep Short");
|
||||||
|
sleepNSeconds(25+random(0,10));
|
||||||
|
} else {
|
||||||
|
//Serial.println("Sleep Long");
|
||||||
|
sleepNSeconds(55+random(0,10));
|
||||||
|
}
|
||||||
|
//delay(5000);
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue