Всем доброе время суток!
Когда-то возможно, я вашим родителям или родственникам, или родным тоже помогал.
Чинил всякую электронную утварь. От ламповых телевизоров до Японских видеомагнитофонов и далее. Но дело прошлое.
Сейчас прошу Сообщество помочь в освоении Ардуино.
Задача такая: необходимо вывести на мнемосхему СИМПЛАЙ несколько кнопок и аналоговых сигналов с Ардуино через СОМ порт.
Например: кнопку (открытие двери) и напряжение питания. Это я сделал и все работает. НО!!!
У меня задача отображать значение напряжения до десятых или сотых долей.
Прошу помочь с ошибкой в скетче, по передаче, через 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;)
}