Browse Source

Finalize water level meter code

master
KemoNine 3 years ago
parent
commit
f221f600c3
  1. 86
      hardware/arduino/water_level/water_level.ino

86
hardware/arduino/water_level/water_level.ino

@ -1,5 +1,6 @@
// need 0.1uf cap between vcc and ground for proper operation
// need 10k pull up resistor on scl and sda for i2c to work correctly
// need VCC hooked up to VREF pin 5
// Pin Mappings (Per TinyCore)
// ATTiny Pin -- Arduino Pin
@ -18,21 +19,86 @@
#define I2C_ADDRESS 0x5F
#include <Wire.h>
// eTape sensor info / values for calculations
// 5-inch: 400-1000 ±20%
// Ref Resistance 1000 ±20%
// Active Length 4.9" (213 mm)
// 8-inch: 400-1500 ±20%
// Ref Resistance 1500 ±20%
// Active Length 8.4" (213mm)
// 12-inch: 400-2000 ±20%
// Ref Resistance 2000 ±20%
// Active Length 12.4" (315mm)
// 24-inch: 400-4000 ±20%
// Ref Resistance 4000 ±20%
// Active Length 24.34" (618mm)
// 32-inch: 400-5000 ±20%
// Ref Resistance 5000 ±20%
// Active Length 32.4" (823mm)
void setup() {
pinMode(6, INPUT);
Wire.begin(I2C_ADDRESS);
Wire.onRequest(requestEvent);
}
#define SENSOR_PIN A3 // Pin 2 on physical package
#define SENSOR_REF_RESISTANCE 1000.0
#define SENSOR_VALUE_MIN 400.0
#define SENSOR_VALUE_MAX 1000.0
#define SENSOR_ACTIVE_LENGTH 4.9
#define Vin 3.3
void loop() {
delay(100);
// Average/Smoothing
#define NUM_SAMPLES 15
int samples[NUM_SAMPLES];
#include <Wire.h>
// Map a value from one range of values to another -- support decimals
float longmap(float x, float in_min, float in_max, float out_min, float out_max) {
return out_min + ((1.0 * (x - in_min) * (out_max - out_min)) / (1.0 * (in_max - in_min)));
}
// function that executes whenever data is requested by master
// this function is registered as an event, see setup()
void requestEvent() {
Wire.write((uint8_t) analogRead(6)); // Only get 0 - 1023 back so move this into a 1 byte int
// Sensor readings averaged out
float average = 0;
for (uint8_t i = 0; i < NUM_SAMPLES; i++) {
samples[i] = analogRead(SENSOR_PIN);
delay(10);
}
for (uint8_t i = 0; i < NUM_SAMPLES; i++) {
average += samples[i];
}
average /= NUM_SAMPLES;
// convert the value to resistance
float buffer = average * Vin;
float Vout = (buffer) / 1024.0;
buffer = (Vin / Vout) - 1;
float R2 = SENSOR_REF_RESISTANCE * buffer;
// Map resistance to water level
float height = longmap(R2, SENSOR_VALUE_MAX, SENSOR_VALUE_MIN, 0, SENSOR_ACTIVE_LENGTH);
// Write the value
char data[4];
dtostrf(height, 1, 2, data);
Wire.write(data);
}
void setup(void) {
analogReference(DEFAULT); // DEFAULT == Vcc
pinMode(SENSOR_PIN, INPUT);
// From arduino docs (https://www.arduino.cc/reference/en/language/functions/analog-io/analogreference/)
// After changing the analog reference, the first few readings from analogRead() may not be accurate.
// Fix this situation during setup prior to sending any values out (this chip may be on/off frequently so this is a real concern over time and needs to happen ahead of i2c sensor reads)
delay(100);
for (int i = 0; i < 6; i++) {
analogRead(SENSOR_PIN);
}
Wire.begin(I2C_ADDRESS);
Wire.onRequest(requestEvent);
}
void loop(void) {
delay(100);
}

Loading…
Cancel
Save