столкнулся с проблемой передачи данных с нескольких таймеров на уно+ мультифункц.шилд с алиэкспресс. первый слейв четко передаёт переменную в комп (использую скаду simpLight) так вот в чём беда
пока передает первый слейв моя переменная времени тикает на экране ПК только на нём, второй слейв замирает на выбранном времени, хотя тоже запущен, но если нажать на паузу, то цифры обновятся (только в неподвижном состоянии в общем передаёт с 2го слейва) ткните носом пожалуйста
вот код
#include TimerOne.h>
#include ModbusRtu.h>
#include Wire.h>
#include MultiFuncShield.h>
#define CLK 5
#define DT 6
#define SW A5
#include "GyverEncoder.h"
#define ID 1 // адрес ведомого
#define TxEnablePin_1 9 // Tx/Rx пин RS485
#define rxPin 0
#define txPin 1
Modbus slave(ID, 1, 9);
Encoder enc1(CLK, DT, SW);
enum CountDownModeValues
{
COUNTING_STOPPED,
COUNTING
};
unsigned long millis1,millis2;
// строка для получаемых данных
String inputString0 = "";
// признак конца строки
boolean stringComplete9 = false;
long prevmicros = 0;
byte countDownMode = COUNTING_STOPPED;
String sekChar; // Переменная для преобразования числового значения секунд в строковое.
String minuChar; // Переменная для преобразования числового значения минут в строковое.
byte tenths = 0;
char seconds = 0;
char minutes = 1;
int8_t state = 0; //
uint16_t au16data[11];
unsigned long tempus;
String times2;
int a;
int b = 1;
int intVar;
String stringVar = times2;
void setup() {
tempus = millis() + 100;
pinMode(TxEnablePin_1, OUTPUT);
Timer1.initialize();
MFS.initialize(&Timer1); // initialize multifunction shield library
MFS.write(0);
slave.begin( 115200 );
enc1.setType(TYPE1); // тип энкодера TYPE1 одношаговый, TYPE2 двухшаговый. Если ваш энкодер работает странно, смените тип
}
void loop() {
// put your main code here, to run repeatedly:
enc1.tick();
byte btn = MFS.getButton();
if (enc1.isRight()) {delay (100);
minutes++; // если был поворот направо, увеличиваем на 1
if (minutes > 60)
{
minutes = 0;
}
MFS.write(minutes*100 + seconds);}
if (enc1.isLeft()) {delay (100);
minutes--; // если был поворот направо, увеличиваем на 1
if (minutes < 0)
{
minutes = 0;
}
MFS.write(minutes*100 + seconds);}
if (btn == BUTTON_3_PRESSED || btn == BUTTON_3_LONG_PRESSED)
{MFS.beep(100, 100, 4); // beep 3 times, 500 milliseconds on / 500 off
minutes += 59;
if (minutes <= 60)
{
minutes = 59;
}
MFS.write(minutes*100 + seconds);
}
switch (countDownMode)
{
case COUNTING_STOPPED:
if (btn == BUTTON_1_SHORT_RELEASE && (minutes + seconds) > 0)
{
// start the timer
countDownMode = COUNTING;
}
else if(enc1.isHold())
{if(digitalRead(SW))
// start the timer
countDownMode = COUNTING;
}
else if (btn == BUTTON_1_LONG_PRESSED)
{
// reset the timer
tenths = 0;
seconds = 0;
minutes = 1;
MFS.write(minutes*100 + seconds);
}
else if (btn == BUTTON_2_PRESSED || btn == BUTTON_2_LONG_PRESSED)
{
minutes++;
if (minutes > 60)
{
minutes = 0;
}
MFS.write(minutes*100 + seconds);
}
else if (btn == BUTTON_3_PRESSED || btn == BUTTON_3_LONG_PRESSED)
{
minutes += 59;
if (minutes <= 60)
{
minutes = 59;
}
MFS.write(minutes*100 + seconds);
}
break;
case COUNTING:
if (btn == BUTTON_1_SHORT_RELEASE || btn == BUTTON_1_LONG_RELEASE)
{
// stop the timer
countDownMode = COUNTING_STOPPED;
}
else
{
// continue counting down
tenths++;
if (tenths == 10)
{
tenths = 0;
seconds--;
if (seconds < 0 && minutes > 0)
{
seconds = 59;
minutes--;
}
if (minutes == 0 && seconds == 0)
{
// timer has reached 0, so sound the alarm
MFS.beep(50, 50, 10); // beep 3 times, 500 milliseconds on / 500 off
countDownMode = COUNTING_STOPPED;
}
MFS.write(minutes*100 + seconds);
}
delay(100);
}
break;
// обработка сообщений
} {state = slave.poll( au16data,11);
// если получили пакет без ошибок - зажигаем светодиод на 50 мс
if (state > 4) {
tempus = millis() + 500;
}
if (millis() > tempus)
io_poll();
}
}
void io_setup(){}
void io_poll(){
a=minutes;
b=seconds;
minuChar=a;
sekChar=b;
times2=minuChar +sekChar;
int intVar;
String stringVar = times2;
intVar=stringVar.toInt();
au16data[1] = intVar;
}
Вопрос задан
более трёх лет назад
256 просмотров