Merge pull request #210 from biveraxe/ver4dev

Делаем поиск адреса I2C устройств более удобным
This commit is contained in:
2022-10-10 22:55:57 +03:00
committed by GitHub
6 changed files with 40 additions and 33 deletions

View File

@@ -40,4 +40,4 @@ boolean isDigitDotCommaStr(const String& str);
String prettyBytes(size_t size); String prettyBytes(size_t size);
String uint64ToString(uint64_t input); String uint64ToString(uint64_t input, uint8_t base = 10);

View File

@@ -15,16 +15,17 @@ class Lcd2004 : public IoTItem {
String _id2show; String _id2show;
String _descr; String _descr;
int _prevStrSize; int _prevStrSize;
String _addr;
bool _isShow = true; // экран показывает bool _isShow = true; // экран показывает
public: public:
Lcd2004(String parameters) : IoTItem(parameters) { Lcd2004(String parameters) : IoTItem(parameters) {
String addr, size, xy; String size, xy;
_prevStrSize = 0; _prevStrSize = 0;
jsonRead(parameters, "addr", addr); jsonRead(parameters, "addr", _addr);
if (addr == "") { if (_addr == "") {
scanI2C(); scanI2C();
return; return;
} }
@@ -33,7 +34,7 @@ class Lcd2004 : public IoTItem {
int w = selectFromMarkerToMarker(size, ",", 0).toInt(); //количество столбцов int w = selectFromMarkerToMarker(size, ",", 0).toInt(); //количество столбцов
int h = selectFromMarkerToMarker(size, ",", 1).toInt(); //количество строк int h = selectFromMarkerToMarker(size, ",", 1).toInt(); //количество строк
if (LCDI2C == nullptr) { //инициализации экрана еще не было if (LCDI2C == nullptr) { //инициализации экрана еще не было
LCDI2C = new LiquidCrystal_I2C(hexStringToUint8(addr), w, h); LCDI2C = new LiquidCrystal_I2C(hexStringToUint8(_addr), w, h);
if (LCDI2C != nullptr) { if (LCDI2C != nullptr) {
LCDI2C->init(); LCDI2C->init();
} }
@@ -62,6 +63,8 @@ class Lcd2004 : public IoTItem {
//LCDI2C->print("Helloy,Manager 404 !"); //LCDI2C->print("Helloy,Manager 404 !");
//Serial.printf("ffff %s\n", _id2show); //Serial.printf("ffff %s\n", _id2show);
_prevStrSize = tmpStr.length(); _prevStrSize = tmpStr.length();
} else {
scanI2C();
} }
} }

View File

@@ -3,8 +3,6 @@
#include "classes/IoTGpio.h" #include "classes/IoTGpio.h"
#include <Adafruit_MCP23X17.h> #include <Adafruit_MCP23X17.h>
void scanI2C();
class Mcp23017Driver : public IoTGpio { class Mcp23017Driver : public IoTGpio {
private: private:
Adafruit_MCP23X17 _mcp; Adafruit_MCP23X17 _mcp;
@@ -39,14 +37,14 @@ class Mcp23017Driver : public IoTGpio {
class Mcp23017 : public IoTItem { class Mcp23017 : public IoTItem {
private: private:
Mcp23017Driver* _driver; Mcp23017Driver* _driver;
String _addr;
public: public:
Mcp23017(String parameters) : IoTItem(parameters) { Mcp23017(String parameters) : IoTItem(parameters) {
_driver = nullptr; _driver = nullptr;
String addr; jsonRead(parameters, "addr", _addr);
jsonRead(parameters, "addr", addr); if (_addr == "") {
if (addr == "") {
scanI2C(); scanI2C();
return; return;
} }
@@ -58,10 +56,15 @@ class Mcp23017 : public IoTItem {
return; return;
} }
_driver = new Mcp23017Driver(index, addr); _driver = new Mcp23017Driver(index, _addr);
} }
void doByInterval() {} void doByInterval() {
if (_addr == "") {
scanI2C();
return;
}
}
//возвращает ссылку на экземпляр класса Mcp23017Driver //возвращает ссылку на экземпляр класса Mcp23017Driver
IoTGpio* getGpioDriver() { IoTGpio* getGpioDriver() {

View File

@@ -93,14 +93,14 @@ class Pcf8574Driver : public IoTGpio {
class Pcf8574 : public IoTItem { class Pcf8574 : public IoTItem {
private: private:
Pcf8574Driver* _driver; Pcf8574Driver* _driver;
String _addr;
public: public:
Pcf8574(String parameters) : IoTItem(parameters) { Pcf8574(String parameters) : IoTItem(parameters) {
_driver = nullptr; _driver = nullptr;
String addr; jsonRead(parameters, "addr", _addr);
jsonRead(parameters, "addr", addr); if (_addr == "") {
if (addr == "") {
scanI2C(); scanI2C();
return; return;
} }
@@ -112,10 +112,15 @@ class Pcf8574 : public IoTItem {
return; return;
} }
_driver = new Pcf8574Driver(index, addr); _driver = new Pcf8574Driver(index, _addr);
} }
void doByInterval() {} void doByInterval() {
if (_addr == "") {
scanI2C();
return;
}
}
//возвращает ссылку на экземпляр класса Pcf8574Driver //возвращает ссылку на экземпляр класса Pcf8574Driver
IoTGpio* getGpioDriver() { IoTGpio* getGpioDriver() {

View File

@@ -4,8 +4,7 @@
void scanI2C() { void scanI2C() {
byte error, address; byte error, address;
int nDevices; int nDevices;
String message = "";
Serial.println("Scanning...");
nDevices = 0; nDevices = 0;
for(address = 8; address < 127; address++ ) { for(address = 8; address < 127; address++ ) {
@@ -13,23 +12,21 @@ void scanI2C() {
error = Wire.endTransmission(); error = Wire.endTransmission();
if (error == 0){ if (error == 0){
Serial.print("I2C device found at address 0x"); message += "I2C device found at address 0x";
if (address<16) message += uint64ToString(address, 16);
Serial.print("0"); message += " !";
Serial.print(address,HEX);
Serial.println(" !");
nDevices++; nDevices++;
} }
else if (error==4) { else if (error==4) {
Serial.print("Unknow error at address 0x"); message += "Unknow error at address 0x";
if (address<16) message += uint64ToString(address, 16);
Serial.print("0");
Serial.println(address,HEX);
} }
} }
if (nDevices == 0) if (nDevices == 0)
Serial.println("No I2C devices found\n"); message += "No I2C devices found\n";
else else
Serial.println("done\n"); message += "done\n";
SerialPrint("i", "I2C Scaner", message);
} }

View File

@@ -183,9 +183,8 @@ String prettyBytes(size_t size) {
return String(size / 1024.0 / 1024.0 / 1024.0) + "GB"; return String(size / 1024.0 / 1024.0 / 1024.0) + "GB";
} }
String uint64ToString(uint64_t input) { String uint64ToString(uint64_t input, uint8_t base) {
String result = ""; String result = "";
uint8_t base = 10;
do { do {
char c = input % base; char c = input % base;