ПОМОЩЬ! новичку 55 летнему!

Всем доброе время суток!
Когда-то возможно, я вашим родителям или родственникам, или родным тоже помогал.
Чинил всякую электронную утварь. От ламповых телевизоров до Японских видеомагнитофонов и далее. Но дело прошлое.
Сейчас прошу Сообщество помочь в освоении Ардуино.
Задача такая: необходимо вывести на мнемосхему СИМПЛАЙ несколько кнопок и аналоговых сигналов с Ардуино через СОМ порт.
Например: кнопку (открытие двери) и напряжение питания. Это я сделал и все работает. НО!!!
У меня задача отображать значение напряжения до десятых или сотых долей.
Прошу помочь с ошибкой в скетче, по передаче, через MODBUS в СИМПЛАЙТ значения аналогового сигнала (А0, Ардуино НАНО) с десятыми или даже сотыми долями.
Данный скетч выводит напряжение только целым числом.
Прошу не пугаться: данный массив “au16data, 40” написан для для 40 шт (на будущее) адресов датчиков. Планируется МЕГА2560 на подключение 32 датчика.

С Уважением ко всему сообществу!

P.S. чую, что в скетче много лишнего, но проще сделать не умею. Не судите строго, посоветуйте.

#include <ModbusRtu.h>

#define ID 1 // адрес ведомого
#define btnPin 2 // номер входа, подключенный к кнопке
#define stlPin 13 // номер выхода индикатора работы расположен на плате Arduino

const int POT0 = 0;
float adc_voltage0 = 0.0; // Создаем переменную adc_voltage0
float in_voltage0 = 0.0; // Создаем переменную in_voltage0
float R01 = 30000.0; // Задаем номинал резистора R01
float R02 = 7500.0; // Задаем номинал резистора R02
float ref_voltage0 = 5.0; // Задаем опорное напряжение
int adc_value0 = 0; // Создаем переменную для хранения показаний

//Задаём ведомому адрес, последовательный порт, выход управления TX
Modbus slave(ID, 0, 0);
int8_t state = 0;
unsigned long tempus; // массив данных modbus
uint16_t au16data[40];
void setup() { // настраиваем входы и выходы
io_setup(); // настраиваем последовательный порт ведомого
slave.begin( 19200 );
}
void io_setup() {
pinMode(btnPin, INPUT);
io_poll();}

}
void io_poll() {
//Копируем Coil[1] в Discrete[0]
au16data[0] = au16data[1];
//Выводим значение регистра 1.3 на светодиод
void loop() {
// обработка сообщений
adc_value0 = analogRead(POT0); // Считываем показания с аналогово вывода
adc_voltage0 = (adc_value0 * ref_voltage0) / 1024.00; // Определение на входе АЦП
in_voltage0 = adc_voltage0 / (R02/(R01+R02)); // Расчет напряжения

state = slave.poll( au16data, 40 );
//Сохраняем состояние кнопки в регистр 0.3
bitWrite( au16data[0], 2, digitalRead( 2 )); // загружаем в регистр с адресом 2, бит состояния с цифрового входа ардуино 2

au16data[10] = in_voltage0; // загружаем в регистр с адресом 10, данные (напряжение) с аналогового входа ардуино А0 (const int POT0 = 0;)
}

А тут возраст не работает, местные пенсионеры сказали, что тут средний возраст форумчан 60+, так что вот…
а в au16data[10] сколько бит выделено?

16 насколько видно по скетчу…но я не претендую на знания

преклоняюсь над столь почтенным возрастом

извините, чуток не догоняю…можете в данном абзаце скетча исправить, как вы это видите и выложить. А я оперативно проверю

еще раз просмотрел…не пойму что сделать

[ ```
void setup() {
pinMode(13, OUTPUT);
}


Либо **</>** наверху окна редактора сообщения

Извините, это ко мне не относится.....как попало сюда не понимаю.
Мой скетч и вопрос к нему находится выше

Это вставлено неправильно
void io_setup() {
pinMode(btnPin, INPUT);
io_poll();}

}

а это правильно:

void io_setup() {
pinMode(btnPin, INPUT);
io_poll();}

}

Пройдите по ссылке выше и почитайте как вставлять код.

Alexander!
Я так и не понял насчет вставки с апострофами. и не нашел отличий от записи моей

void io_setup() {
pinMode(btnPin, INPUT);
io_poll();}

}

и Вашей

void io_setup() {
pinMode(btnPin, INPUT);
io_poll();}

}

Блин, верю Вам, но понять не могу.

И еще, мой скетч работает, но только хочу, чтоб с аналогового сигнала, напряжение показывало хотя бы с десятыми долями после запятой.

Наверное я тяжелый собеседник

Почему Ваши команды голубого цвета, а у меня нет?

не дошло еще? потому что ваш код вставлен неверно.

Вернитесь и исправьте первое сообщение, иначе на помощь я бы не рассчитывал.
Это как тест на адекватность - если новичок не осилил даже код в в форум вставить - то и говорить с ним не о чем.

1 лайк

Забей тогда, продай ардуину, пива купи. Кот адабряэ.

3 лайка

Размерность регистра Modbus - 16 бит. Размерность float - 32 бита. Поэтому последний передаётся в в двух регистрах, а получающая сторона должна уметь его собрать, а не только получить.

Потому и раздел так называется - “песочница”. :wink:
Натрясли тут)))

1 лайк

насколько я понимаю вы в массив long загружаете значение float ?

Предлагаю ему пива купить и не парицца.

Бей эсторского, чтоб едалекс боялся.

1 лайк