initial version

This commit is contained in:
2023-10-30 23:15:40 +01:00
commit 8f8c69c37a
13 changed files with 321 additions and 0 deletions

1
arduino/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.pio

20
arduino/platformio.ini Normal file
View File

@ -0,0 +1,20 @@
; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[env:uno]
platform = atmelavr
board = uno
framework = arduino
lib_deps =
bakercp/PacketSerial@^1.4.0
paulstoffregen/OneWire@^2.3.7
milesburton/DallasTemperature@^3.11.0
ivanseidel/LinkedList@0.0.0-alpha+sha.dac3874d28
monitor_encoding = hexlify

35
arduino/src/Sensor.cpp Normal file
View File

@ -0,0 +1,35 @@
#include <Sensor.hpp>
#include <Arduino.h>
template<typename T>
inline size_t writeType(byte *buffer, T val) {
memcpy(buffer, &val, sizeof(T));
return sizeof(T);
}
Sensor::Sensor(int id, float resolution, float accuracy, DallasTemperature &bus, DeviceAddress address) : id(id), resolution(resolution), accuracy(accuracy), bus(bus) {
memcpy(this->address, address, sizeof(DeviceAddress));
};
float Sensor::read() const {
bus.requestTemperaturesByAddress(address);
return bus.getTempC(address);
}
uint16_t Sensor::makeDataPacket(byte (&buffer)[dataPacketMaxSize]) const {
size_t written = 0;
written += writeType(&buffer[written], id);
written += writeType(&buffer[written], read());
return written + 1;
}
void Sensor::registerSensor(byte (&buffer)[serializedSize]) const {
size_t written = 0;
written += writeType(&buffer[written], id);
written += writeType(&buffer[written], resolution);
written += writeType(&buffer[written], accuracy);
}

32
arduino/src/Sensor.hpp Normal file
View File

@ -0,0 +1,32 @@
#ifndef SENSOR_HPP
#define SENSOR_HPP
#include <Arduino.h>
#include <DallasTemperature.h>
class Sensor {
private:
uint16_t id;
uint8_t resolution;
float accuracy;
DallasTemperature &bus;
DeviceAddress address;
public:
static constexpr uint16_t serializedSize = sizeof(id) + sizeof(resolution) + sizeof(accuracy);
static constexpr uint16_t dataPacketMaxSize = 256;
Sensor(int id, float resolution, float accuracy, DallasTemperature &bus, DeviceAddress address);
float read() const;
uint16_t getId() const {return id;};
uint16_t makeDataPacket(byte (&buffer)[dataPacketMaxSize]) const;
void registerSensor(byte (&buffer)[serializedSize]) const;
};
#endif

59
arduino/src/main.cpp Normal file
View File

@ -0,0 +1,59 @@
#include <Arduino.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <PacketSerial.h>
#include <LinkedList.h>
#include <Sensor.hpp>
constexpr uint8_t oneWirePort = 4;
enum class PacketType : byte {
registration = 0x01,
data = 0x02
};
int main() {
init();
PacketSerial packetSerial;
packetSerial.begin(9600);
OneWire oneWire(oneWirePort);
DallasTemperature sensorBus(&oneWire);
sensorBus.begin();
LinkedList<Sensor*> sensors;
DeviceAddress tempAddress;
Sensor *tempSensorAddress;
for(int i = 0; i < sensorBus.getDeviceCount(); ++i) {
sensorBus.getAddress(tempAddress, i);
tempSensorAddress = new Sensor(i, sensorBus.getResolution(tempAddress), 0.5, sensorBus, tempAddress);
sensors.add(tempSensorAddress);
}
byte buff[Sensor::serializedSize + 1];
buff[0] = (byte)PacketType::registration;
for(int i = 0; i < sensors.size(); ++i) {
sensors.get(i)->registerSensor((byte(&)[Sensor::serializedSize])buff[1]);
packetSerial.send(buff, sizeof(buff));
}
byte dataBuff[Sensor::dataPacketMaxSize + 1];
dataBuff[0] = (byte)PacketType::data;
uint16_t written;
while(true) {
for(int i = 0; i < sensors.size(); ++i) {
written = sensors.get(i)->makeDataPacket((byte(&)[Sensor::dataPacketMaxSize])dataBuff[1]);
packetSerial.send(dataBuff, written);
}
delay(500);
}
for(int i = 0; i < sensors.size(); ++i) {
delete sensors.get(i);
}
return 0;
}