//09-2018 //0-Rx-жёлтый провод (Ring у джека), 1-Tx-оранжевый провод (Tip у джека) int POW, A, B, C, D, M, N; //Переменные String U, VER; //для хранения текущих значений состояния прибора EStim bool EStimERR = false; //Флаг ошибки получения данных с EStim uint32_t time = 0; //Переменная для сохранения текущей метки времени (начало отсчета) uint32_t SetTime; //Число милисекунд до срабатывания таймера void setup() { Serial.begin(9600); // инициализируем порт, скорость 9600 pinMode(LED_BUILTIN, OUTPUT); //Включаем использование встроенного светодиода } void loop() { SendCommand("T"); //Получить состояние EStim if ( U == "L" ){ SendCommand("H"); //Установить Power Level в H } if ( M != 12 ){ SendCommand("M12"); //Установить режим Step } if ( D != 65 ){ SendCommand("D65"); //Установить Pulse Feel в 65 } if ( (EStimERR == false) and (A > 0) ){ uint32_t k = 6000; SetTime = uint32_t(A) * k; //Вычисление временного интервала Timer(); } delay(3000); } ////////////////// void EStimRead() { // String S = ""; int charCount = 0; //Счетчик символов в блоке int blockCount = 0; //Счетчик блоков данных EStimERR = false; //Флаг ошибки получения данных с EStim while (Serial.available() ) { char inByte = Serial.read(); //Считанный символ (один байт) if ( (inByte == 58) or (inByte == 10) ) { //58 - двоеточие, 10 - перенос строки LF (признак конца) blockCount++; if ( blockCount > 9 ){ //Если слишком много разделяющих двоеточий (блоков) break; //значит ошибка, выходим из цикла } EStimReadVar(S, blockCount); S = ""; charCount = 0; } else { charCount++; if ( charCount > 5 ){ //Может быть не больше 5 символов в блоке EStimERR = true; break; //иначе ошибка, выходим из цикла } S = S + inByte; } } if ( blockCount < 9 ){ // Должно быть 9 блоков EStimERR = true; } } void EStimReadVar(String &S, int &blockCount) { switch (blockCount) { case 1: POW = S.toInt(); break; case 2: A = S.toInt() / 2; break; case 3: B = S.toInt() / 2; break; case 4: C = S.toInt() / 2; break; case 5: D = S.toInt() / 2; break; case 6: M = S.toInt(); break; case 7: U = S; break; case 8: N = S.toInt(); break; case 9: VER = S; break; } } void SendCommand(String S) { digitalWrite(LED_BUILTIN, HIGH); //Зажигаем светодиод while (Serial.available()) Serial.read(); //Очищаем буфер порта Serial.print(S); //Отправляем команду Serial.print("\r"); //CR - возврат каретки delay(50); //Ждем для стабильности. Минимум 20. EStimRead(); //Считываем и парсим ответ на команду. if ( EStimERR == false){ // Если нет ошибки, то digitalWrite(LED_BUILTIN, LOW); //гасим светодиод } } void Timer() { if( millis()-time > SetTime) // Проверка таймера { if ( EStimERR == false ){ // Если нет ошибки, то увеличиваем текущий уровень int i = A + 1; String S = "A" + String(i); SendCommand(S); time = millis(); } } }