#include <AsyncStream.h>
AsyncStream<100> serial(&Serial, '\n'); // указали Stream-объект и символ конца
//AsyncStream<100> serial(&Serial, '#'); // указали Stream-объект и символ конца
String getValue(); //parse string
int *arrayExChgMapInt[10];
double *arrayExChgMapDbl[10];
//int *A[10];
int DimmValue,TahoSpeed,setpoint,Rejim,Speen,Temper;
double Kp,Ki,Kd;
/*
1 DimmValue текущая Выходная мощность
2 Motor1.TahoSpeed текущая Скорость вращения
3 Rejim Режим стирки (1-11)
4 Speen Выбор скоростного режима (1,2,3,4)
5 Temper Выбор температурного режима (1,2,3,4)
6 setpoint Уставка скорости вращения
1 Kp значение PID Kp
2 Ki значение PID Ki
3 Kd значение PID Kd
*/
int UartNFunction;// номер функции в запросе
int UartNAdress;
double UartValue;
void setup() {
Serial.begin(9600);
// serial.setTimeout(100); // установить другой таймаут
// serial.setEOL('#'); // установить другой терминатор (EOL)
Serial.println("Hello, I'm in a terminal!");
Serial.println();
arrayExChgMapInt[1]=&DimmValue;//текущая Выходная мощность
arrayExChgMapInt[2]=& TahoSpeed;// текущая Скорость вращения
arrayExChgMapInt[3]=& Rejim;// Режим стирки (1-11)
arrayExChgMapInt[4]=& Speen;// Выбор скоростного режима (1,2,3,4)
arrayExChgMapInt[5]=& Temper; // Выбор температурного режима (1,2,3,4)
arrayExChgMapInt[6]=&setpoint;// Уставка скорости вращения
arrayExChgMapDbl[1]=& Kp;// значение PID Kp
arrayExChgMapDbl[2]=& Ki;// значение PID Ki
arrayExChgMapDbl[3]=& Kd; // значение PID Kd
}
void loop() {
SerialInput(); // получение данных от ведущего контроллера от Serial
}
// String var = getValue( StringVar, ',', 2); // if a,4,D,r from 0 would return D
String getValue(String data, char separator, int index) //parse string
{
int found = 0;
int strIndex[] = { 0, -1 };
int maxIndex = data.length();
for (int i = 0; i <= maxIndex && found <= index; i++) {
if (data.charAt(i) == separator || i == maxIndex) {
found++;
strIndex[0] = strIndex[1] + 1;
strIndex[1] = (i == maxIndex) ? i+1 : i;
}
}
return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
} // END
//
/* Карта параметров обмена сделано через два массива указателей arrayExChgMap(10))
если адрес запроса <10 то это целые , значит обращаемся к массиву с Int arrayExChgMapInt
если адрес запроса >10 то это Double , значит обращаемся к массиву с Double arrayExChgMapDbl
№ Name Описание
INT
1 DimmValue текущая Выходная мощность
2 Motor1.TahoSpeed текущая Скорость вращения
3 setpoint Уставка скорости вращения
4 Rejim Режим стирки (1-11)
5 Speen Выбор скоростного режима (1,2,3,4)
6 Temper Выбор температурного режима (1,2,3,4)
Double
1 Kp значение PID Kp
2 Ki значение PID Ki
3 Kd значение PID Kd
*/
void FunctReturnValue(int Adrress,double Value) // вернуть ЕСП по указанному адресу значение из этого же адреса
{
String str;
str.reserve(12);
str.concat("7"); // функция 7- вернуть запрошенное значение
str.concat(";");
str.concat(Adrress);
str.concat(";");
if (Adrress<=10) {Value=*arrayExChgMapInt[Adrress];} //если целочисленные параметры
else {Value=*arrayExChgMapDbl[Adrress-10];}//если адрес больше 10 то это double
str.concat(Value);
Serial.println (str);
}
//
//
void FunctWriteValue(int Adrress,double Value) //Записать в этот контроллер по указанному адресу значение
{ //записать значение
//DimmValue=Value;//Adrress=1 надо как то отключать ПИД?
if (Adrress>5) /* 1-5 нельзя перезаписывать(они только для чтения)*/
{
if (Adrress<=10) {*arrayExChgMapInt[Adrress]=Value;} //если целочисленные параметры
else {*arrayExChgMapDbl[Adrress-10]=Value;}//если адрес больше 10 то это double
}
}
// Kp =0.08;
// Ki += 0.5;
// Kd = 0.0001;
/*формат посылки f;a;v/n f-номер функции a-адрес v-значение (/n-перевод строки)
0-функция 1- адрес 2- значение(или адрес)
Функция:
3 - вернуть значение (ЕСП делает запрос на адрес которого надо вернуть значение )
6 - записать значение (Записать в этот контроллер по указанному адресу значение)
адрес:
1 - выходная мощность
2 - скорость вращения
3 - значение PID Kp
4 - значение PID Ki
5 - значение PID Kd
6 -
*/
void SerialInput()
{
if (serial.available()) { // если данные получены формат посылки f;a;v/n f-номер функции a-адрес v-значение (/n-перевод строки)
String SerialBufer= serial.buf;
//Serial.println(SerialBufer); // выводим их (как char*) test
UartNFunction=getValue( SerialBufer, ';', 0).toInt();
UartNAdress=getValue( SerialBufer, ';', 1).toInt();
UartValue=getValue( SerialBufer, ';', 2).toDouble() ;
switch (UartNFunction) { //0-функция 1- адрес 2- значение(или адрес)
case 3: //вернуть значение
FunctReturnValue(UartNAdress,UartValue); // вернуть ЕСП по указанному адресу значение из этого же адреса
break;
case 6: // записать значение
FunctWriteValue(UartNAdress,UartValue); //Записать в этот контроллер по указанному адресу значение
break;
default:
// statements
break;
}
}
}