Перезагружается и иногда зависает Arduino UNO
- Войдите на сайт для отправки комментариев
Вс, 01/05/2022 - 21:30
Добрый день!
Не могу решить что делать с внезапными перезапуском контроллера.
Так как все таки на 80% за такое поведение отвечает программа прошу помощи.
В проекте 2 UNO, одна главная по данным с микрометра вырабатывает PID сигнал скорость для мотора,
и через modbus rtu rs485 передает второй, которая только крутит шаговый двигатель не отвлекаясь.
У главной есть экран и три кнопки и 2 потенциометра для управления.
Драйвер двигателя питается от отдельного БП 12в, ардуины от 5в источника.
Все собрано в металлическом ящике, заземлено.
Собственно зависает главная.
Фото и скетч во вложении.

#define dataIn 3 //шина данных микрометра
#define clockIn 2 //шина clock микрометра, attachInterrupt
#define StopExtruderPin 9 //реле стоп нагрев и экструдер
#define ReleOut_1 10 //реле выхода след катушка
#define CalibratingPin 7 //калибровка микрометра
#define ResetSpoolPin 5 // сброс только количества катушек
#define SetPin 6 // полный сброс
#define SetKP A0 // установка длины
#define SetKI A1 // установка количества катушек
#include <GyverPID.h>
#include <ModbusRtu.h>
#include <avr/eeprom.h> //данные калибровки будем держать в памяти
#include <LiquidCrystal_I2C.h> // Подключение библиотеки
LiquidCrystal_I2C
lcd(0x27, 16, 2); // Указываем I2C адрес (наиболее распространенное значение), а также параметры экрана (в случае LCD 1602 - 2 строки по 16 символов в каждой
int SizeConst = 1750; //Размер в микронах
byte Popravka = eeprom_read_byte(0); //поправка к микрометру
const int PIDInterval = 400; //интервал обработки в мс
GyverPID regulator(1, 0.2, 0.1, PIDInterval); //стартовые разгонные значения
unsigned int buswrite[1]; // шина обмена с мотором протяжки/слейв 2
//unsigned int busread[1]; // шина обмена с мотором протяжки/слейв 2
byte u8state;
volatile bool isfs = 0; //минус, отрицательное значение с микрометра (в прерывании volatile)
volatile byte index = 0; //счётчик битов (в прерывании volatile)
volatile unsigned long xData = 0; //новые показания с микрометра (в прерывании volatile)
int GetSize = 0; //текущее значение с микрометра
float AVGSize = 0; //усредненное значение с микрометра
volatile unsigned long previousGetMillis = 0; //(в прерывании volatile)
long Timeout = 8; //таймаут чтения битов в мс
long LCDTimer = 0; // таймер обновления данных на экране
long MicrometrTimer = 0; //таймер опроса микрометра
long MotorSpeedUpdateTimer = 0; //таймер вычисления новой скорости мотора протяжки
float FilamentLength = eeprom_read_word(2); // текущая длина прутка, берем из памяти если переапустились
int SavedFilamentLength = int(FilamentLength); //последняя сохрненная длина
int RollVolume = 323; // объем катушки в метрах
byte RollNumber = eeprom_read_byte(1); // номер текущей катушки
int RollCount = 1; // количество катушек
int motorSpeed = 9000; //скорость вращения
const int minSpeed = 7000; //минимальная
const int maxSpeed = 15000; //максимальная
byte Mode = 0; //режим 0- разгон, 1-работа после набранной скорости
byte RebootCount = eeprom_read_byte(100); //количество перезагрузок
int ErrorCount = 0; //количество ошибок по диаметру
Modbus master(0, 0, 4); // 0 this is master, 0 Serial по умолчанию в UNO он один
//а 4 будет обозначать, что контакты DE&RE модуля RS-485 подключены к контакту 4 платы Arduino
modbus_t telegram[1]; // посылка данных для modbus
unsigned long u32wait; //таймер modbus
uint8_t u8query=0; //!< pointer to message query
void LCD_print() { //вывод на экран надписей
lcd.home(); // Установка курсора в начало первой строки
lcd.print("L "); // Набор текста на первой строке
lcd.setCursor(0, 1); lcd.print("s "); //на второй
}
void DataToDisp() { //Вывод на экран среднего диаметра, ошибки, скорости
lcd.setCursor(2, 0); lcd.print(" "); //стираем
lcd.setCursor(2, 0); lcd.print(int(FilamentLength)); //пишем длину прутка
lcd.setCursor(5, 0); lcd.print("/");
lcd.setCursor(6, 0); lcd.print(RollVolume); //пишем RollVolume
lcd.setCursor(11, 0); lcd.print(RollNumber); // номер катушки
lcd.setCursor(13, 0); lcd.print("/");
lcd.setCursor(14, 0); lcd.print(RollCount); // количество катушек
//вторая строка
lcd.setCursor(2, 1); lcd.print(" "); // стираем
lcd.setCursor(2, 1); lcd.print(motorSpeed); //пишем скорость
lcd.setCursor(8, 1); lcd.print(ErrorCount); //пишем ошибки
lcd.setCursor(9, 1); lcd.print(RebootCount); //пишем количество перезапусков
if (int(AVGSize + Popravka - SizeConst) >= 0) {
lcd.setCursor(12, 1);
} else {
lcd.setCursor(11, 1);
}
lcd.print(int(AVGSize + Popravka - SizeConst)); //пишем ошибку измеренную
}
void mkmDupt() { // обработка информации с микрометра
if ((index != 0) && (millis() - previousGetMillis > Timeout) ) { //обнуление по превышению таймаута
index = 0;
xData = 0;
}
if (index > 23) { //если слово считано полностью
if (isfs == 0) { // если есть знак "минус"
GetSize = int(xData);
} else {
GetSize = -int(xData);
}
index = 0;
xData = 0;
}
}
void modbussend() {
switch ( u8state ) {
case 0:
if (millis() > u32wait) u8state++; // wait state
break;
case 1:
// telegram 0: write registers
telegram[0].u8id = 2; // slave address
telegram[0].u8fct = 6; // function code (this one is registers write)
telegram[0].u16RegAdd = 0; // start address in slave
telegram[0].u16CoilsNo = 1; // number of elements (coils or registers) to write
telegram[0].au16reg = buswrite; // pointer to a memory array in the Arduino
// telegram 1: read registers
//telegram[1].u8id = 2; // slave address
//telegram[1].u8fct = 3; // function code (this one is registers read)
//telegram[1].u16RegAdd = 1; // start address in slave
//telegram[1].u16CoilsNo = 1; // number of elements (coils or registers) to read
//telegram[1].au16reg = busread; // pointer to a memory array in the Arduino
master.query( telegram[u8query] ); // send query (only once)
u8state++;
//u8query++; //номер запроса телеграммы 0 или 1
//if (u8query > 0) u8query = 0;
break;
case 2:
master.poll(); // check incoming messages
if (master.getState() == COM_IDLE) {
u8state = 0;
u32wait = millis() + 200;
}
break;
}
}
void setup()
{
//rs485
master.begin(19200); // baud-rate at 19200
master.setTimeOut( 2000 ); // if there is no answer in 2000 ms, roll over
//инициализация микрометра
pinMode (dataIn, INPUT_PULLUP); //привязываем шину данных на dataIn
pinMode (clockIn, INPUT_PULLUP); //и clock на 2й вход
attachInterrupt(0, getBit, FALLING); //и аттачим clock прерывание также на 2й вход
pinMode(ReleOut_1, OUTPUT);
pinMode(StopExtruderPin, OUTPUT); // второе выходное реле
pinMode(CalibratingPin, INPUT);
pinMode(ResetSpoolPin, INPUT);
pinMode(SetKP, INPUT); //потенциометр
pinMode(SetKI, INPUT); //потенциометр
pinMode(SetPin, INPUT);
digitalWrite(CalibratingPin, HIGH);
digitalWrite(ResetSpoolPin, HIGH);
digitalWrite(SetPin, HIGH);
digitalWrite(ReleOut_1, 0); //выход реле первого реле выключен
digitalWrite(StopExtruderPin, 0); //выход остановка экструдера реле выключен
//пид
regulator.setDirection(REVERSE); //напрвление регуулирования
regulator.setLimits(minSpeed, maxSpeed); //пределы
regulator.setpoint = SizeConst; //диаметр поддержания
lcd.init(); // Инициализация дисплея
lcd.backlight(); // Подключение подсветки
lcd.setCursor(0, 1); lcd.print("Popravka = "); lcd.setCursor(12, 1); lcd.print(Popravka);
delay(200);
LCD_print();
RebootCount++;
eeprom_write_byte(100, RebootCount); // сохраним
}
void Stop() { //остановка системы
digitalWrite(ReleOut_1, 1); //команда остановить намотку
digitalWrite(StopExtruderPin, 1); //остановка экструдера
motorSpeed = 0;
while (digitalRead(SetPin)) {
modbussend();
} //стоим до нажатия кнопки сброс
digitalWrite(ReleOut_1, 0); //команда запустить намотку
digitalWrite(StopExtruderPin, 0); //запуск экструдера
LCD_print();
}
void loop() {
modbussend();
// если внезапно в процессе работы пруток стал мал или обрыв
if (ErrorCount > 10) {
lcd.home();
lcd.print("Err=");
lcd.print(AVGSize + Popravka);
Stop();
}
if (!digitalRead(SetPin)) {
delay(20);
if (!digitalRead(SetPin)) { //кнопка обнуления пробега прутка и режима
FilamentLength = 0;
eeprom_write_word (2, int(FilamentLength));
SavedFilamentLength = 0;
RollNumber = 1;
eeprom_write_byte(1, RollNumber); // сохраним
RebootCount=0;
eeprom_write_byte(100, RebootCount); // сохраним
Mode = 0;
ErrorCount = 0;
LCD_print();
}
}
if (!digitalRead(ResetSpoolPin)) {
delay(20);
if (!digitalRead(ResetSpoolPin)) { //кнопка обнуления количества катушек только
RollNumber = 1;
eeprom_write_byte(1, RollNumber); // сохраним
}
}
if (FilamentLength > RollVolume) { // *** метров следующая катушка, щелкнуть релюшкой
FilamentLength = 0;
eeprom_write_word (2, int(FilamentLength));
SavedFilamentLength = 0;
RollNumber++;
eeprom_write_byte(1, RollNumber); // сохраним
digitalWrite(ReleOut_1, 1); //выход реле первого реле включен
delay(20);
digitalWrite(ReleOut_1, 0); //выход реле первого реле выключен
if (RollNumber > RollCount) { //становимся на паузу
Stop();
}
}
RollVolume = map(analogRead(SetKP), 0, 1023, 100, 400);
RollCount = map(analogRead(SetKI), 0, 1023, 1, 11);
if ( millis() - MotorSpeedUpdateTimer > PIDInterval) { // расчет скорости
MotorSpeedUpdateTimer = millis();
regulator.input = AVGSize + Popravka; //ПИД вход с датчика
motorSpeed = regulator.getResultTimer(); //пид результат
if (motorSpeed > 9000) {
Mode = 1; //вышли на режим, коэфф P = 0.6 c 20/04/22
lcd.setCursor(0, 1);
lcd.print("S ");
regulator.Kp = 0.6;
}
buswrite[0] = motorSpeed; //отправляем в шину
FilamentLength = FilamentLength + motorSpeed/1000*0.008207; //вычисление длну
if (FilamentLength-SavedFilamentLength>5) { //раз в 5 метров сохраним в память
SavedFilamentLength = FilamentLength;
eeprom_write_word (2, int(FilamentLength));
}
///1000/6400*3.1415*0.0418
}
if ( millis() - MicrometrTimer > 30) { //опрос микрометра и скользящее среднее
// раз в 30 мс усредняем за 20 значений, те за 600 мс
MicrometrTimer = millis();
mkmDupt(); //запрос микрометра
if (GetSize > -20 && GetSize < 2500) {
AVGSize = 0.92 * AVGSize + 0.08 * GetSize; //Скользящее среднее, устредняем показания за последние 20 считываний
}
}
if ( millis() - LCDTimer > 500) { // обновление дисплей 2 раз в сек, чтобы не было каши из цифр
LCDTimer = millis();
DataToDisp(); // Вывод данных на дисплей
if ((Mode && (AVGSize + Popravka < 1600)) || (Mode && (AVGSize + Popravka > 2000))) {
ErrorCount++; //ошибки
}
}
if (!digitalRead(CalibratingPin)) {
delay (20);
if (!digitalRead(CalibratingPin)) { //кнопка обнуления пробега прутка и режима
//калибровка микрометра
lcd.home(); // Установка курсора в начало первой строки
lcd.print("Calibrating..."); // Набор текста на первой строке
lcd.setCursor(0, 1); lcd.print("Popravka = ");
for (int i = 0; i < 100; i++) {
mkmDupt(); //запрос микрометра
if (GetSize > -20 && GetSize < 2500) {
AVGSize = 0.95 * AVGSize + 0.05 * GetSize; //Скользящее среднее, устредняем показания за последние 20 считываний
}
delay(25);
}
Popravka = SizeConst - AVGSize;
lcd.setCursor(12, 1); lcd.print(Popravka);
eeprom_write_byte(0, Popravka);
delay(5000);
LCD_print();
}
}
}
void getBit() { //чтение битов и флаги микрометра
previousGetMillis = millis();
if (index < 20) {
if (digitalRead(dataIn) == 0) {
xData |= 1 << index;
}
} else {
if (index == 20) //минус
isfs = !digitalRead(dataIn);
};
index++;
}
GiverPID, эт прям больше 3/4 ...
Не понял). Больше чего?
GiverPID
ПИДов здесь не любят. Особенно Гайверов. Обращайтесь к ним.
Хм. Какая разница откуда библиотека?)
Зачем платить за Феррари, если и на самокате можно ехать?))
Видимо я что то пропустил)
Тем не менее, мне очень нужна помощь.
Даже в разрезе "вот тут возможно ошибка".
Спасибо.
Так тебе уже сказали, или пальцем ткнуть в ту строку с гивером?
Самое интересное, что зависания начались позже чем библиотека pid gyver была подключена.
Попробую заменить.
Хотя там всего пара формул.
Надо вставлять вывод меток в Serial или SoftSerail в критических местах и по логу смотреть/локализовать проблему. Ничего нового для отладки не изобрели.
Я правильно вас понял, что скорее всего перезапуск или зависание происходит в каком то одном месте кода?
Мы пишем в порт метки типа "точка1 точка 2" и тд расставленные по коду, перед и после функций... Подключаем ноутбук с портом и ждем лог.
После очередного фейла можно будет попробовать локализовать проблему?
Да. Позапускайте несколько раз. Как определите где, то выводите уже больше данных для этого куска кода ...
А Вас ни разу не смущает вот такое количество предупреждений компилятора? (это я скомпилировал Ваш код). Вы уверены, что на все эти предупреждения можно плевать?
In file included from C:\GoogleD\Soft\Kaka\Kaka1\Kaka1.ino:11:0: C:\GoogleD\Soft\libraries\GyverPID/GyverPID.h: In member function 'datatype GyverPID::getResultTimer()': C:\GoogleD\Soft\libraries\GyverPID/GyverPID.h:120:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] if (millis() - pidTimer >= _dt) { ~~~~~~~~~~~~~~~~~~~~^~~~~~ In file included from C:\GoogleD\Soft\Kaka\Kaka1\Kaka1.ino:12:0: C:\GoogleD\Soft\libraries\ModbusRtu/ModbusRtu.h: In member function 'void Modbus::sendTxBuffer()': C:\GoogleD\Soft\libraries\ModbusRtu/ModbusRtu.h:891:13: warning: unused variable 'i' [-Wunused-variable] uint8_t i = 0; ^ C:\GoogleD\Soft\libraries\ModbusRtu/ModbusRtu.h: In member function 'void Modbus::get_FC1()': C:\GoogleD\Soft\libraries\ModbusRtu/ModbusRtu.h:1152:13: warning: variable 'u8byte' set but not used [-Wunused-but-set-variable] uint8_t u8byte, i; ^~~~~~ C:\GoogleD\Soft\libraries\ModbusRtu/ModbusRtu.h:1152:21: warning: unused variable 'i' [-Wunused-variable] uint8_t u8byte, i; ^ C:\GoogleD\Soft\libraries\ModbusRtu/ModbusRtu.h: In member function 'int8_t Modbus::process_FC1(uint16_t*, uint8_t)': C:\GoogleD\Soft\libraries\ModbusRtu/ModbusRtu.h:1191:53: warning: unused parameter 'u8size' [-Wunused-parameter] int8_t Modbus::process_FC1( uint16_t *regs, uint8_t u8size ) ^~~~~~ C:\GoogleD\Soft\libraries\ModbusRtu/ModbusRtu.h: In member function 'int8_t Modbus::process_FC3(uint16_t*, uint8_t)': C:\GoogleD\Soft\libraries\ModbusRtu/ModbusRtu.h:1244:53: warning: unused parameter 'u8size' [-Wunused-parameter] int8_t Modbus::process_FC3( uint16_t *regs, uint8_t u8size ) ^~~~~~ C:\GoogleD\Soft\libraries\ModbusRtu/ModbusRtu.h: In member function 'int8_t Modbus::process_FC5(uint16_t*, uint8_t)': C:\GoogleD\Soft\libraries\ModbusRtu/ModbusRtu.h:1276:53: warning: unused parameter 'u8size' [-Wunused-parameter] int8_t Modbus::process_FC5( uint16_t *regs, uint8_t u8size ) ^~~~~~ C:\GoogleD\Soft\libraries\ModbusRtu/ModbusRtu.h: In member function 'int8_t Modbus::process_FC6(uint16_t*, uint8_t)': C:\GoogleD\Soft\libraries\ModbusRtu/ModbusRtu.h:1309:53: warning: unused parameter 'u8size' [-Wunused-parameter] int8_t Modbus::process_FC6( uint16_t *regs, uint8_t u8size ) ^~~~~~ C:\GoogleD\Soft\libraries\ModbusRtu/ModbusRtu.h: In member function 'int8_t Modbus::process_FC15(uint16_t*, uint8_t)': C:\GoogleD\Soft\libraries\ModbusRtu/ModbusRtu.h:1335:54: warning: unused parameter 'u8size' [-Wunused-parameter] int8_t Modbus::process_FC15( uint16_t *regs, uint8_t u8size ) ^~~~~~ C:\GoogleD\Soft\libraries\ModbusRtu/ModbusRtu.h: In member function 'int8_t Modbus::process_FC16(uint16_t*, uint8_t)': C:\GoogleD\Soft\libraries\ModbusRtu/ModbusRtu.h:1393:13: warning: unused variable 'u8func' [-Wunused-variable] uint8_t u8func = au8Buffer[ FUNC ]; // get the original FUNC code ^~~~~~ C:\GoogleD\Soft\libraries\ModbusRtu/ModbusRtu.h:1391:54: warning: unused parameter 'u8size' [-Wunused-parameter] int8_t Modbus::process_FC16( uint16_t *regs, uint8_t u8size ) ^~~~~~ C:\GoogleD\Soft\Kaka\Kaka1\Kaka1.ino: At global scope: C:\GoogleD\Soft\Kaka\Kaka1\Kaka1.ino:40:42: warning: invalid conversion from 'int' to 'const uint16_t* {aka const unsigned int*}' [-fpermissive] float FilamentLength = eeprom_read_word(2); // текущая длина прутка, берем из памяти если переапустились ^ In file included from C:\Soft\Arduino\hardware\arduino\avr\cores\arduino/USBAPI.h:25:0, from C:\Soft\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:234, from sketch\Kaka1.ino.cpp:1: c:\soft\arduino\hardware\tools\avr\avr\include\avr\eeprom.h:144:10: note: initializing argument 1 of 'uint16_t eeprom_read_word(const uint16_t*)' uint16_t eeprom_read_word (const uint16_t *__p) __ATTR_PURE__; ^~~~~~~~~~~~~~~~ C:\GoogleD\Soft\Kaka\Kaka1\Kaka1.ino:43:37: warning: invalid conversion from 'int' to 'const uint8_t* {aka const unsigned char*}' [-fpermissive] byte RollNumber = eeprom_read_byte(1); // номер текущей катушки ^ In file included from C:\Soft\Arduino\hardware\arduino\avr\cores\arduino/USBAPI.h:25:0, from C:\Soft\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:234, from sketch\Kaka1.ino.cpp:1: c:\soft\arduino\hardware\tools\avr\avr\include\avr\eeprom.h:139:9: note: initializing argument 1 of 'uint8_t eeprom_read_byte(const uint8_t*)' uint8_t eeprom_read_byte (const uint8_t *__p) __ATTR_PURE__; ^~~~~~~~~~~~~~~~ C:\GoogleD\Soft\Kaka\Kaka1\Kaka1.ino:51:41: warning: invalid conversion from 'int' to 'const uint8_t* {aka const unsigned char*}' [-fpermissive] byte RebootCount = eeprom_read_byte(100); //количество перезагрузок ^ In file included from C:\Soft\Arduino\hardware\arduino\avr\cores\arduino/USBAPI.h:25:0, from C:\Soft\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:234, from sketch\Kaka1.ino.cpp:1: c:\soft\arduino\hardware\tools\avr\avr\include\avr\eeprom.h:139:9: note: initializing argument 1 of 'uint8_t eeprom_read_byte(const uint8_t*)' uint8_t eeprom_read_byte (const uint8_t *__p) __ATTR_PURE__; ^~~~~~~~~~~~~~~~ C:\GoogleD\Soft\Kaka\Kaka1\Kaka1.ino: In function 'void mkmDupt()': C:\GoogleD\Soft\Kaka\Kaka1\Kaka1.ino:89:53: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] if ((index != 0) && (millis() - previousGetMillis > Timeout) ) { //обнуление по превышению таймаута ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~ C:\GoogleD\Soft\Kaka\Kaka1\Kaka1.ino: In function 'void setup()': C:\GoogleD\Soft\Kaka\Kaka1\Kaka1.ino:177:37: warning: invalid conversion from 'int' to 'uint8_t* {aka unsigned char*}' [-fpermissive] eeprom_write_byte(100, RebootCount); // сохраним ^ In file included from C:\Soft\Arduino\hardware\arduino\avr\cores\arduino/USBAPI.h:25:0, from C:\Soft\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:234, from sketch\Kaka1.ino.cpp:1: c:\soft\arduino\hardware\tools\avr\avr\include\avr\eeprom.h:166:6: note: initializing argument 1 of 'void eeprom_write_byte(uint8_t*, uint8_t)' void eeprom_write_byte (uint8_t *__p, uint8_t __value); ^~~~~~~~~~~~~~~~~ C:\GoogleD\Soft\Kaka\Kaka1\Kaka1.ino: In function 'void loop()': C:\GoogleD\Soft\Kaka\Kaka1\Kaka1.ino:206:48: warning: invalid conversion from 'int' to 'uint16_t* {aka unsigned int*}' [-fpermissive] eeprom_write_word (2, int(FilamentLength)); ^ In file included from C:\Soft\Arduino\hardware\arduino\avr\cores\arduino/USBAPI.h:25:0, from C:\Soft\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:234, from sketch\Kaka1.ino.cpp:1: c:\soft\arduino\hardware\tools\avr\avr\include\avr\eeprom.h:171:6: note: initializing argument 1 of 'void eeprom_write_word(uint16_t*, uint16_t)' void eeprom_write_word (uint16_t *__p, uint16_t __value); ^~~~~~~~~~~~~~~~~ C:\GoogleD\Soft\Kaka\Kaka1\Kaka1.ino:209:38: warning: invalid conversion from 'int' to 'uint8_t* {aka unsigned char*}' [-fpermissive] eeprom_write_byte(1, RollNumber); // сохраним ^ In file included from C:\Soft\Arduino\hardware\arduino\avr\cores\arduino/USBAPI.h:25:0, from C:\Soft\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:234, from sketch\Kaka1.ino.cpp:1: c:\soft\arduino\hardware\tools\avr\avr\include\avr\eeprom.h:166:6: note: initializing argument 1 of 'void eeprom_write_byte(uint8_t*, uint8_t)' void eeprom_write_byte (uint8_t *__p, uint8_t __value); ^~~~~~~~~~~~~~~~~ C:\GoogleD\Soft\Kaka\Kaka1\Kaka1.ino:211:41: warning: invalid conversion from 'int' to 'uint8_t* {aka unsigned char*}' [-fpermissive] eeprom_write_byte(100, RebootCount); // сохраним ^ In file included from C:\Soft\Arduino\hardware\arduino\avr\cores\arduino/USBAPI.h:25:0, from C:\Soft\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:234, from sketch\Kaka1.ino.cpp:1: c:\soft\arduino\hardware\tools\avr\avr\include\avr\eeprom.h:166:6: note: initializing argument 1 of 'void eeprom_write_byte(uint8_t*, uint8_t)' void eeprom_write_byte (uint8_t *__p, uint8_t __value); ^~~~~~~~~~~~~~~~~ C:\GoogleD\Soft\Kaka\Kaka1\Kaka1.ino:221:38: warning: invalid conversion from 'int' to 'uint8_t* {aka unsigned char*}' [-fpermissive] eeprom_write_byte(1, RollNumber); // сохраним ^ In file included from C:\Soft\Arduino\hardware\arduino\avr\cores\arduino/USBAPI.h:25:0, from C:\Soft\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:234, from sketch\Kaka1.ino.cpp:1: c:\soft\arduino\hardware\tools\avr\avr\include\avr\eeprom.h:166:6: note: initializing argument 1 of 'void eeprom_write_byte(uint8_t*, uint8_t)' void eeprom_write_byte (uint8_t *__p, uint8_t __value); ^~~~~~~~~~~~~~~~~ C:\GoogleD\Soft\Kaka\Kaka1\Kaka1.ino:227:46: warning: invalid conversion from 'int' to 'uint16_t* {aka unsigned int*}' [-fpermissive] eeprom_write_word (2, int(FilamentLength)); ^ In file included from C:\Soft\Arduino\hardware\arduino\avr\cores\arduino/USBAPI.h:25:0, from C:\Soft\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:234, from sketch\Kaka1.ino.cpp:1: c:\soft\arduino\hardware\tools\avr\avr\include\avr\eeprom.h:171:6: note: initializing argument 1 of 'void eeprom_write_word(uint16_t*, uint16_t)' void eeprom_write_word (uint16_t *__p, uint16_t __value); ^~~~~~~~~~~~~~~~~ C:\GoogleD\Soft\Kaka\Kaka1\Kaka1.ino:230:36: warning: invalid conversion from 'int' to 'uint8_t* {aka unsigned char*}' [-fpermissive] eeprom_write_byte(1, RollNumber); // сохраним ^ In file included from C:\Soft\Arduino\hardware\arduino\avr\cores\arduino/USBAPI.h:25:0, from C:\Soft\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:234, from sketch\Kaka1.ino.cpp:1: c:\soft\arduino\hardware\tools\avr\avr\include\avr\eeprom.h:166:6: note: initializing argument 1 of 'void eeprom_write_byte(uint8_t*, uint8_t)' void eeprom_write_byte (uint8_t *__p, uint8_t __value); ^~~~~~~~~~~~~~~~~ C:\GoogleD\Soft\Kaka\Kaka1\Kaka1.ino:257:48: warning: invalid conversion from 'int' to 'uint16_t* {aka unsigned int*}' [-fpermissive] eeprom_write_word (2, int(FilamentLength)); ^ In file included from C:\Soft\Arduino\hardware\arduino\avr\cores\arduino/USBAPI.h:25:0, from C:\Soft\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:234, from sketch\Kaka1.ino.cpp:1: c:\soft\arduino\hardware\tools\avr\avr\include\avr\eeprom.h:171:6: note: initializing argument 1 of 'void eeprom_write_word(uint16_t*, uint16_t)' void eeprom_write_word (uint16_t *__p, uint16_t __value); ^~~~~~~~~~~~~~~~~ C:\GoogleD\Soft\libraries\LiquidCrystal_I2C\LiquidCrystal_I2C.cpp: In member function 'void LiquidCrystal_I2C::begin(uint8_t, uint8_t, uint8_t)': C:\GoogleD\Soft\libraries\LiquidCrystal_I2C\LiquidCrystal_I2C.cpp:66:39: warning: unused parameter 'cols' [-Wunused-parameter] void LiquidCrystal_I2C::begin(uint8_t cols, uint8_t lines, uint8_t dotsize) { ^~~~ C:\GoogleD\Soft\libraries\LiquidCrystal_I2C\LiquidCrystal_I2C.cpp: In member function 'void LiquidCrystal_I2C::setDelay(int, int)': C:\GoogleD\Soft\libraries\LiquidCrystal_I2C\LiquidCrystal_I2C.cpp:307:39: warning: unused parameter 'cmdDelay' [-Wunused-parameter] void LiquidCrystal_I2C::setDelay (int cmdDelay,int charDelay) {} ^~~~~~~~ C:\GoogleD\Soft\libraries\LiquidCrystal_I2C\LiquidCrystal_I2C.cpp:307:52: warning: unused parameter 'charDelay' [-Wunused-parameter] void LiquidCrystal_I2C::setDelay (int cmdDelay,int charDelay) {} ^~~~~~~~~ C:\GoogleD\Soft\libraries\LiquidCrystal_I2C\LiquidCrystal_I2C.cpp: In member function 'uint8_t LiquidCrystal_I2C::init_bargraph(uint8_t)': C:\GoogleD\Soft\libraries\LiquidCrystal_I2C\LiquidCrystal_I2C.cpp:310:50: warning: unused parameter 'graphtype' [-Wunused-parameter] uint8_t LiquidCrystal_I2C::init_bargraph(uint8_t graphtype){return 0;} ^~~~~~~~~ C:\GoogleD\Soft\libraries\LiquidCrystal_I2C\LiquidCrystal_I2C.cpp: In member function 'void LiquidCrystal_I2C::draw_horizontal_graph(uint8_t, uint8_t, uint8_t, uint8_t)': C:\GoogleD\Soft\libraries\LiquidCrystal_I2C\LiquidCrystal_I2C.cpp:311:55: warning: unused parameter 'row' [-Wunused-parameter] void LiquidCrystal_I2C::draw_horizontal_graph(uint8_t row, uint8_t column, uint8_t len, uint8_t pixel_col_end){} ^~~ C:\GoogleD\Soft\libraries\LiquidCrystal_I2C\LiquidCrystal_I2C.cpp:311:68: warning: unused parameter 'column' [-Wunused-parameter] void LiquidCrystal_I2C::draw_horizontal_graph(uint8_t row, uint8_t column, uint8_t len, uint8_t pixel_col_end){} ^~~~~~ C:\GoogleD\Soft\libraries\LiquidCrystal_I2C\LiquidCrystal_I2C.cpp:311:84: warning: unused parameter 'len' [-Wunused-parameter] void LiquidCrystal_I2C::draw_horizontal_graph(uint8_t row, uint8_t column, uint8_t len, uint8_t pixel_col_end){} ^~~ C:\GoogleD\Soft\libraries\LiquidCrystal_I2C\LiquidCrystal_I2C.cpp:311:98: warning: unused parameter 'pixel_col_end' [-Wunused-parameter] void LiquidCrystal_I2C::draw_horizontal_graph(uint8_t row, uint8_t column, uint8_t len, uint8_t pixel_col_end){} ^~~~~~~~~~~~~ C:\GoogleD\Soft\libraries\LiquidCrystal_I2C\LiquidCrystal_I2C.cpp: In member function 'void LiquidCrystal_I2C::draw_vertical_graph(uint8_t, uint8_t, uint8_t, uint8_t)': C:\GoogleD\Soft\libraries\LiquidCrystal_I2C\LiquidCrystal_I2C.cpp:312:53: warning: unused parameter 'row' [-Wunused-parameter] void LiquidCrystal_I2C::draw_vertical_graph(uint8_t row, uint8_t column, uint8_t len, uint8_t pixel_row_end){} ^~~ C:\GoogleD\Soft\libraries\LiquidCrystal_I2C\LiquidCrystal_I2C.cpp:312:66: warning: unused parameter 'column' [-Wunused-parameter] void LiquidCrystal_I2C::draw_vertical_graph(uint8_t row, uint8_t column, uint8_t len, uint8_t pixel_row_end){} ^~~~~~ C:\GoogleD\Soft\libraries\LiquidCrystal_I2C\LiquidCrystal_I2C.cpp:312:82: warning: unused parameter 'len' [-Wunused-parameter] void LiquidCrystal_I2C::draw_vertical_graph(uint8_t row, uint8_t column, uint8_t len, uint8_t pixel_row_end){} ^~~ C:\GoogleD\Soft\libraries\LiquidCrystal_I2C\LiquidCrystal_I2C.cpp:312:96: warning: unused parameter 'pixel_row_end' [-Wunused-parameter] void LiquidCrystal_I2C::draw_vertical_graph(uint8_t row, uint8_t column, uint8_t len, uint8_t pixel_row_end){} ^~~~~~~~~~~~~ C:\GoogleD\Soft\libraries\LiquidCrystal_I2C\LiquidCrystal_I2C.cpp: In member function 'void LiquidCrystal_I2C::setContrast(uint8_t)': C:\GoogleD\Soft\libraries\LiquidCrystal_I2C\LiquidCrystal_I2C.cpp:313:45: warning: unused parameter 'new_val' [-Wunused-parameter] void LiquidCrystal_I2C::setContrast(uint8_t new_val){} ^~~~~~~ Скетч использует 11262 байт (36%) памяти устройства. Всего доступно 30720 байт. Глобальные переменные используют 719 байт (35%) динамической памяти, оставляя 1329 байт для локальных переменных. Максимум: 2048 байт.Прошу прощения, это какие то расширенные уведомления?
У меня компилятор показывает только нижнюю часть "Скетч использует..."
в меню - настройке - поставьте все уведомления и будет Вам счастье
Это самые обычные предупреждения, просто целевая аудитория IDE - беременные доярки. Вот разработчики и выключили их все, что девочкам мозг не выносить - в их положении это вредно.
Зайдите в "Настройки", найдите там "Сообщения компилятора" и вместо "Ничего" выберите "Все". Узнаете много интересного.
Зайдите в "Настройки", найдите там "Сообщения компилятора" и вместо "Ничего" выберите "Все". Узнаете много интересного.
кстати и нечего бочку на Гайвера катить, там всего одно предупреждение в его библиотеке )))
D:\ARDUINO\arduino-1.8.19\portable\sketchbook\libraries\GyverPID/GyverPID.h: In member function 'datatype GyverPID::getResultTimer()': D:\ARDUINO\arduino-1.8.19\portable\sketchbook\libraries\GyverPID/GyverPID.h:120:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] if (millis() - pidTimer >= _dt) { ~~~~~~~~~~~~~~~~~~~~^~~~~~там чуток поправить:
// возвращает новое значение не ранее, чем через dt миллисекунд (встроенный таймер с периодом dt) datatype getResultTimer() { if (millis() - pidTimer >= (unsigned long)_dt) { pidTimer = millis(); getResult(); } return output; }Библиотеку не смотрел, но может лучше задать правильный тип для _dt ?
Спаисбо!
Надеюсь большее поправлю сам, но что он тут хочет от меня?
Да, две ошибки остались.
Помогите пожалуйста понять:
Z:\arduino\Speed_Main_PIDlib_485\Speed_Main_PIDlib_485.ino:59:22: warning: 'Modbus::Modbus(uint8_t, uint8_t, uint8_t)' is deprecated [-Wdeprecated-declarations] Modbus master(0, 0, 4); // 0 this is master, 0 Serial по умолчанию в UNO он один ^ In file included from Z:\arduino\Speed_Main_PIDlib_485\Speed_Main_PIDlib_485.ino:13:0: C:\Users\78125\Documents\Arduino\libraries\Modbus-Master-Slave-for-Arduino-master/ModbusRtu.h:272:1: note: declared here Modbus::Modbus(uint8_t u8id, uint8_t u8serno, uint8_t u8txenpin) ^~~~~~ Z:\arduino\Speed_Main_PIDlib_485\Speed_Main_PIDlib_485.ino: In function 'void setup()': Z:\arduino\Speed_Main_PIDlib_485\Speed_Main_PIDlib_485.ino:148:21: warning: 'void Modbus::begin(long int)' is deprecated [-Wdeprecated-declarations] master.begin(19200); // baud-rate at 19200 ^ In file included from Z:\arduino\Speed_Main_PIDlib_485\Speed_Main_PIDlib_485.ino:13:0: C:\Users\78125\Documents\Arduino\libraries\Modbus-Master-Slave-for-Arduino-master/ModbusRtu.h:385:6: note: declared here void Modbus::begin(long u32speed) ^~~~~~ Скетч использует 12514 байт (38%) памяти устройства. Всего доступно 32256 байт. Глобальные переменные используют 815 байт (39%) динамической памяти, оставляя 1233 байт для локальных переменных. Максимум: 2048 байт.** * @brief * Start-up class object. * * Call this AFTER calling begin() on the serial port, typically within setup(). * * (If you call this function, then you should NOT call any of * ModbusRtu's own begin() functions.) * * @ingroup setup */ void Modbus::start() { if (u8txenpin > 1) // pin 0 & pin 1 are reserved for RX/TX { // return RS485 transceiver to transmit mode pinMode(u8txenpin, OUTPUT); digitalWrite(u8txenpin, LOW); } while(port->read() >= 0); u8lastRec = u8BufferSize = 0; u16InCnt = u16OutCnt = u16errCnt = 0; } /** * @brief * DEPRECATED Install a serial port, begin() it, and start ModbusRtu. * * ONLY PROVIDED FOR BACKWARDS COMPATIBILITY. * USE Serial.begin(<baud rate>); FOLLOWED BY Modbus.start() INSTEAD. * * @param install_port pointer to SoftwareSerial or HardwareSerial class object * @param u32speed baud rate, in standard increments (300..115200) * @ingroup setup */ template<typename T_Stream> void Modbus::begin(T_Stream* install_port, long u32speed) { port = install_port; install_port->begin(u32speed); start(); } /** * @brief * DEPRECATED. Install a serial port, begin() it, and start ModbusRtu. * * ONLY PROVIDED FOR BACKWARDS COMPATIBILITY. * USE Serial.begin(<baud rate>); FOLLOWED BY Modbus.start() INSTEAD. * * @param install_port pointer to SoftwareSerial or HardwareSerial class object * @param u32speed baud rate, in standard increments (300..115200) * @param u8txenpin pin for txen RS-485 (=0 means USB/RS232C mode) * @ingroup setup */ template<typename T_Stream> void Modbus::begin(T_Stream* install_port, long u32speed, uint8_t u8txenpin) { this->u8txenpin = u8txenpin; this->port = install_port; install_port->begin(u32speed); start(); } /** * @brief * DEPRECATED. begin() hardware serial port and start ModbusRtu. * * ONLY PROVIDED FOR BACKWARDS COMPATIBILITY. * USE Serial.begin(<baud rate>); FOLLOWED BY Modbus.start() INSTEAD. * * @see http://arduino.cc/en/Serial/Begin#.Uy4CJ6aKlHY * @param speed baud rate, in standard increments (300..115200). Default=19200 * @ingroup setup */ void Modbus::begin(long u32speed) { // !!Can ONLY do this if port ACTUALLY IS a HardwareSerial object!! static_cast<HardwareSerial*>(port)->begin(u32speed); start(); }супер! готово:
Modbus master(0,Serial,4); void setup() { //rs485 Serial.begin( 19200 ); // baud-rate at 19200 master.start(); master.setTimeOut( 2000 ); // if there is no answer in 2000 ms, roll overПротестирую, отпишусь.
Пока библиотеку GyverPID заменил на стандартную.