From bbfd5daa171f182d8aff66d1a81252f6ce196462 Mon Sep 17 00:00:00 2001 From: Thomas von Dein Date: Sun, 15 Mar 2020 13:34:55 +0100 Subject: [PATCH] add --- .../841sleep.h | 1 + .../841vcc.h | 1 + .../Makefile | 53 ++++++ .../README.md | 17 ++ .../SensorSerial.ino | 157 ++++++++++++++++++ .../data2wire.h | 1 + .../hardware | 1 + .../libraries/RFTransmitter | 1 + .../libraries/SPI | 1 + .../libraries/TinyBME280 | 1 + .../SensorSerial.ino | 9 +- mylibs/841sleep.h | 21 ++- mylibs/841vcc.h | 13 +- mylibs/data2wire.h | 70 ++++++++ 14 files changed, 331 insertions(+), 16 deletions(-) create mode 120000 841-tinycore-micronucleus-vcc-sleepmode-bme280-radio-header-test/841sleep.h create mode 120000 841-tinycore-micronucleus-vcc-sleepmode-bme280-radio-header-test/841vcc.h create mode 100644 841-tinycore-micronucleus-vcc-sleepmode-bme280-radio-header-test/Makefile create mode 100644 841-tinycore-micronucleus-vcc-sleepmode-bme280-radio-header-test/README.md create mode 100644 841-tinycore-micronucleus-vcc-sleepmode-bme280-radio-header-test/SensorSerial.ino create mode 120000 841-tinycore-micronucleus-vcc-sleepmode-bme280-radio-header-test/data2wire.h create mode 120000 841-tinycore-micronucleus-vcc-sleepmode-bme280-radio-header-test/hardware create mode 120000 841-tinycore-micronucleus-vcc-sleepmode-bme280-radio-header-test/libraries/RFTransmitter create mode 120000 841-tinycore-micronucleus-vcc-sleepmode-bme280-radio-header-test/libraries/SPI create mode 120000 841-tinycore-micronucleus-vcc-sleepmode-bme280-radio-header-test/libraries/TinyBME280 create mode 100644 mylibs/data2wire.h diff --git a/841-tinycore-micronucleus-vcc-sleepmode-bme280-radio-header-test/841sleep.h b/841-tinycore-micronucleus-vcc-sleepmode-bme280-radio-header-test/841sleep.h new file mode 120000 index 0000000..bf02835 --- /dev/null +++ b/841-tinycore-micronucleus-vcc-sleepmode-bme280-radio-header-test/841sleep.h @@ -0,0 +1 @@ +../mylibs/841sleep.h \ No newline at end of file diff --git a/841-tinycore-micronucleus-vcc-sleepmode-bme280-radio-header-test/841vcc.h b/841-tinycore-micronucleus-vcc-sleepmode-bme280-radio-header-test/841vcc.h new file mode 120000 index 0000000..5c7efd5 --- /dev/null +++ b/841-tinycore-micronucleus-vcc-sleepmode-bme280-radio-header-test/841vcc.h @@ -0,0 +1 @@ +../mylibs/841vcc.h \ No newline at end of file diff --git a/841-tinycore-micronucleus-vcc-sleepmode-bme280-radio-header-test/Makefile b/841-tinycore-micronucleus-vcc-sleepmode-bme280-radio-header-test/Makefile new file mode 100644 index 0000000..12bb6c0 --- /dev/null +++ b/841-tinycore-micronucleus-vcc-sleepmode-bme280-radio-header-test/Makefile @@ -0,0 +1,53 @@ +# Arduino Make file. Refer to https://github.com/sudar/Arduino-Makefile + +# attiny841: +# BOARD_TAG = attinyx41 +# BOARD_SUB = 841 +# attiny861: +# BOARD_TAG = attinyx61 +# BOARD_SUB = 861 +# attiny85: +# BOARD_TAG = attinyx5 +# BOARD_SUB = 85 +# attiny84: +# BOARD_TAG = attinyx4 +# BOARD_SUB = 84 + +ARDUINO_VERSION = 10810 + +PROJECT_DIR = $(shell pwd) +BOARD_TAG = attinyx41 +BOARD_SUB = 841 +ARDUINO_DIR = /usr/local/arduino +ARDMK_DIR = /usr/local/arduino/Arduino-Makefile +MONITOR_PORT = /dev/ttyACM0 +ISP_PORT = /dev/ttyACM0 +AVRDUDE = /usr/local/bin/avrdude +ARDUINO_LIBS = SPI TinyBME280 RFTransmitter +ARDUINO_SKETCHBOOK = . + +# mk stuff +ALTERNATE_CORE = ATTinyCore +F_CPU = 8000000L +MONITOR_BAUDRATE = 115200 +AVRDUDE_ARD_PROGRAMMER = stk500v2 +AVRDUDE_ARD_BAUDRATE = 9600 +AVR_TOOLS_DIR = /usr/local/avr +AVRDUDE_CONF = /usr/local/etc/avrdude.conf + +# Micronucleus +MNINST = sudo micronucleus + +# compiler stuff +CFLAGS_STD = -std=gnu11 +CXXFLAGS_STD = -std=gnu++11 +CXXFLAGS + = -pedantic -Wall -Wextra +CURRENT_DIR = $(shell pwd) + +# keep this! +include $(ARDMK_DIR)/Arduino.mk + +# install using micronucleus +install: $(TARGET_HEX) verify_size + @echo "########### Press RESET on the Nanite! ##############" + $(MNINST) $(TARGET_HEX) diff --git a/841-tinycore-micronucleus-vcc-sleepmode-bme280-radio-header-test/README.md b/841-tinycore-micronucleus-vcc-sleepmode-bme280-radio-header-test/README.md new file mode 100644 index 0000000..fe21e57 --- /dev/null +++ b/841-tinycore-micronucleus-vcc-sleepmode-bme280-radio-header-test/README.md @@ -0,0 +1,17 @@ +# Usable Pins + +``` +PIN_A0 (10) +PIN_A1 ( 9) +PIN_A2 ( 8) +PIN_A3 ( 7) +PIN_A4 ( 6) +PIN_A5 ( 5) +PIN_A6 ( 4) +PIN_A7 ( 3) +PIN_B0 ( 0) +PIN_B1 ( 1) +PIN_B2 ( 2) +PIN_B3 (11) /* RESET */ +LED_BUILTIN (2) +``` diff --git a/841-tinycore-micronucleus-vcc-sleepmode-bme280-radio-header-test/SensorSerial.ino b/841-tinycore-micronucleus-vcc-sleepmode-bme280-radio-header-test/SensorSerial.ino new file mode 100644 index 0000000..d4deebe --- /dev/null +++ b/841-tinycore-micronucleus-vcc-sleepmode-bme280-radio-header-test/SensorSerial.ino @@ -0,0 +1,157 @@ +/* -*-c++-*- + Blink + Turns on an LED on for one second, then off for one second, repeatedly. + This example code is in the public domain. + */ + +/* + ./hardware/ATTinyCore/avr/cores/tinymodern/core_pins.h + Caution: reverse Pinout: PA3 => Pin 3 + + Nanite841 Pinout from above: + + button +SDO/MISO PA5 PA6 SDI/MOSI + SCK PA4 PA7 + CS PA3 PB2 + RX0 PA2 PB2 + TX0 PA1 PB1 + PA0 PB0 + GND VCC + usb + + Bosch BME280 Breakout from above pin header left: + + VCC + GND + SCL => SCK + SDI => MOSI + CSB => PA3/3 + SDO => MISO + + */ + +#include +#include +#include "841vcc.h" +#include "841sleep.h" +#include "data2wire.h" + +#define TINY_BME280_SPI +#include + +// https://andreasrohner.at/posts/Electronics/New-Arduino-library-for-433-Mhz-AM-Radio-Modules/ +#include + +#define NODE_ID 1 +#define OUTPUT_PIN 7 +#define LED 2 //LED_BUILTIN // PORTB2 +#define CS 3 +#define DELAY 5000 +#define WDTREPEATS 3 + +static tiny::BME280 sensor; +RFTransmitter transmitter(OUTPUT_PIN, NODE_ID); +const long InternalReferenceVoltage = 1083L; + +#define SET_OUTPUT(pin) DDRB |= (1 << pin) +#define SET_HIGH(pin) PORTB |= (1 << pin) +#define SET_LOW(pin) PORTB &= ~(1 << pin) + +typedef struct _measurements_t { + uint32_t pres; + uint32_t humidity; + int32_t temp; + uint16_t vcc; +} measurements_t; + +void print_asufloat(uint32_t val, uint16_t factor) { + Serial.print(val / factor); + Serial.print("."); + Serial.print(val % factor); +} + +void print_asifloat(int32_t val, uint16_t factor) { + Serial.print(val / factor); + Serial.print("."); + Serial.print(val % factor); +} + +void print_measurements() { + measurements_t ms; + byte sendms[sizeof(measurements_t)]; + + SET_LOW(LED); + + ms.temp = sensor.readFixedTempC(); + ms.humidity = sensor.readFixedHumidity(); + ms.pres = sensor.readFixedPressure(); + + adc_enable(); + adc_start(); + ms.vcc = adc_get_adcw(); + adc_disable(); + + Serial.print("Voltage: "); + Serial.println(ms.vcc); + + Serial.print(" Temperature: "); + print_asifloat(ms.temp, 100); + Serial.println(" Grad C"); + + Serial.print(" Pressure: "); + print_asufloat(ms.pres, 100); + Serial.println(" hPa"); + + Serial.print(" Humidity: "); + print_asufloat(ms.humidity, 1000); + Serial.println(" %"); + + data32_to_wire(ms.pres, &sendms[0]); + data32_to_wire(ms.humidity, &sendms[sizeof(ms.humidity) + 1]); + data32_to_wire(ms.temp, &sendms[sizeof(ms.temp) + 1]); + data16_to_wire(ms.vcc, &sendms[sizeof(ms.vcc) + 1]); + + transmitter.send((byte *)sendms, sizeof(sendms)); + + SET_HIGH(LED); +} + +void halt() { + while(1); +} + + +void setup() { + SET_OUTPUT(LED); + + Serial.begin(115200); + Serial.println("init"); + + delay(4000); + + adc_setup_vcc_measurement(); + + if(sensor.beginSPI(CS) == false) { + Serial.println("Sensor BME280 connect failed, check wiring!"); + halt(); + } + + sleep_setup(); +} + +void loop() { + uint8_t i; + print_measurements(); + for(i=0; i> 1.1 * 1024 / 225 #=> 5.006222222222223 -// >> 1.1 * 1024 / 341 #=> 3.3032258064516133 +/* return measured voltage, adc value between 1-1023 + Calculate like: + + >> 1.1 * 1024 / 225 #=> 5.006222222222223 + >> 1.1 * 1024 / 341 #=> 3.3032258064516133 +*/ +#define adc_get_adcw() ADCW; + #define adc_get_vcc() 1.1 * 1024 / ADCW; #endif diff --git a/mylibs/data2wire.h b/mylibs/data2wire.h new file mode 100644 index 0000000..027ab06 --- /dev/null +++ b/mylibs/data2wire.h @@ -0,0 +1,70 @@ +/* + from PCP pcp/libpcp/util.c. + + Convert byte arrays from big endian to numbers and vice versa. Do + not take care about host endianess. In Rob Pikes' words: + https://commandcenter.blogspot.de/2012/04/byte-order-fallacy.html +*/ + +#ifndef DATA2WIRE_H +#define DATA2WIRE_H + +#include + + +inline uint64_t wire_to_data64(uint8_t *data) { + uint64_t i = + ((uint64_t)data[7]<<0) | + ((uint64_t)data[6]<<8) | + ((uint64_t)data[5]<<16) | + ((uint64_t)data[4]<<24) | + ((uint64_t)data[3]<<32) | + ((uint64_t)data[2]<<40) | + ((uint64_t)data[1]<<48) | + ((uint64_t)data[0]<<56); + return i; +} + + +inline uint32_t wire_to_data32(uint8_t *data) { + uint32_t i = + ((uint32_t)data[3]<<0) | + ((uint32_t)data[2]<<8) | + ((uint32_t)data[1]<<16) | + ((uint32_t)data[0]<<24); + return i; +} + +inline uint16_t wire_to_data16(uint8_t *data) { + uint16_t i = + ((uint16_t)data[1]<<0) | + ((uint16_t)data[0]<<8); + return i; +} + +inline void data64_to_wire(uint64_t i, uint8_t *data) { + data[0] = (i >> 56) & 0xFF; + data[1] = (i >> 48) & 0xFF; + data[2] = (i >> 40) & 0xFF; + data[3] = (i >> 32) & 0xFF; + data[4] = (i >> 24) & 0xFF; + data[5] = (i >> 16) & 0xFF; + data[6] = (i >> 8) & 0xFF; + data[7] = i & 0xFF; +} + +inline void data32_to_wire(uint32_t i, uint8_t *data) { + data[0] = (i >> 24) & 0xFF; + data[1] = (i >> 16) & 0xFF; + data[2] = (i >> 8) & 0xFF; + data[3] = i & 0xFF; +} + +inline void data16_to_wire(uint16_t i, uint8_t *data) { + data[0] = (i >> 8) & 0xFF; + data[1] = i & 0xFF; +} + + + +#endif