Как прочитать EEPROM до модуля setup

servilat
Offline
Зарегистрирован: 12.12.2013

День добрый.

нужно прочитать настройки шины модбаз инициализировав ее до модуля setup. часть кода

#include <EEPROM.h>

#include <ModbusRtu.h>
int SerialBaud = 9600;
const byte pin_out_rs485 = 4;
byte rs485_address;

rs485_address = EEPROM.read(2); // аддрес устройства на шине rs485
SerialBaud = EEPROM.read(3); // аддрес устройства на шине rs485 доступно только 300, 1200, 2400, 4800, 19200, 38400, 57600.

void setup() {




}

Как это сделать и возможность этого чтения?

a5021
Offline
Зарегистрирован: 07.07.2013

Cоздайте функию initVariant(), где опишите все необходимые вам действия. При выполнении скетча функция initVariant() будет всегда вызваться до setup().

servilat
Offline
Зарегистрирован: 12.12.2013

спасибо посмотрю

получилось

#define rs485_address EEPROM.read(2) // аддрес устройства на шине rs485

сработало до строки

//конфигурация 485
Modbus slave(rs485_address,0,pin_out_rs485); // this is slave @1 and RS-232 or USB-FTDI

хотя не знаю верно ли сделал.

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Откройте для себя оператор new - и не надо париться с извратами:

Modbus* slave;
void setup()
{
  int addr =  EEPROM.read(2);
  slave = new Modbus(addr,pin_out_rs485);
  slave->someMethod();
}

 

servilat
Offline
Зарегистрирован: 12.12.2013

Ок. Спасибо.

servilat
Offline
Зарегистрирован: 12.12.2013

DIYMan пишет:

Откройте для себя оператор new - и не надо париться с извратами:

Modbus* slave;
void setup()
{
  int addr =  EEPROM.read(2);
  slave = new Modbus(addr,pin_out_rs485);
  slave->someMethod();
}

 

компиляция прерываеться на строке slave->someMethod(); с ошибкой

Arduino: 1.8.1 (Windows 8.1), Плата:"Arduino/Genuino Uno"

C:\Users\Коля\YandexDisk\Arduino\SENSOR_RS485\SENSOR_RS485.ino: In function 'void setup()':

SENSOR_RS485:151: error: 'class Modbus' has no member named 'someMethod'

SENSOR_RS485:191: error: request for member 'begin' in 'slave', which is of pointer type 'Modbus*' (maybe you meant to use '->' ?)

C:\Users\Коля\YandexDisk\Arduino\SENSOR_RS485\SENSOR_RS485.ino: In function 'void loop()':

SENSOR_RS485:276: error: request for member 'poll' in 'slave', which is of pointer type 'Modbus*' (maybe you meant to use '->' ?)

SENSOR_RS485:285: error: request for member 'poll' in 'slave', which is of pointer type 'Modbus*' (maybe you meant to use '->' ?)

exit status 1
'class Modbus' has no member named 'someMethod'

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

slave->someMethod();

Это просто пример, как вызывать какой-то метод у экземпляра класса, созданного динамически. Если раньше вы делали так:

slave.someMethod();

То в случае динамического создания надо делать так, как я показал. Думал, догадаетесь, что это просто пример.

igorlab
Offline
Зарегистрирован: 11.11.2015

доброго времени суток!

пыаюсь до инициализации бота Телеграмм прочитать из памчти токен, но не выходит... что-то делаю не так или таким способом это не возможно?

void initVariant() {
  EEPROM.begin(last_byte_to_eeprom);  
}
#include <UniversalTelegramBot.h>
#define bot_token EEPROM_String_read(Es_BOTtoken)
UniversalTelegramBot bot(bot_token, client); 

void setup() {
...
}

 

kostyamat
Offline
Зарегистрирован: 16.11.2017

А если так ?

UniversalTelegramBot bot(EEPROM.get(someAddress), client); 

 

igorlab
Offline
Зарегистрирован: 11.11.2015

увы...

если так как в примере ниже, то "переменная" bot за пределами initVariant() не видна

#include <UniversalTelegramBot.h>

void initVariant() {
  EEPROM.begin(last_byte_to_eeprom);  
 UniversalTelegramBot bot( EEPROM.get.(Es_BOTtoken), client); 

}
void setup() {
...
}

если просто 

#include <UniversalTelegramBot.h>

UniversalTelegramBot bot( EEPROM.get.(Es_BOTtoken), client); 

то оно не знает что такое EEPROM.get. - ведь оно еще не инициализированно 

 

kostyamat
Offline
Зарегистрирован: 16.11.2017

хм...

попробуте создать переменную, вбить в нее токен "от фонаря", но чтобы длинна совпадала

потом запустить бот и передать ему не переменную, а указатель на нее, а потом переписать переменную нужным содержимым.

http://cppstudio.com/post/423/

http://cppstudio.com/post/429/

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

не знаю, что тебе нужно, но посмотри вот здесь -  http://arduino.ru/forum/programmirovanie/kak-ispolnit-svoi-kod-do-initsializatsii-sredy-arduino

Technolog
Offline
Зарегистрирован: 19.11.2014

DIYMan пишет:

Откройте для себя оператор new - и не надо париться с извратами:

Modbus* slave;
void setup()
{
  int addr =  EEPROM.read(2);
  slave = new Modbus(addr,pin_out_rs485);
  slave->someMethod();
}

 

DIYMan спасибо!

igorlab
Offline
Зарегистрирован: 11.11.2015

Воротоа, что мне нужно:

есть телеграмм бот, для его использования ДО блока сетап надо инициализировать его с помощью ключа BOTtoken, так вот хочу чтобы этот BOTtoken  можно было хранить в памяти, а не записывать в скетч, но увы - пока не получилось...

#include <UniversalTelegramBot.h>
#define BOTtoken  "67986753454:hjghljKKHIjhfjl^gfkkjhg;hjkJhKG?FGhjkljk"
UniversalTelegramBot bot(bot_token, client); 

 

 

Technolog
Offline
Зарегистрирован: 19.11.2014
#include <UniversalTelegramBot.h>

// инициализировать переменную BOTtoken любыми символами "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
// важно чтоб длина была как у Вашей                     "67986753454:hjghljKKHIjhfjl^gfkkjhg;hjkJhKG?FGhjkljk"
char BOTtoken[] = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
WiFiClientSecure client;
UniversalTelegramBot *bot;

void setup() {
// до строки 12 нужно прочитать из памяти Ваши переменные BOTtoken и client

bot = new UniversalTelegramBot (BOTtoken, client);

// теперь везде вызывать разделяя не точкой bot. а вот так bot->
// пример:  String text = bot->messages[i].text;
// взамен:  String text = bot.messages[i].text;
}

void loop{
// ...
String text = bot->messages[i].text;
int numNewMessages = bot->getUpdates(bot->last_message_received + 1);
}

 

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

понятно

igorlab
Offline
Зарегистрирован: 11.11.2015

Technolog пишет:

#include <UniversalTelegramBot.h>

// инициализировать переменную BOTtoken любыми символами "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
// важно чтоб длина была как у Вашей                     "67986753454:hjghljKKHIjhfjl^gfkkjhg;hjkJhKG?FGhjkljk"
char BOTtoken[] = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
WiFiClientSecure client;
UniversalTelegramBot *bot;

void setup() {
// до строки 12 нужно прочитать из памяти Ваши переменные BOTtoken и client

bot = new UniversalTelegramBot (BOTtoken, client);

// теперь везде вызывать разделяя не точкой bot. а вот так bot->
// пример:  String text = bot->messages[i].text;
// взамен:  String text = bot.messages[i].text;
}

void loop{
// ...
String text = bot->messages[i].text;
int numNewMessages = bot->getUpdates(bot->last_message_received + 1);
}

 

супер! спасибо огромное!