Merge branch 'main' of https://github.com/K-Lab-Students/kempt-kinkajou
commit
fe8b297048
@ -0,0 +1,2 @@
|
||||
cybergarden-sensor/.vscode
|
||||
cybergarden-aggregator/.vscode
|
@ -0,0 +1,5 @@
|
||||
.pio
|
||||
.vscode/.browse.c_cpp.db*
|
||||
.vscode/c_cpp_properties.json
|
||||
.vscode/launch.json
|
||||
.vscode/ipch
|
@ -0,0 +1,180 @@
|
||||
//
|
||||
// FILE: UUID.cpp
|
||||
// AUTHOR: Rob Tillaart
|
||||
// VERSION: 0.1.5
|
||||
// DATE: 2022-06-14
|
||||
// PURPOSE: Arduino Library for generating UUID's
|
||||
// URL: https://github.com/RobTillaart/UUID
|
||||
// https://en.wikipedia.org/wiki/Universally_unique_identifier
|
||||
|
||||
|
||||
#include "Uuid.h"
|
||||
|
||||
|
||||
UUID::UUID()
|
||||
{
|
||||
seed(1, 2);
|
||||
setVariant4Mode();
|
||||
generate();
|
||||
}
|
||||
|
||||
|
||||
void UUID::seed(uint32_t s1, uint32_t s2)
|
||||
{
|
||||
// set Marsaglia constants, prevent 0 as value
|
||||
if (s1 == 0) s1 = 1;
|
||||
if (s2 == 0) s2 = 2;
|
||||
_m_w = s1;
|
||||
_m_z = s2;
|
||||
}
|
||||
|
||||
|
||||
// check version 0.1.1 for more readable code
|
||||
void UUID::generate()
|
||||
{
|
||||
uint32_t ar[4];
|
||||
for (uint8_t i = 0; i < 4; i++)
|
||||
{
|
||||
ar[i] = _random();
|
||||
// store binary version globally ?
|
||||
// _ar[i] = ar[i];
|
||||
}
|
||||
// Conforming to RFC 4122 Specification
|
||||
// - byte 7: four most significant bits ==> 0100 --> always 4
|
||||
// - byte 9: two most significant bits ==> 10 --> always {8, 9, A, B}.
|
||||
//
|
||||
// patch bits for version 1 and variant 4 here
|
||||
if (_mode == UUID_MODE_VARIANT4)
|
||||
{
|
||||
ar[1] &= 0xFFF0FFFF; // remove 4 bits.
|
||||
ar[1] |= 0x00040000; // variant 4
|
||||
ar[2] &= 0xFFFFFFF3; // remove 2 bits
|
||||
ar[2] |= 0x00000008; // version 1
|
||||
}
|
||||
|
||||
// process 16 bytes build up the char array.
|
||||
for (uint8_t i = 0, j = 0; i < 16; i++)
|
||||
{
|
||||
// multiples of 4 between 8 and 20 get a -.
|
||||
// note we are processing 2 digits in one loop.
|
||||
if ((i & 0x1) == 0)
|
||||
{
|
||||
if ((4 <= i) && (i <= 10))
|
||||
{
|
||||
_buffer[j++] = '-';
|
||||
}
|
||||
}
|
||||
|
||||
// process one byte at the time instead of a nibble
|
||||
uint8_t nr = i / 4;
|
||||
uint8_t xx = ar[nr];
|
||||
uint8_t ch = xx & 0x0F;
|
||||
_buffer[j++] = (ch < 10) ? '0' + ch : ('a' - 10) + ch;
|
||||
|
||||
ch = (xx >> 4) & 0x0F;
|
||||
ar[nr] >>= 8;
|
||||
_buffer[j++] = (ch < 10) ? '0' + ch : ('a' - 10) + ch;
|
||||
}
|
||||
|
||||
// if (_upperCase)
|
||||
// {
|
||||
// for (int i = 0; i < 37; i++)
|
||||
// {
|
||||
// _buffer[i] = toUpper(_buffer[i]);
|
||||
// }
|
||||
// }
|
||||
_buffer[36] = 0;
|
||||
}
|
||||
|
||||
|
||||
char * UUID::toCharArray()
|
||||
{
|
||||
// if (_upperCase)
|
||||
// {
|
||||
// for (int i = 0; i < 37; i++)
|
||||
// {
|
||||
// _buffer[i] = toLower(_buffer[i]);
|
||||
// }
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// for (int i = 0; i < 37; i++)
|
||||
// {
|
||||
// _buffer[i] = toLower(_buffer[i]);
|
||||
// }
|
||||
// }
|
||||
return _buffer;
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
//
|
||||
// MODE
|
||||
//
|
||||
void UUID::setVariant4Mode()
|
||||
{
|
||||
_mode = UUID_MODE_VARIANT4;
|
||||
}
|
||||
|
||||
|
||||
void UUID::setRandomMode()
|
||||
{
|
||||
_mode = UUID_MODE_RANDOM;
|
||||
}
|
||||
|
||||
|
||||
uint8_t UUID::getMode()
|
||||
{
|
||||
return _mode;
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
//
|
||||
// PRINTING
|
||||
//
|
||||
size_t UUID::printTo(Print& p) const
|
||||
{
|
||||
return p.print(_buffer);
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
//
|
||||
// CASE
|
||||
//
|
||||
// void UUID::setLowerCase()
|
||||
// {
|
||||
// _upperCase = false;
|
||||
// }
|
||||
//
|
||||
//
|
||||
// void UUID::setUpperCase()
|
||||
// {
|
||||
// _upperCase = true;
|
||||
// }
|
||||
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
//
|
||||
// PRIVATE
|
||||
//
|
||||
|
||||
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
//
|
||||
// RANDOM GENERATOR MARSAGLIA
|
||||
//
|
||||
// An example of a simple pseudo-random number generator is the
|
||||
// Multiply-with-carry method invented by George Marsaglia.
|
||||
// two initializers (not null)
|
||||
uint32_t UUID::_random()
|
||||
{
|
||||
_m_z = 36969L * (_m_z & 65535L) + (_m_z >> 16);
|
||||
_m_w = 18000L * (_m_w & 65535L) + (_m_w >> 16);
|
||||
return (_m_z << 16) + _m_w; // 32-bit result
|
||||
}
|
||||
|
||||
|
||||
// -- END OF FILE --
|
@ -0,0 +1,75 @@
|
||||
#pragma once
|
||||
//
|
||||
// FILE: UUID.h
|
||||
// AUTHOR: Rob Tillaart
|
||||
// VERSION: 0.1.5
|
||||
// DATE: 2022-06-14
|
||||
// PURPOSE: Arduino Library for generating UUID's
|
||||
// URL: https://github.com/RobTillaart/UUID
|
||||
// https://en.wikipedia.org/wiki/Universally_unique_identifier
|
||||
//
|
||||
// e.g. 20d24650-d900-e34f-de49-8964ab3eb46d
|
||||
|
||||
|
||||
#include "Arduino.h"
|
||||
#include "Printable.h"
|
||||
|
||||
|
||||
#define UUID_LIB_VERSION (F("0.1.5"))
|
||||
|
||||
// TODO an enum?
|
||||
const uint8_t UUID_MODE_VARIANT4 = 0;
|
||||
const uint8_t UUID_MODE_RANDOM = 1;
|
||||
|
||||
|
||||
/////////////////////////////////////////////////
|
||||
//
|
||||
// CLASS VERSION
|
||||
//
|
||||
class UUID : public Printable
|
||||
{
|
||||
public:
|
||||
UUID();
|
||||
|
||||
// at least one seed value is mandatory, two is better.
|
||||
void seed(uint32_t s1, uint32_t s2 = 0);
|
||||
// generate a new UUID
|
||||
void generate();
|
||||
// make a UUID string
|
||||
char * toCharArray();
|
||||
|
||||
// MODE
|
||||
void setVariant4Mode();
|
||||
void setRandomMode();
|
||||
uint8_t getMode();
|
||||
|
||||
// Printable interface
|
||||
size_t printTo(Print& p) const;
|
||||
|
||||
|
||||
// CASE
|
||||
// (experimental code, not tested yet)
|
||||
// lower case is default and according to spec.
|
||||
// upper case is an additional feature.
|
||||
// must it be done at generation or at toCharArray() ?
|
||||
// fast or flex
|
||||
//
|
||||
// void setLowerCase();
|
||||
// void setUpperCase();
|
||||
|
||||
|
||||
private:
|
||||
// Marsaglia 'constants' + function
|
||||
uint32_t _m_w = 1;
|
||||
uint32_t _m_z = 2;
|
||||
uint32_t _random();
|
||||
|
||||
// UUID in string format
|
||||
char _buffer[37];
|
||||
uint8_t _mode = UUID_MODE_VARIANT4;
|
||||
|
||||
// bool _upperCase = false;
|
||||
};
|
||||
|
||||
|
||||
// -- END OF FILE --
|
@ -0,0 +1,18 @@
|
||||
; 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:esp32doit-devkit-v1]
|
||||
platform = espressif32
|
||||
board = esp32doit-devkit-v1
|
||||
framework = arduino
|
||||
monitor_speed = 115200
|
||||
lib_deps =
|
||||
mikem/RadioHead@^1.120
|
||||
rweather/Crypto@^0.4.0
|
@ -0,0 +1,110 @@
|
||||
#include <Arduino.h>
|
||||
#include <WiFi.h>
|
||||
#include <HTTPClient.h>
|
||||
|
||||
#include <ReedSolomonModule.h>
|
||||
#include <MeasureData.h>
|
||||
#include <TransmissionModule.h>
|
||||
#include <TransmitterModule.h>
|
||||
#include <RH_ASK.h>
|
||||
#ifdef RH_HAVE_HARDWARE_SPI
|
||||
#include <SPI.h> // Not actually used but needed to compile
|
||||
#endif
|
||||
|
||||
#include "Uuid.h"
|
||||
|
||||
String serverName = "http://gw.cg.k-lab.su/api/v1/measures/register";
|
||||
|
||||
ReedSolomonModule reedSolomonModule;
|
||||
TransmitterModule transmitterModule;
|
||||
TransmissionModule transmissionModule(transmitterModule, reedSolomonModule);
|
||||
|
||||
UUID uuid;
|
||||
|
||||
const char *ntpServer = "pool.ntp.org";
|
||||
unsigned long epochTime;
|
||||
|
||||
void setup()
|
||||
{
|
||||
Serial.begin(115200);
|
||||
WiFi.mode(WIFI_STA);
|
||||
WiFi.begin("Darius wifi", "alstroemeria");
|
||||
Serial.println("\nConnecting");
|
||||
while (WiFi.status() != WL_CONNECTED)
|
||||
{
|
||||
Serial.print(".");
|
||||
delay(100);
|
||||
}
|
||||
pinMode(LED_BUILTIN, OUTPUT);
|
||||
transmitterModule.init();
|
||||
configTime(0, 0, ntpServer);
|
||||
}
|
||||
|
||||
uint8_t sensor_id;
|
||||
MeasureData measureData;
|
||||
|
||||
unsigned long getTime()
|
||||
{
|
||||
time_t now;
|
||||
struct tm timeinfo;
|
||||
if (!getLocalTime(&timeinfo))
|
||||
{
|
||||
Serial.println("Failed to obtain time");
|
||||
return (0);
|
||||
}
|
||||
time(&now);
|
||||
return now;
|
||||
}
|
||||
|
||||
String getPayload(MeasureData &data)
|
||||
{
|
||||
String serverPath = serverName;
|
||||
serverPath += String("/") + getTime();
|
||||
serverPath += String("/") + data.sensor_id;
|
||||
serverPath += String("/") + WiFi.macAddress();
|
||||
serverPath += String("/") + getTime();
|
||||
if (data.sensor_type == 1) {
|
||||
serverPath += String("/") + "temperature";
|
||||
} else {
|
||||
serverPath += String("/") + data.sensor_type;
|
||||
}
|
||||
serverPath += String("/") + data.payload;
|
||||
return serverPath;
|
||||
}
|
||||
|
||||
bool sendPayload(MeasureData &data) {
|
||||
if (WiFi.status() == WL_CONNECTED) {
|
||||
HTTPClient http;
|
||||
String serverPath = getPayload(data);
|
||||
|
||||
http.begin(serverPath.c_str());
|
||||
int httpResponseCode = http.GET();
|
||||
if (httpResponseCode > 0) {
|
||||
Serial.print("HTTP Response code: ");
|
||||
Serial.println(httpResponseCode);
|
||||
String payload = http.getString();
|
||||
Serial.println(payload);
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
Serial.print("Error code: ");
|
||||
Serial.println(httpResponseCode);
|
||||
}
|
||||
http.end();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
MeasureData data;
|
||||
|
||||
void loop() {
|
||||
if (transmissionModule.receive(sensor_id, data)) {
|
||||
data.sensor_id = sensor_id;
|
||||
data.sensor_type = data.sensor_type;
|
||||
data.payload = data.payload;
|
||||
analogWrite(LED_BUILTIN, 255);
|
||||
sendPayload(data);
|
||||
delay(100);
|
||||
analogWrite(LED_BUILTIN, 0);
|
||||
}
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
#include <Sensors.h>
|
||||
|
||||
|
||||
float Sensor::temperatureSensor(){
|
||||
return analogRead(TEMP_SENS);
|
||||
}
|
||||
|
||||
float Sensor::humiditySensor(){
|
||||
float h = dht->readHumidity();
|
||||
if (isnan(h)) {
|
||||
return -1;
|
||||
}
|
||||
else{
|
||||
return h;
|
||||
}
|
||||
}
|
||||
|
||||
int Sensor::photoSensor(){
|
||||
int value = analogRead(PHOTO_SENS);
|
||||
return value;
|
||||
}
|
||||
|
||||
int Sensor::vibroSensor(){
|
||||
int value = analogRead(VIBRO_SENS);
|
||||
return value;
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,31 @@
|
||||
#pragma once
|
||||
#include "Arduino.h"
|
||||
#include "DHT.h"
|
||||
#include "math.h"
|
||||
|
||||
///////////////////////////////////////////////////////
|
||||
// Pins Definitions
|
||||
///////////////////////////////////////////////////////
|
||||
|
||||
#define HUM_SENS 33
|
||||
#define TEMP_SENS 32
|
||||
#define PHOTO_SENS 25
|
||||
#define VIBRO_SENS 26
|
||||
class Sensor{
|
||||
|
||||
private:
|
||||
//KY-015
|
||||
DHT *dht;
|
||||
|
||||
public:
|
||||
float temperatureSensor();
|
||||
float humiditySensor();
|
||||
int photoSensor();
|
||||
int vibroSensor();
|
||||
|
||||
Sensor()
|
||||
{
|
||||
dht = new DHT(HUM_SENS, DHT11);
|
||||
dht->begin();
|
||||
}
|
||||
};
|
Loading…
Reference in new issue