restructuring, testing

This commit is contained in:
Stefan Ostermann 2021-05-02 01:20:47 +02:00
parent 009a035bc7
commit 61374b584a
6 changed files with 178 additions and 80 deletions

View File

@ -34,4 +34,11 @@ force_verbose = True
; Platformio Project Tasks -> Set Fuses! ; Platformio Project Tasks -> Set Fuses!
board_fuses.lfuse = 0xE2 board_fuses.lfuse = 0xE2
board_fuses.hfuse = 0xDF board_fuses.hfuse = 0xDF
; for unit testing. In Platformio -> Project Tasks open native->Advanced click test.
[env:native]
platform = native
build_flags = -std=gnu++11
lib_deps =
ArduinoFake

View File

@ -1,5 +1,17 @@
#ifndef __CONFIG_H__ #ifndef __CONFIG_H__
#define __CONFIG_H__ #define __CONFIG_H__
// Device ID, from 0-15:
#define DEVICE_ID 0x01
/*
define when to wake up
0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms
6=1 sec,7=2 sec, 8=4 sec, 9= 8sec
*/
#define WATCHDOG_WAKEUP 9
// Sleep this many again before waging up. Sleep time in s = WATCHDOG_WAKEUP s * WATCHDOG_SLEEP_FURTHER, e.g. 8*8s = 64s
#define WATCHDOG_SLEEP_FURTHER 8
#endif #endif

View File

@ -7,78 +7,29 @@
https://git.cryhost.de/crycode/attiny85-radiohead-dht22-weather-sensor/-/tree/master https://git.cryhost.de/crycode/attiny85-radiohead-dht22-weather-sensor/-/tree/master
*/ */
// pin with the transistor base (And LED) is connected
#define TRANSISTOR_BASE_PIN 4
// blink time for the LED
#define LED_TIME 200
// pin of the DHT22 sensor
#define DHT_PIN 1
// pin of the soil sensor
#define SOIL_PIN A1
// the own RadioHead address
#define RH_OWN_ADDR 0xca // 202
// RadioHead bitrate in bit/s
#define RH_SPEED 1000
/*
define when to wake up
0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms
6=1 sec,7=2 sec, 8=4 sec, 9= 8sec
*/
#define WATCHDOG_WAKEUP 9
// Sleep this many again before waging up. Sleep time in s = WATCHDOG_WAKEUP s * WATCHDOG_SLEEP_FURTHER, e.g. 8*8s = 64s
#define WATCHDOG_SLEEP_FURTHER 8
// pins for the radio hardware
#define RH_RX_PIN 6 // not used, set to a non-existent pin
#define RH_TX_PIN 3 // Transmit Pin
#define RH_PTT_PIN 6 // not used, set to a non-existent pin
#include <Arduino.h> #include <Arduino.h>
#include <avr/sleep.h> #include <avr/sleep.h>
#include <avr/wdt.h> #include <avr/wdt.h>
#include <util/delay.h> #include <util/delay.h>
// for watchdog wakeup // RadioHead
// https://gist.github.com/dwhacks/8055287 #include <RH_ASK.h>
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
// DHT22 lib // DHT22 lib
// not using the current adafruit dht library, because it's too memory intensive // not using the current adafruit dht library, because it's too memory intensive
#include "dht22.h" #include "dht22.h"
dht22 dht;
// Configuration, see file config.h.example and rename to config.h. Project specific, do not add to git! // Configuration, see file config.h.example and rename to config.h. Project specific, do not add to git!
#include "config.h" #include "config.h"
#define RH_BUF_LEN 11 #include "sensor433.h"
uint8_t rh_buf[RH_BUF_LEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
// reduce the RadioHead max message length to save memory
#define RH_ASK_MAX_MESSAGE_LEN RH_BUF_LEN
// RadioHead
#include <RH_ASK.h>
// Message Headers: // global variables:
#define MSG_START 0x00
#define MSG_BAT 0x03
#define MSG_HEADER 0x05
#define MSG_ERR 0xee
RH_ASK rh_driver(RH_SPEED, RH_RX_PIN, RH_TX_PIN, RH_PTT_PIN);
// watchdog flag // watchdog flag
volatile boolean f_wdt = 1; volatile boolean f_wdt = 1;
@ -86,18 +37,28 @@ volatile boolean f_wdt = 1;
// temp / humid toggle // temp / humid toggle
volatile uint8_t counter = 0; volatile uint8_t counter = 0;
dht22 dht;
uint8_t rh_buf[RH_BUF_LEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
RH_ASK rh_driver(RH_SPEED, RH_RX_PIN, RH_TX_PIN, RH_PTT_PIN);
// end global variables.
// prototypes: // prototypes:
void gotoSleep(void); void rh_send(uint8_t rh_buf[], uint8_t len);
int getVcc();
void rh_send(uint8_t len);
void setup_watchdog(int ii); void setup_watchdog(int ii);
void system_sleep(); void system_sleep();
void blink(uint8_t num); void gotoSleep(void);
int getVcc();
void setup() void setup()
{ {
@ -120,7 +81,7 @@ void setup()
// send start message // send start message
rh_buf[0] = MSG_START; rh_buf[0] = MSG_START;
rh_send(1); rh_send(rh_buf,1);
setup_watchdog(WATCHDOG_WAKEUP); setup_watchdog(WATCHDOG_WAKEUP);
} }
@ -149,17 +110,17 @@ void loop()
rh_buf[0] = MSG_BAT; rh_buf[0] = MSG_BAT;
battery = getVcc(); battery = getVcc();
memcpy(&rh_buf[1], &battery, 4); memcpy(&rh_buf[1], &battery, 4);
rh_send(RH_BUF_LEN); rh_send(rh_buf,RH_BUF_LEN);
} }
else if (dht_read_data(&dht, &t, &h) == 1) else if (dht_read_data(&dht, &t, &h) == 1)
{ {
rh_buf[0] = MSG_HEADER; rh_buf[0] = MSG_TEMPHUM;
memcpy(&rh_buf[1], &t, 4); memcpy(&rh_buf[1], &t, 4);
memcpy(&rh_buf[5], &h, 4); memcpy(&rh_buf[5], &h, 4);
soil = analogRead(SOIL_PIN); soil = analogRead(SOIL_PIN);
memcpy(&rh_buf[9], &soil, 2); memcpy(&rh_buf[9], &soil, 2);
rh_send(RH_BUF_LEN); rh_send(rh_buf,RH_BUF_LEN);
} }
else else
{ {
@ -168,7 +129,7 @@ void loop()
digitalWrite(TRANSISTOR_BASE_PIN, HIGH); digitalWrite(TRANSISTOR_BASE_PIN, HIGH);
delay(5); delay(5);
rh_buf[0] = MSG_ERR; rh_buf[0] = MSG_ERR;
rh_send(1); rh_send(rh_buf,1);
} }
counter++; counter++;
@ -186,21 +147,13 @@ void loop()
} }
} }
void blink(uint8_t num)
{
// blink n times
for (uint8_t i = 0; i < num; i++)
{
digitalWrite(TRANSISTOR_BASE_PIN, HIGH);
_delay_ms(LED_TIME);
digitalWrite(TRANSISTOR_BASE_PIN, LOW);
_delay_ms(LED_TIME);
}
}
// function to send RadioHead messages from the buffer // function to send RadioHead messages from the buffer
void rh_send(uint8_t len) void rh_send(uint8_t rh_buf[],uint8_t len)
{ {
#ifdef DEVICE_ID
rh_buf[0] = add_device_id(rh_buf[0], DEVICE_ID);
#endif
rh_driver.send((uint8_t *)rh_buf, len); rh_driver.send((uint8_t *)rh_buf, len);
rh_driver.waitPacketSent(); rh_driver.waitPacketSent();
} }
@ -276,4 +229,4 @@ int getVcc()
val = (ADCH << 8) | low; val = (ADCH << 8) | low;
return ((long)1024 * 1100) / val; return ((long)1024 * 1100) / val;
} }

View File

@ -0,0 +1,19 @@
#include "sensor433.h"
void blink(uint8_t num)
{
// blink n times
for (uint8_t i = 0; i < num; i++)
{
digitalWrite(TRANSISTOR_BASE_PIN, HIGH);
delay(LED_TIME);
digitalWrite(TRANSISTOR_BASE_PIN, LOW);
delay(LED_TIME);
}
}
uint8_t add_device_id(uint8_t value, uint8_t device_id) {
return value |= device_id;
}

71
sensor433/src/sensor433.h Normal file
View File

@ -0,0 +1,71 @@
/**
* Sensor Header lib.
* Definitions and testable functions.
*
**/
#ifndef __SENSOR433_H__
#define __SENSOR433_H__
#include <Arduino.h>
// DHT22 lib
// not using the current adafruit dht library, because it's too memory intensive
#include "dht22.h"
#include "config.h"
// pin with the transistor base (And LED) is connected
#define TRANSISTOR_BASE_PIN 4
// blink time for the LED
#define LED_TIME 200
// pin of the DHT22 sensor
#define DHT_PIN 1
// pin of the soil sensor
#define SOIL_PIN A1
#define RH_BUF_LEN 11
// RadioHead bitrate in bit/s
#define RH_SPEED 1000
// pins for the radio hardware
#define RH_RX_PIN 6 // not used, set to a non-existent pin
#define RH_TX_PIN 3 // Transmit Pin
#define RH_PTT_PIN 6 // not used, set to a non-existent pin
// Message Headers:
#define MSG_START 0x10
#define MSG_BAT 0x20
#define MSG_TEMPHUM 0x30
#define MSG_ERR 0x40
// for watchdog wakeup
// https://gist.github.com/dwhacks/8055287
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
// function prototypes:
void blink(uint8_t num);
uint8_t add_device_id(uint8_t value, uint8_t device_id);
#endif

View File

@ -0,0 +1,36 @@
#include <unity.h>
#include <Arduino.h>
#include "config.h"
#include "sensor433.h"
// somehow not possible to use method from sensor433.h/cpp, linking fails:
uint8_t add_device_id(uint8_t value, uint8_t device_id) {
return value |= device_id;
}
void test_message_header() {
uint8_t header = MSG_START;
header = add_device_id(header, DEVICE_ID);
// 0x10 | 0x01 = 0x11
TEST_ASSERT_EQUAL(0x11, header);
// header
TEST_ASSERT_EQUAL(0x10, header & 0x10);
// id
TEST_ASSERT_EQUAL(0x01, header & 0x01);
}
int main(int argc, char **argv) {
UNITY_BEGIN();
RUN_TEST(test_message_header);
UNITY_END();
return 0;
}