Merge pull request #10 from livello/patch

refactoring. help cmd improved. Removed newline from freeMem periodic…
This commit is contained in:
2018-03-26 03:06:58 +03:00
committed by GitHub
13 changed files with 1466 additions and 1348 deletions

111
README.md
View File

@@ -1,7 +1,7 @@
# LightHub
is Flexible, Arduino-Mega/Arduino DUE/ESP8266 based SmartHome controller
is Flexible, Arduino-Mega/Arduino DUE/ESP8266 based SmartHome controller. [RU](https://geektimes.ru/post/295109/)
It allow to connect together:
It allows connecting together:
* Contact sensors (switches, buttons etc)
* 1-Wire temperature sensors (up to 20 on single bus)
@@ -12,24 +12,25 @@ It allow to connect together:
Where is possible both, to configure local control/mapping between inputs and outputs (light, floor heating thermostats) and remote control from Openhab or Openhab2 Smarthome software
Scalability is virtually unlimited: Setup so many controllers you needed in most convenient places of your house - MQTT broker will allow controllers communicate each other and with Openhab and propagate commands across network
Scalability is virtually unlimited: Setup so many controllers you needed in most convenient places of your house - MQTT broker will allow controllers communicate each other and with Openhab and propagate commands across network.
Prease refer our Wiki for insructions.
[Prease refer to our Wiki for insructions.](https://github.com/anklimov/lighthub/wiki/Configuring)
Finished portation of proejct to Arduino DUE and ESP8266 (ESP32 not tested)
Finished portation of project to Arduino DUE and ESP8266 (ESP32 not tested).
Compiled image has been added to compiled/ folder
use
Compiled image has been added to [compiled/](https://github.com/anklimov/lighthub/tree/master/compiled) folder. Flash your Mega 2560
```bash
avrdude -v -V -patmega2560 -cwiring -b115200 -D -Uflash:w:lighthub.ino.hex:i
to flash your Mega 2560
or
```
or flash your DUE (need to correct path and port, of course)
```bash
/Users/<user>/Library/Arduino15/packages/arduino/tools/bossac/1.6.1-arduino/bossac -i -d --port=cu.usbmodem1451 -U false -e -w -v -b lighthub.ino.bin -R
to flash your DUE
```
(need to correct path and port, of course)
# Dependences
# Dependencies
(quite big number of libs required. Use git clone to have your local copy in your Arduino libs folder)
Please check updates for all dependences.
@@ -39,7 +40,7 @@ For patched libraries, appropriate GitHub repo URL provided:
* DS2482_OneWire https://github.com/anklimov/DS2482_OneWire
* FastLED
* Wire (standard)
* Artnet https://github.com/anklimov/Artnet.git
* Artnet https://github.com/anklimov/Artnet.git
* DmxSimple https://github.com/anklimov/DmxSimple (for AVR) or https://github.com/anklimov/ESP-Dmx (for ESP) or https://github.com/anklimov/DmxDue (for DUE)
* HTTPClient (for AVR) https://github.com/anklimov/HTTPClient or https://github.com/arduino-libraries/ArduinoHttpClient for other platforms
* aJson https://github.com/anklimov/aJson
@@ -55,24 +56,24 @@ Portation from AVR Mega 2560 to SAM3X8E (Arduino DUE) done since v 0.96
# Platforms specific details:
AVR version is basic and have all functions
AVR version is basic and has all functions
*DMX-out is software (DMXSimple) on pin3
SAM3X8E:
*default PWM frequency
*both, DMX-in and DMX-out are hardware USART based. Use USART1 (pins 18 and 19) for DMX-out and DMX-in
**SAM3X8E**:
* default PWM frequency
* both, DMX-in and DMX-out are hardware USART based. Use USART1 (pins 18 and 19) for DMX-out and DMX-in
ESP:
*DMX-OUT on USART1 TX
*DMX-IN - not possible to deploy in ESP8266
*Modbus - disabled. Might be configured in future on USART0 instead CLI/DEBUG
**ESP8266**:
* DMX-OUT on USART1 TX
* DMX-IN - not possible to deploy in ESP8266
* Modbus - disabled. Might be configured in future on USART0 instead CLI/DEBUG
since v. 0.97:
There is first attempt to use Wiznet 5500 (still not stable enough)
Need to use compiler directive -D Wiz5500 and https://github.com/anklimov/Ethernet2 library
First attempt to use platformio toolchain for compiling (work not completed yet)
Prefered way to compile project is using platformio toolchain, suitable for Arduino Due, and Arduino Mega2560, but work is still in progress.
# Due compilation issue "USART0_Handler redefinition"
Please, open /variants/arduino_due_x/variant.cpp file, then edit USART0_Handler method definition like this
@@ -80,31 +81,60 @@ Please, open /variants/arduino_due_x/variant.cpp file, then edit USART0_Handler
void USART0_Handler(void) __attribute__((weak));
# Platformio command line build instructions
First of all install platformio framework. http://docs.platformio.org/en/latest/installation.html
[First of all install platformio framework.]( http://docs.platformio.org/en/latest/installation.html) [Good tutorial for fast start in RUSSIAN.](https://geektimes.ru/post/273852/)
https://geektimes.ru/post/273852/ // Good tutorial for fast start in RUSSIAN
In linux\macOS you can open terminal, navigate to your programming directory, then
In linux you can open terminal, navigate to your programming directory, then
* git clone https://github.com/anklimov/lighthub.git
* cd lighthub
* pio init --ide clion // use your IDE, others here: http://docs.platformio.org/en/latest/ide.html
* pio run -e due // this will build firmware for arduino due board
* rm -Rf .piolibdeps // this will clean libraries folder. Try it if you have compilation problem
* pio run -e megaatmega2560 //build for arduino mega
* pio run -e due -t upload //build and upload firmware to arduino due
```bash
git clone https://github.com/anklimov/lighthub.git
cd lighthub
```
now prepare project files for your IDE
```bash
pio init --ide [atom|clion|codeblocks|eclipse|emacs|netbeans|qtcreator|sublimetext|vim|visualstudio|vscode]
```
Set custom build flags. first make your own copy of template
```bash
cp build_flags_template.sh my_build_flags.sh
```
then edit, change or comment unnecessary sections and source it
```bash
nano my_build_flags.sh
source my_build_flags.sh
```
build and upload firmware for due|megaatmega2560|esp8266 board
```bash
pio run -e due|megaatmega2560|esp8266 -t upload
```
Clean pio libraries folder. Try it if you have compilation problem:
```bash
rm -Rf .piolibdeps
```
open COM-port monitor with specified baud rate
```bash
platformio device monitor -b 115200
```
# Custom build flags
* MY_CONFIG_SERVER=192.168.1.1 // address of external JSON-config http://192.168.1.1/de-ad-be-ef-fe-00.config.json
* WATCH_DOG_TICKER_DISABLE=1 //disable wdt feature
* USE_1W_PIN=49 // use direct connection to 1W devices, no I2C bridge DS2482-100
* SD_CARD_INSERTED=1 // enable sd-card support and fix lan starting
* WATCH_DOG_TICKER_DISABLE //disable wdt feature
* USE_1W_PIN=49 // use direct connection to 1W devices on 49 pin, no I2C bridge DS2482-100
* SD_CARD_INSERTED // enable sd-card support and fix lan starting
* SERIAL_BAUD=115200 // set baud rate for console on Serial0
* Wiz5500 //Use Wiznet 5500 library instead Wiznet 5100
* DISABLE_FREERAM_PRINT // disable printing free Ram in bytes
* CUSTOM_FIRMWARE_MAC=de:ad:be:ef:fe:00 //set firmware macaddress
* DMX_DISABLE //disable DMX support
* MODBUS_DISABLE // disable Modbus support
* OWIRE_DISABLE // disable OneWire support
Look at build_flags_template.sh for customizing.
=======
export PLATFORMIO_BUILD_FLAGS="-DMY_CONFIG_SERVER=192.168.1.1 -DWATCH_DOG_TICKER_DISABLE=1 -DUSE_1W_PIN=49 -DSERIAL_BAUD=115200 -DSD_CARD_INSERTED=1"
# Default compilation behavior:
* Config server: lazyhome.ru
* Watchdog enabled
@@ -112,3 +142,10 @@ export PLATFORMIO_BUILD_FLAGS="-DMY_CONFIG_SERVER=192.168.1.1 -DWATCH_DOG_TICKER
* No SD
* Serial speed 115200
* Wiznet 5100 (for MEGA & DUE)
* Free Ram printing enabled
* de:ad:be:ef:fe:00
* DMX support enabled
* Modbus support enabled
* OneWire support enabled
=======

21
build_flags_template.sh Normal file
View File

@@ -0,0 +1,21 @@
#! /bin/bash
# usage:
# first make your own copy of template
# cp build_flags_template.sh my_build_flags.sh
# then edit, change or comment something
# nano my_build_flags.sh
# and source it
# source my_build_flags.sh
export FLAGS="-DMY_CONFIG_SERVER=lazyhome.ru"
export FLAGS="$FLAGS -DWATCH_DOG_TICKER_DISABLE"
export FLAGS="$FLAGS -DUSE_1W_PIN=12"
export FLAGS="$FLAGS -DSD_CARD_INSERTED"
export FLAGS="$FLAGS -DSERIAL_BAUD=115200"
export FLAGS="$FLAGS -DWiz5500"
export FLAGS="$FLAGS -DDISABLE_FREERAM_PRINT"
export FLAGS="$FLAGS -DCUSTOM_FIRMWARE_MAC=de:ad:be:ef:fe:00"
export FLAGS="$FLAGS -DDMX_DISABLE"
export FLAGS="$FLAGS -DMODBUS_DISABLE"
export FLAGS="$FLAGS -DOWIRE_DISABLE"
export PLATFORMIO_BUILD_FLAGS="$FLAGS"
unset FLAGS

View File

@@ -23,7 +23,7 @@ e-mail anklimov@gmail.com
#include "item.h"
#include <PubSubClient.h>
extern PubSubClient client;
extern PubSubClient mqttClient;
Input::Input(char * name) //Constructor
{
@@ -80,7 +80,7 @@ void Input::Parse()
}
}
int Input::Pool ()
int Input::Poll()
{
boolean v;
if (!isValid()) return -1;
@@ -121,11 +121,11 @@ void Input::Changed (int val)
if (val)
{ //send set command
if (!scmd) client.publish(emit->valuestring,"ON"); else if (strlen(scmd->valuestring)) client.publish(emit->valuestring,scmd->valuestring);
if (!scmd) mqttClient.publish(emit->valuestring,"ON"); else if (strlen(scmd->valuestring)) mqttClient.publish(emit->valuestring,scmd->valuestring);
}
else
{ //send reset command
if (!rcmd) client.publish(emit->valuestring,"OFF"); else if (strlen(rcmd->valuestring)) client.publish(emit->valuestring,rcmd->valuestring);
if (!rcmd) mqttClient.publish(emit->valuestring,"OFF"); else if (strlen(rcmd->valuestring)) mqttClient.publish(emit->valuestring,rcmd->valuestring);
}
}

View File

@@ -87,7 +87,7 @@ class Input
boolean isValid ();
void Changed (int val);
int Pool ();
int Poll();
protected:
void Parse();
};

File diff suppressed because it is too large Load Diff

View File

@@ -85,7 +85,7 @@ class Item
inline int On (){Ctrl(CMD_ON);};
inline int Off(){Ctrl(CMD_OFF);};
inline int Toggle(){Ctrl(CMD_TOGGLE);};
int Pool ();
int Poll();
int SendCmd(short cmd,short n=0, int * Par=NULL);
protected:

File diff suppressed because it is too large Load Diff

View File

@@ -5,11 +5,16 @@
#ifndef LIGHTHUB_MAIN_H
#define LIGHTHUB_MAIN_H
#define TXEnablePin 13
#ifndef SERIAL_BAUD
#define SERIAL_BAUD 115200
#endif
#ifndef CUSTOM_FIRMWARE_MAC
#define FIRMWARE_MAC {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0}
#endif
#include "Arduino.h"
#include "DallasTemperature.h"
@@ -25,14 +30,14 @@ void Changed (int i, DeviceAddress addr, int val);
void modbusIdle(void);
void _handleHelp(int arg_cnt, char **args);
void _kill(int arg_cnt, char **args);
void parseConfig();
void applyConfig();
void _loadConfig (int arg_cnt, char **args);
int loadConfig (int arg_cnt, char **args);
void _mqttConfigReq (int arg_cnt, char **args);
int mqttConfigReq (int arg_cnt, char **args);
int loadConfigFromEEPROM(int arg_cnt, char **args);
void _mqttConfigRequest(int arg_cnt, char **args);
int mqttConfigRequest(int arg_cnt, char **args);
int mqttConfigResp (char * as);
void _saveConfig(int arg_cnt, char **args);
void _setConfig(int arg_cnt, char **args);
void _saveConfigToEEPROM(int arg_cnt, char **args);
void _setMacAddress(int arg_cnt, char **args);
void _getConfig(int arg_cnt, char **args);
void printBool (bool arg);
void saveFlash(short n, char* str);

View File

@@ -1,8 +1,17 @@
// Configuration of drivers enabled
#ifndef DMX_DISABLE
#define _dmxin
#define _dmxout
#endif
#ifndef OWIRE_DISABLE
#define _owire
#endif
#ifndef MODBUS_DISABLE
#define _modbus
#endif
#define _artnet
#if defined(ESP8266)

View File

@@ -22,67 +22,74 @@ e-mail anklimov@gmail.com
#include "owTerm.h"
#include <Arduino.h>
#include "utils.h"
#include "options.h"
OneWire *net = NULL;
// Pass our oneWire reference to Dallas Temperature.
//DallasTemperature sensors(&net);
DeviceAddress *term = NULL;
DeviceAddress *term = NULL;
//int *regs = NULL;
uint16_t *wstat = NULL;
uint16_t *wstat = NULL;
DallasTemperature *sensors = NULL;
short si=0;
short si = 0;
int t_count = 0;
unsigned long owTimer=0;
unsigned long owTimer = 0;
owChangedType owChanged;
owChangedType owChanged;
int owUpdate()
{
unsigned long finish = millis() + 5000;
short sr;
int owUpdate() {
unsigned long finish = millis() + 5000;
short sr;
//net.setStrongPullup();
Serial.println(F("Searching"));
if (net) net->reset_search();
for (short i=0;i<t_count;i++) wstat[i]&=~SW_FIND; //absent
//net.setStrongPullup();
Serial.println(F("Searching"));
if (net) net->reset_search();
for (short i = 0; i < t_count; i++) wstat[i] &= ~SW_FIND; //absent
while (net && net->wireSearch(term[t_count])>0 && (t_count<t_max) && finish > millis ())
{ short ifind=-1;
if (net->crc8(term[t_count], 7) == term[t_count][7])
{
for (short i=0;i<t_count;i++) if (!memcmp(term[i],term[t_count],8)) {ifind=i;wstat[i]|=SW_FIND;
Serial.print(F(" Node:"));PrintBytes(term[t_count],8);Serial.println(F(" alive"));
break;}; //alive
if (ifind<0 && sensors)
{
wstat[t_count]=SW_FIND; //Newly detected
Serial.print(F("dev#"));Serial.print(t_count);Serial.print(F(" Addr:"));PrintBytes(term[t_count],8);
Serial.println();
if (term[t_count][0]==0x28)
{
while (net && net->wireSearch(term[t_count]) > 0 && (t_count < t_max) && finish > millis()) {
short ifind = -1;
if (net->crc8(term[t_count], 7) == term[t_count][7]) {
for (short i = 0; i < t_count; i++)
if (!memcmp(term[i], term[t_count], 8)) {
ifind = i;
wstat[i] |= SW_FIND;
Serial.print(F(" Node:"));
PrintBytes(term[t_count], 8);
Serial.println(F(" alive"));
break;
}; //alive
if (ifind < 0 && sensors) {
wstat[t_count] = SW_FIND; //Newly detected
Serial.print(F("dev#"));
Serial.print(t_count);
Serial.print(F(" Addr:"));
PrintBytes(term[t_count], 8);
Serial.println();
if (term[t_count][0] == 0x28) {
sensors->setResolution(term[t_count], TEMPERATURE_PRECISION);
net->setStrongPullup();
// sensors.requestTemperaturesByAddress(term[t_count]);
}
t_count++;}
}//if
} //while
// sensors.requestTemperaturesByAddress(term[t_count]);
}
t_count++;
}
}//if
} //while
Serial.print(F("1-wire count: "));
Serial.println(t_count);
Serial.print(F("1-wire count: "));
Serial.println(t_count);
}
int owSetup(owChangedType owCh) {
//// todo - move memory allocation to here
//// todo - move memory allocation to here
#ifdef DS2482_100_I2C_TO_1W_BRIDGE
Serial.println(F("DS2482_100_I2C_TO_1W_BRIDGE init"));
net = new OneWire;
net = new OneWire;
#else
Serial.print(F("One wire setup on PIN:"));
Serial.println(QUOTE(USE_1W_PIN));
@@ -92,110 +99,104 @@ net = new OneWire (USE_1W_PIN);
// Pass our oneWire reference to Dallas Temperature.
sensors = new DallasTemperature (net);
sensors = new DallasTemperature(net);
term = new DeviceAddress[t_max];
term = new DeviceAddress[t_max];
//regs = new int [t_max];
wstat = new uint16_t [t_max];
wstat = new uint16_t[t_max];
#ifdef DS2482_100_I2C_TO_1W_BRIDGE
Wire.begin();
if (net->checkPresence()) {
Serial.println(F("DS2482-100 present"));
net->deviceReset();
#ifdef APU_OFF
Serial.println(F("APU off"));
#else
net->setActivePullup();
#endif
#ifdef DS2482_100_I2C_TO_1W_BRIDGE
Wire.begin();
if (net->checkPresence())
{
Serial.println(F("DS2482-100 present"));
net->deviceReset();
#ifdef APU_OFF
Serial.println(F("APU off"));
#else
net->setActivePullup();
#endif
Serial.println(F("\tChecking for 1-Wire devices..."));
if (net->wireReset())
Serial.println(F("\tReset done"));
Serial.println(F("\tChecking for 1-Wire devices..."));
if (net->wireReset())
Serial.println(F("\tReset done"));
sensors->begin();
owChanged=owCh;
//owUpdate();
//Serial.println(F("\t1-w Updated"));
sensors->setWaitForConversion(false);
sensors->begin();
owChanged = owCh;
//owUpdate();
//Serial.println(F("\t1-w Updated"));
sensors->setWaitForConversion(false);
return true;
}
#endif
return true;
}
#endif
return false;
// IC Default 9 bit. If you have troubles consider upping it 12. Ups the delay giving the IC more time to process the temperature measurement
return false;
// IC Default 9 bit. If you have troubles consider upping it 12. Ups the delay giving the IC more time to process the temperature measurement
delay(500);
delay(500);
}
int sensors_loop(void)
{
if (!sensors) return -1;
if (si>=t_count)
{
owUpdate(); //every check circle - scan for new devices
si=0;
return 8000;
}
int sensors_loop(void) {
if (!sensors) return -1;
if (si >= t_count) {
owUpdate(); //every check circle - scan for new devices
si = 0;
return 8000;
}
int t;
switch (term[si][0]){
int t;
switch (term[si][0]) {
case 0x28: // Thermomerer
t=sensors->getTempC(term[si]);//*10.0;
//Serial.println("o");
if (owChanged) owChanged(si,term[si],t);
sensors->requestTemperaturesByAddress(term[si]);
si++;
return 2500;
case 0x28: // Thermomerer
t = sensors->getTempC(term[si]);//*10.0;
//Serial.println("o");
if (owChanged) owChanged(si, term[si], t);
sensors->requestTemperaturesByAddress(term[si]);
si++;
return 2500;
// default
// return sensors_ext();
} //switch
// default
// return sensors_ext();
} //switch
si++;
return check_circle;
si++;
return check_circle;
}
void owLoop()
{
if (millis() >=owTimer) owTimer=millis()+sensors_loop();
void owLoop() {
if (millis() >= owTimer) owTimer = millis() + sensors_loop();
}
int owFind(DeviceAddress addr)
{
for (short i=0;i<t_count;i++) if (!memcmp(term[i],addr,8)) return i;//find
return -1;
int owFind(DeviceAddress addr) {
for (short i = 0; i < t_count; i++) if (!memcmp(term[i], addr, 8)) return i;//find
return -1;
}
void owAdd (DeviceAddress addr)
{
wstat[t_count]=SW_FIND; //Newly detected
memcpy (term[t_count],addr,8);
//term[t_count]=addr;
void owAdd(DeviceAddress addr) {
wstat[t_count] = SW_FIND; //Newly detected
memcpy(term[t_count], addr, 8);
//term[t_count]=addr;
Serial.print(F("dev#"));Serial.print(t_count);Serial.print(F(" Addr:"));PrintBytes(term[t_count],8);
Serial.println();
if (term[t_count][0]==0x28)
{
sensors->setResolution(term[t_count], TEMPERATURE_PRECISION);
net->setStrongPullup();
// sensors.requestTemperaturesByAddress(term[t_count]);
}
t_count++;
Serial.print(F("dev#"));
Serial.print(t_count);
Serial.print(F(" Addr:"));
PrintBytes(term[t_count], 8);
Serial.println();
if (term[t_count][0] == 0x28) {
sensors->setResolution(term[t_count], TEMPERATURE_PRECISION);
net->setStrongPullup();
// sensors.requestTemperaturesByAddress(term[t_count]);
}
t_count++;
}

View File

@@ -19,6 +19,7 @@ e-mail anklimov@gmail.com
*/
#include "utils.h"
#if defined(__SAM3X8E__)
#include <malloc.h>
#endif
@@ -29,53 +30,52 @@ extern "C" {
}
#endif
void PrintBytes(uint8_t* addr, uint8_t count, bool newline) {
for (uint8_t i = 0; i < count; i++) {
Serial.print(addr[i]>>4, HEX);
Serial.print(addr[i]&0x0f, HEX);
}
if (newline)
Serial.println();
void PrintBytes(uint8_t *addr, uint8_t count, bool newline) {
for (uint8_t i = 0; i < count; i++) {
Serial.print(addr[i] >> 4, HEX);
Serial.print(addr[i] & 0x0f, HEX);
}
if (newline)
Serial.println();
}
const char HEXSTR[]="0123456789ABCDEF";
const char HEXSTR[] = "0123456789ABCDEF";
void SetBytes(uint8_t* addr, uint8_t count, char * out) {
// Serial.println("SB:");
for (uint8_t i = 0; i < count; i++) {
*(out++)=HEXSTR[(addr[i]>>4)];
*(out++)=HEXSTR[(addr[i]&0x0f)];
}
*out=0;
void SetBytes(uint8_t *addr, uint8_t count, char *out) {
// Serial.println("SB:");
for (uint8_t i = 0; i < count; i++) {
*(out++) = HEXSTR[(addr[i] >> 4)];
*(out++) = HEXSTR[(addr[i] & 0x0f)];
}
*out = 0;
}
byte HEX2DEC(char i)
{ byte v;
if ('a' <= i && i <='f') { v=i-97+10; }
else if ('A' <= i && i <='F') { v=i-65+10; }
else if ('0' <= i && i <='9') { v=i-48; }
return v;
}
byte HEX2DEC(char i) {
byte v;
if ('a' <= i && i <= 'f') { v = i - 97 + 10; }
else if ('A' <= i && i <= 'F') { v = i - 65 + 10; }
else if ('0' <= i && i <= '9') { v = i - 48; }
return v;
}
void SetAddr(char * out, uint8_t* addr) {
void SetAddr(char *out, uint8_t *addr) {
for (uint8_t i = 0; i < 8; i++) {
*addr=HEX2DEC(*out++)<<4;
*addr++|=HEX2DEC(*out++);
}
for (uint8_t i = 0; i < 8; i++) {
*addr = HEX2DEC(*out++) << 4;
*addr++ |= HEX2DEC(*out++);
}
}
int getInt(char ** chan)
{
int ch = atoi(*chan);
*chan=strchr(*chan,',');
int getInt(char **chan) {
int ch = atoi(*chan);
*chan = strchr(*chan, ',');
if (*chan) *chan+=1;
//Serial.print(F("Par:")); Serial.println(ch);
return ch;
if (*chan) *chan += 1;
//Serial.print(F("Par:")); Serial.println(ch);
return ch;
}
@@ -98,14 +98,25 @@ unsigned long freeRam ()
extern char _end;
extern "C" char *sbrk(int i);
unsigned long freeRam()
{
char *ramstart = (char *) 0x20070000;
char *ramend = (char *) 0x20088000;
char *heapend = sbrk(0);
register char * stack_ptr asm( "sp" );
struct mallinfo mi = mallinfo();
unsigned long freeRam() {
char *ramstart = (char *) 0x20070000;
char *ramend = (char *) 0x20088000;
char *heapend = sbrk(0);
register char *stack_ptr asm( "sp" );
struct mallinfo mi = mallinfo();
return stack_ptr - heapend + mi.fordblks;
return stack_ptr - heapend + mi.fordblks;
}
#endif
void parseBytes(const char *str, char separator, byte *bytes, int maxBytes, int base) {
for (int i = 0; i < maxBytes; i++) {
bytes[i] = strtoul(str, NULL, base); // Convert byte
str = strchr(str, separator); // Find next separator
if (str == NULL || *str == '\0') {
break; // No more separators, exit
}
str++; // Point to next character after separator
}
}
#endif

View File

@@ -25,3 +25,4 @@ void SetAddr(char * out, uint8_t* addr);
uint8_t HEX2DEC(char i);
int getInt(char ** chan);
unsigned long freeRam ();
void parseBytes(const char* str, char separator, byte* bytes, int maxBytes, int base);

View File

@@ -11,7 +11,8 @@
src_dir = lighthub
env_default =
; megaatmega2560
due
due
; esp8266
[env:due]
platform = atmelsam
@@ -101,7 +102,7 @@ lib_deps =
https://github.com/anklimov/Artnet.git
FastLED
[env:espressif8266]
[env:esp8266]
platform = espressif8266
framework = arduino
board = nodemcuv2