use pro mini as sensor with attiny85 as controller

This commit is contained in:
Nicu Hodos 2023-02-20 20:13:55 +01:00
parent 4cee82f28d
commit 9862b91bf1
4 changed files with 76 additions and 57 deletions

View File

@ -10,20 +10,7 @@ private:
public: public:
SonarSensor(short id) : GenericSensor(id) {} SonarSensor(short id) : GenericSensor(id) {}
void setup() {
pinMode(VCC_PIN, OUTPUT);
turnOff();
}
unsigned int scan() { unsigned int scan() {
return sonar.convert_cm(sonar.ping_median()); return sonar.convert_cm(sonar.ping_median());
} }
void turnOn() {
digitalWrite(VCC_PIN, HIGH);
}
void turnOff() {
digitalWrite(VCC_PIN, LOW);
}
}; };

View File

@ -12,9 +12,7 @@
platform = atmelavr platform = atmelavr
board = attiny85 board = attiny85
framework = arduino framework = arduino
lib_deps = build_src_filter = +<switch.cpp>
teckel12/NewPing@^1.9.4
sui77/rc-switch @ ^2.6.4
lib_extra_dirs = lib_extra_dirs =
../libraries ../libraries
upload_protocol = stk500v1 upload_protocol = stk500v1
@ -23,3 +21,14 @@ upload_flags =
-b$UPLOAD_SPEED -b$UPLOAD_SPEED
upload_port = /dev/ttyACM0 upload_port = /dev/ttyACM0
upload_speed = 19200 upload_speed = 19200
[env:pro_mini]
platform = atmelavr
board = pro16MHzatmega168
framework = arduino
build_src_filter = +<oil_sensor.cpp>
lib_deps =
teckel12/NewPing@^1.9.4
sui77/rc-switch @ ^2.6.4
lib_extra_dirs =
../libraries

View File

@ -1,55 +1,37 @@
#include <Arduino.h> #include <Arduino.h>
#include <TinyPower.h>
#define SENDER_PIN PIN_B2 #define SENDER_GND 10
#define TRIGGER_PIN PIN_B3 #define SENDER_DATA 11
#define ECHO_PIN PIN_B4 #define SENDER_VCC 12
#define VCC_PIN PIN_B1 #define TRIGGER_PIN 2
#define ECHO_PIN 3
#define NOTIFY_PIN 9
#define MAX_DISTANCE 200 // 2 meters #define MAX_DISTANCE 200 // 2 meters
#include "SonarSensor.h" #include "SonarSensor.h"
#define SEND_INTERVAL 450 // 450*8s = ~1 hour
#define SEND_VCC_INTERVAL (SEND_INTERVAL*12) // ~12 hours
SonarSensor oilSensor(OIL_SENSOR); SonarSensor oilSensor(OIL_SENSOR);
volatile int counter = 0;
volatile bool shouldSend = true;
void setup() { void setup() {
oilSensor.setup(); Serial.begin(9600);
TinySwitch::setup(SENDER_PIN); Serial.println("starting...");
TinyPower::setup();
TinyPower::enableWdt(WDTO_8S); pinMode(SENDER_GND, OUTPUT);
digitalWrite(SENDER_GND, LOW);
pinMode(SENDER_VCC, OUTPUT);
digitalWrite(SENDER_VCC, HIGH);
TinySwitch::setup(SENDER_DATA);
delay(300);
unsigned int distance = oilSensor.scan();
Serial.println(distance);
if (distance) oilSensor.sendValueAndVoltage(distance);
delay(200);
pinMode(NOTIFY_PIN, OUTPUT);
digitalWrite(NOTIFY_PIN, LOW);
Serial.println("finished");
} }
void loop() { void loop() {
if (shouldSend) {
shouldSend = false;
oilSensor.turnOn();
delay(500);
unsigned int distance = oilSensor.scan();
oilSensor.turnOff();
if (distance) {
if (counter) {
oilSensor.sendValue(distance);
} else {
oilSensor.sendValueAndVoltage(distance);
}
}
}
TinyPower::sleep();
}
ISR(WDT_vect) {
counter++;
if ((counter % SEND_INTERVAL == 0)) {
shouldSend = true;
if ((counter % SEND_VCC_INTERVAL == 0)) {
counter = 0;
}
}
} }

41
oil_sensor/src/switch.cpp Normal file
View File

@ -0,0 +1,41 @@
#include <Arduino.h>
#include <TinyPower.h>
#define CONTROLLER_PIN PIN_B4
#define NOTIFICATION_PIN PIN_B0
#define HOUR_INTERVAL 450 // 450*8s = ~1 hour
#define WAKE_INTERVAL (HOUR_INTERVAL*12) // ~12 hours
volatile int counter = 0;
volatile bool wakeUp = true;
void setup() {
pinMode(PIN_B3, INPUT);
pinMode(CONTROLLER_PIN, OUTPUT);
digitalWrite(CONTROLLER_PIN, LOW);
pinMode(NOTIFICATION_PIN, INPUT_PULLUP);
TinyPower::setup();
TinyPower::enableWdt(WDTO_8S);
}
void loop() {
if (wakeUp) {
wakeUp = false;
digitalWrite(CONTROLLER_PIN, HIGH);
}
TinyPower::sleep(NOTIFICATION_PIN);
}
ISR(WDT_vect) {
counter++;
if ((counter % WAKE_INTERVAL == 0)) {
wakeUp = true;
}
}
ISR(PCINT0_vect) {
if (!digitalRead(NOTIFICATION_PIN))
digitalWrite(CONTROLLER_PIN, LOW);
}