Skip to content

Commit

Permalink
Merge pull request #22 from BernhardSchlegel/feature/calibration
Browse files Browse the repository at this point in the history
Feature/calibration
  • Loading branch information
BernhardSchlegel authored Oct 18, 2021
2 parents 57da728 + 8a612b5 commit 4f858be
Showing 1 changed file with 138 additions and 116 deletions.
254 changes: 138 additions & 116 deletions ESP8266/src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,11 @@ uint8_t global_warning = 0;
String global_error_text = "";
String global_warning_text = "";
float celsius, fahrenheit;
String sensor_id = "";
String chipid = "";
uint32_t main_interval_ms = 1000; // 1s default intervall for first iteration
uint8_t global_relais_state = 0;
String global_version = "0.9.2";
String global_version = "0.9.4";

void writeStringToEEPROM(int addrOffset, const String &strToWrite)
{
Expand Down Expand Up @@ -155,6 +156,138 @@ void short_flash_500ms(uint8_t count)
}
}

void arrayToString(byte array[], unsigned int len, char buffer[])
{
// source https://stackoverflow.com/questions/44748740/
for (unsigned int i = 0; i < len; i++)
{
byte nib1 = (array[i] >> 4) & 0x0F;
byte nib2 = (array[i] >> 0) & 0x0F;
buffer[i * 2 + 0] = nib1 < 0xA ? '0' + nib1 : 'A' + nib1 - 0xA;
buffer[i * 2 + 1] = nib2 < 0xA ? '0' + nib2 : 'A' + nib2 - 0xA;
}
buffer[len * 2] = '\0';
}

void readTemperature()
{
// put your main code here, to run repeatedly:
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];

if (!ds.search(addr))
{
Serial.println("No more addresses.");
Serial.println();
ds.reset_search();
delay(250);
return;
}

Serial.print("ROM =");
for (i = 0; i < 8; i++)
{
Serial.write(' ');
Serial.print(addr[i], HEX);
}

if (OneWire::crc8(addr, 7) != addr[7])
{
Serial.println("CRC is not valid!");
return;
}
Serial.println();

// the first ROM byte indicates which chip
switch (addr[0])
{
case 0x10:
Serial.println(" Chip = DS18S20"); // or old DS1820
type_s = 1;
break;
case 0x28:
Serial.println(" Chip = DS18B20");
type_s = 0;
break;
case 0x22:
Serial.println(" Chip = DS1822");
type_s = 0;
break;
default:
Serial.println("Device is not a DS18x20 family device.");
return;
}

ds.reset();
ds.select(addr);
ds.write(0x44, 1); // start conversion, with parasite power on at the end

delay(1000); // maybe 750ms is enough, maybe not
// we might do a ds.depower() here, but the reset will take care of it.

present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad

// store sensor id => 8 bytes, one byte needs 2 char + Termination
char buffer[17] = "";
arrayToString(addr, 8, buffer);
sensor_id = String(buffer);

Serial.print(" Data = ");
Serial.print(present, HEX);
Serial.print(" ");
for (i = 0; i < 9; i++)
{ // we need 9 bytes
data[i] = ds.read();
Serial.print(data[i], HEX);
Serial.print(" ");
}
Serial.print(" CRC=");
Serial.print(OneWire::crc8(data, 8), HEX);
Serial.println();

// Convert the data to actual temperature
// because the result is a 16 bit signed integer, it should
// be stored to an "int16_t" type, which is always 16 bits
// even when compiled on a 32 bit processor.
int16_t raw = (data[1] << 8) | data[0];
if (type_s)
{
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10)
{
// "count remain" gives full 12 bit resolution
raw = (raw & 0xFFF0) + 12 - data[6];
}
}
else
{
byte cfg = (data[4] & 0x60);
// at lower res, the low bits are undefined, so let's zero them
if (cfg == 0x00)
raw = raw & ~7; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20)
raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0x40)
raw = raw & ~1; // 11 bit res, 375 ms
//// default is 12 bit resolution, 750 ms conversion time
}
celsius = (float)raw / 16.0;
fahrenheit = celsius * 1.8 + 32.0;
Serial.print(" Temperature = ");
Serial.print(celsius);
Serial.println(" Celsius.");
//Serial.print(fahrenheit);
//Serial.println(" Fahrenheit");

String apikey_restored = readStringFromEEPROM(EEPROM_ADDRESS_APIKEY);
Serial.println("PARAM apikey from EEPROM = " + apikey_restored);
}

void setup()
{
Serial.println("BierBot Brick 101 starting");
Expand Down Expand Up @@ -187,6 +320,9 @@ void setup()

Serial.println("\n Starting");

// read temperature once
readTemperature();

// guid, len 36 + terminator
// e.g. 550e8400-e29b-11d4-a716-446655440000
// test custom html(radio)
Expand Down Expand Up @@ -333,128 +469,14 @@ void checkRequest()
}
}

void readTemperature()
{
// put your main code here, to run repeatedly:
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];

if (!ds.search(addr))
{
Serial.println("No more addresses.");
Serial.println();
ds.reset_search();
delay(250);
return;
}

Serial.print("ROM =");
for (i = 0; i < 8; i++)
{
Serial.write(' ');
Serial.print(addr[i], HEX);
}

if (OneWire::crc8(addr, 7) != addr[7])
{
Serial.println("CRC is not valid!");
return;
}
Serial.println();

// the first ROM byte indicates which chip
switch (addr[0])
{
case 0x10:
Serial.println(" Chip = DS18S20"); // or old DS1820
type_s = 1;
break;
case 0x28:
Serial.println(" Chip = DS18B20");
type_s = 0;
break;
case 0x22:
Serial.println(" Chip = DS1822");
type_s = 0;
break;
default:
Serial.println("Device is not a DS18x20 family device.");
return;
}

ds.reset();
ds.select(addr);
ds.write(0x44, 1); // start conversion, with parasite power on at the end

delay(1000); // maybe 750ms is enough, maybe not
// we might do a ds.depower() here, but the reset will take care of it.

present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad

Serial.print(" Data = ");
Serial.print(present, HEX);
Serial.print(" ");
for (i = 0; i < 9; i++)
{ // we need 9 bytes
data[i] = ds.read();
Serial.print(data[i], HEX);
Serial.print(" ");
}
Serial.print(" CRC=");
Serial.print(OneWire::crc8(data, 8), HEX);
Serial.println();

// Convert the data to actual temperature
// because the result is a 16 bit signed integer, it should
// be stored to an "int16_t" type, which is always 16 bits
// even when compiled on a 32 bit processor.
int16_t raw = (data[1] << 8) | data[0];
if (type_s)
{
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10)
{
// "count remain" gives full 12 bit resolution
raw = (raw & 0xFFF0) + 12 - data[6];
}
}
else
{
byte cfg = (data[4] & 0x60);
// at lower res, the low bits are undefined, so let's zero them
if (cfg == 0x00)
raw = raw & ~7; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20)
raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0x40)
raw = raw & ~1; // 11 bit res, 375 ms
//// default is 12 bit resolution, 750 ms conversion time
}
celsius = (float)raw / 16.0;
fahrenheit = celsius * 1.8 + 32.0;
Serial.print(" Temperature = ");
Serial.print(celsius);
Serial.println(" Celsius.");
//Serial.print(fahrenheit);
//Serial.println(" Fahrenheit");

String apikey_restored = readStringFromEEPROM(EEPROM_ADDRESS_APIKEY);
Serial.println("PARAM apikey from EEPROM = " + apikey_restored);
}

void contactBackend()
{
if (1 == 1)
{ // WiFi.status() == WL_CONNECTED) { //Check WiFi connection status
String apikey_restored = readStringFromEEPROM(EEPROM_ADDRESS_APIKEY);
String temp = String(celsius);
String relais = String(global_relais_state);
String url = "https://bricks.bierbot.com/api/iot/v1?apikey=" + apikey_restored + "&type=" + "sonoff_th16" + "&brand=" + "bierbot" + "&version=" + global_version + "&s_number_temp_0=" + temp + "&a_bool_epower_0=" + relais + "&chipid=" + chipid; // + "&temp=" + temp + "&type=" + "sonoff_th16" + "&version=" + global_version
String url = "https://bricks.bierbot.com/api/iot/v1?apikey=" + apikey_restored + "&type=" + "sonoff_th16" + "&brand=" + "bierbot" + "&version=" + global_version + "&s_number_temp_0=" + temp + "&a_bool_epower_0=" + relais + "&chipid=" + chipid + "&s_number_temp_id_0=" + sensor_id;

Serial.print("s_number_temp_0=" + temp);
Serial.println(", a_bool_epower_0=" + relais);
Expand Down

0 comments on commit 4f858be

Please sign in to comment.