Сочинил передатчик на модуле NRF24L01 на управление тремя моторами с двух джойстиков теперь понадобилась дополнительная фишка Подскажите возможно ли по таймеру отсчитать сколько времени был отклонен джойстик и занести в епром а так же запомнить последнее показание со входа этого же джойстика? И как это сделать? Нужно вроде этого нажал кнопку замигал светодиод отклонил стик например на 50 процентов подержал 3 секунды нажал эту же кнопку светодиод потух контроллер запомнил время и положение. Потом нажал вторую кнопку контролер передал данные, из епрома. Сам примерно представляю как занести в епром показания со стика. Вот у меня получился такой код Код (C++): #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <EEPROM.h> }
Почитав еще статьей понял что нет необходимости записывать в епром нужно завести пару переменных в одну записывать показания джойстика во вторую время. Вопрос меняется подскажите пожалуйста как сделать отсчет времени при отклонении джойстика запомнить его и как занести в переименую максимальное значение полученное с аналогово входа?
Отсчет времени делать проще всего так: Код (C++): unsigned long timerT; .... timerT = millis(); Далее разница между millis() и timerT будет являться временем прошедшим с запоминания переменной в миллисекундах. Максимальное значение запоминаете так: создаете переменную типа int, при измерениях analogRead() постоянно сравниваете результат с этой переменной, если результат больше, то записываете его в переменную. Код (C++): vol = analogRead(A0); maxVol = max(vol, maxVol);
Суть передатчика такова Два режима Рабочий режим и Запись при включении запускаем рабочий режим в нем управляем тремя движками Можно управлять джойстиками или нажав на грибок переключаем управление на соответствующий потенциометр у каждой оси свой потенциометр и индикатор режима если горит то потенциометр если не горит то джойстик далее нажав кнопку запись (аналоговая клава) загорелся индикатор записи переключаем циклично все три оси на запись замигал индикатор первой оси Отклонил стик первой оси записал время удержания стика и значение на входе снова нажал кнопку запись замигал индикатор второй оси записал вторую ось снова нажал кнопку запись замигал индикатор третьей оси записал третью ось снова нажал кнопку запись перешел в рабочий режим В рабочем режиме нажал кнопку старт передал значение на входе по таймеру Код делал по найденным примерам. Посмотрите правильно ли я вас понял? Код ниже
Код (C++): #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #define CE_PIN 9 #define CSN_PIN 10 #define JOYSTICK_X A1 //Джойстик ось Х #define JOYSTICK_Y A2 //Джойстик ось Y #define JOYSTICK_Z A3 //Джойстик ось Z #define POT_X A4 //потенциометр ось X #define POT_Y A5 //потенциометр ось Y #define POT_Z A6 //потенциометр ось Z #define BUTON A7 // аналоговые кнопки int val_1; //переменная для оси X int val_2; //переменная для оси Y int val_3; //переменная для оси Z int val_4; //переменная для аналоговых кнопок int maxVolX; //Максимальное значение джойстика int maxVolY; int maxVolZ; const int Xbutton = 2; const int Ybutton = 3; const int Zbutton = 4; const int Xled = 5; const int Yled = 6; const int Zled = 7; int flagVork = 0; int flagX = 0; int flagY = 0; int flagZ = 0; int regimMemor = 1; int regimX = 0; int regimY = 0; int regimZ = 0; int radioBut; int Key0; int Key3; int KeyWork; int KeyAuto; boolean Memor = true; const int ledMemory = 8; unsigned long currentTime; unsigned long TimeX, TimeZ, TimeY; int ledState = LOW; // ledState used to set the LED unsigned long previousMillis = 0; // will store last time LED was updated const long interval = 300; // interval at which to blink (milliseconds) const uint64_t pipe = 0xF0F0F8F110FL; // Define the transmit pipe RF24 radio(CE_PIN, CSN_PIN); // Create a Radio int joystick[4]; // 2 element array holding Joystick readings //int joystick[2]; void setup() { // Serial.begin(9600); radio.begin(); radio.openWritingPipe(pipe); pinMode(Xbutton, INPUT); pinMode(Xled, OUTPUT); digitalWrite(Xled, LOW); pinMode(Ybutton, INPUT); pinMode(Yled, OUTPUT); digitalWrite(Yled, LOW); pinMode(Zbutton, INPUT); pinMode(Zled, OUTPUT); digitalWrite(Zled, LOW); currentTime = millis(); }//--(end setup )--- void loop() { /////////////////////////////////////////////////////////////////////////// if (Memor == true)// Рабочий режим { digitalWrite(ledMemory, LOW); work(); if (KeyRadio() == KeyAuto && regimMemor == 4) { currentTime = millis(); AutoStart(); } if (KeyRadio() == KeyWork && flagVork == 0) //если кнопка нажата { Memor = false; //прерывем рабочий режим regimMemor++; flagVork = 1; if (regimMemor > 4) // если режим больше 3 переходи к режиму 1 { regimMemor = 1; } } if (KeyRadio() == Key0 && flagVork == 1) //Key0 //если кнопка НЕ нажата { flagVork = 0; //обнуляем переменную "knopka" } if (regimMemor == 1) //первый режим ось Х { digitalWrite(Xled, flash());//мигаем светодиодом X Memor = false; memoryX(); // запись в переменную } if (regimMemor == 2) //второй режим ось Y { digitalWrite(Yled, flash()); // мигаем светодиодом Y Memor = false; memoryY(); } if (regimMemor == 3) //третий режим ось Z { digitalWrite(Zled, flash()); // мигаем светодиодом Z Memor = false; memoryZ(); } if (regimMemor == 4) //четвертый режим переходим в рабочий режим { Memor = true; } } // кнопки аналоговые val_4 = analogRead(BUTON), val_3 = map(val_3, 0, 1024, 192, 255); joystick[3] = val_4; radio.write( joystick, sizeof(joystick) ); } int KeyRadio() { analogRead(BUTON); if (radioBut > 1000) return Key0; //if (radioBut < 50) return Key1; //if (radioBut < 250) return Key2; if (radioBut > 450) return Key3; if (radioBut > 650) return KeyWork; if (radioBut > 850) return KeyAuto; return Key0; } int flash() { currentTime = millis(); if (currentTime - previousMillis >= interval) { // save the last time you blinked the LED previousMillis = currentTime; if (ledState == LOW) ledState = HIGH; else ledState = LOW; } } ////////////////////////////////////////////////////////////// void work() { if (digitalRead(Xbutton) == HIGH && flagX == 0) //если кнопка нажата и перемення flag равна 0 , то ... { regimX++; flagX = 1; if (regimX > 1) //ограничим количество режимов { regimX = 0; } } if (digitalRead(Xbutton) == LOW && flagX == 1) //если кнопка НЕ нажата и переменная flag равна - 1 ,то ... { flagX = 0; //обнуляем переменную flag } if (regimX == 0) //первый режим, режим джойстика { digitalWrite(Xled, LOW); //выключаем светодиод val_1 = analogRead(JOYSTICK_X), val_1 = map(val_1, 0, 1024, 0, 63); joystick[0] = val_1; } if (regimX == 1) //второй режим, режим потенциометрa { digitalWrite(Xled, HIGH); //включаем светодиод val_1 = analogRead(POT_X), val_1 = map(val_1, 0, 1024, 0, 63); joystick[0] = val_1; } // ось Y if (digitalRead(Ybutton) == HIGH && flagY == 0) //если кнопка нажата и перемення flag равна 0 , то ... { regimY++; flagY = 1; if (regimY > 1) //ограничим количество режимов { regimY = 0; } } if (digitalRead(Ybutton) == LOW && flagY == 1) //если кнопка НЕ нажата и переменная flag равна - 1 ,то ... { flagY = 0; //обнуляем переменную flag } if (regimY == 0) //первый режим, режим джойстика { digitalWrite(Yled, LOW); //выключаем светодиод val_2 = analogRead(JOYSTICK_Y), val_2 = map(val_2, 0, 1024, 64, 127); joystick[1] = val_2; } if (regimY == 1) //второй режим, режим потенциометрa { digitalWrite(Yled, HIGH); //включаем светодиод val_2 = analogRead(POT_Y), val_2 = map(val_2, 0, 1024, 64, 127); joystick[1] = val_2; } // ось Z if (digitalRead(Zbutton) == HIGH && flagZ == 0) //если кнопка нажата и перемення flag равна 0 , то ... { regimZ++; flagZ = 1; if (regimZ > 1) //ограничим количество режимов { regimZ = 0; } } if (digitalRead(Zbutton) == LOW && flagZ == 1) //если кнопка НЕ нажата и переменная flag равна - 1 ,то ... { flagZ = 0; //обнуляем переменную flag } if (regimZ == 0) //первый режим режим джойстика { digitalWrite(Zled, LOW); //выключаем светодиод val_3 = analogRead(JOYSTICK_Z), val_3 = map(val_3, 0, 1024, 128, 191); joystick[2] = val_3; } if (regimZ == 1) //второй режим режим потенциометрa { digitalWrite(Zled, HIGH); //включаем светодиод val_3 = analogRead(POT_Z), val_3 = map(val_3, 0, 1024, 128, 191); joystick[2] = val_3; } } //____________________Запись_________________// void memoryX() { if (Memor == false)// Прерываем рабочий режим { currentTime = millis(); // считываем время, прошедшее с момента запуска программы digitalWrite(ledMemory, HIGH); // ось Х val_1 = analogRead(JOYSTICK_X), val_1 = map(val_1, 0, 1024, 0, 63); joystick[0] = val_1;// передаем данные if (val_1 > 85 && val_1 < 95) // шевельнули джойстик { val_1 = maxVolX , maxVolX = map(maxVolX, 0, 1024, 0, 63); // Будем передавать в режиме запуска автомата joystick[0] = maxVolX; TimeX = currentTime;// записываем новое значение } } } void memoryY() { if (Memor == false) { currentTime = millis(); // считываем время, прошедшее с момента запуска программы digitalWrite(ledMemory, HIGH); // ось Y val_2 = analogRead(JOYSTICK_Y), val_2 = map(val_2, 0, 1024, 64, 127); joystick[1] = val_2; if (val_2 > 85 && val_2 < 95) // шевельнули джойстик { val_2 = maxVolY , maxVolY = map(maxVolY, 0, 1024, 64, 127); // Будем передавать в режиме запуска автомата joystick[0] = maxVolX; TimeY = currentTime;// записываем новое значение } } } void memoryZ() { if (Memor == false) { currentTime = millis(); // считываем время, прошедшее с момента запуска программы digitalWrite(ledMemory, HIGH); // ось Z val_3 = analogRead(JOYSTICK_Z), val_3 = map(val_3, 0, 1024, 128, 191); joystick[2] = val_3; if (val_3 > 85 && val_3 < 95) // шевельнули джойстик { val_3 = maxVolY , maxVolZ = map(maxVolZ, 0, 1024, 128, 191); TimeZ = currentTime; } } } void AutoStart() { digitalWrite(ledMemory, flash()); regimX = 0; regimY = 0; regimZ = 0; if (currentTime <= (TimeX )) // сравниваем текущий таймер с константой TimeX { joystick[0] = maxVolX; } if (currentTime <= (TimeY )) { joystick[1] = maxVolY; } if (currentTime <= (TimeY )) { joystick[3] = maxVolZ; } }
Что то я не пойму какая из этих переменных будет сохранять максимальный уровень отклонения стика? И что произойдет если я отпущу стик переменная поменяет свое значение?
Спасибо! Посмотрите в моем случае правильно сделал? Железо просто еще жду в пути. Проверить не на чем. vol заменил на volumX analogRead(A0) у меня уже в val_1; maxVol = max(vol, maxVol); заменил на maxVolX = max(volumX, maxVolX); Код (C++): void loop() { // put your main code here, to run repeatedly: } void memoryX() { if (Memor == false)// Прерываем рабочий режим { currentTime = millis(); // считываем время, прошедшее с момента запуска программы digitalWrite(ledMemory, HIGH); // ось Х val_1 = analogRead(JOYSTICK_X), val_1 = map(val_1, 0, 1024, 0, 63); joystick[0] = val_1;// передаем данные if (val_1 > 85 && val_1 < 95) // шевельнули джойстик { volumX = val_1; maxVolX = max(volumX, maxVolX); maxVolX = map(maxVolX, 0, 1024, 0, 63); // Будем передавать в режиме запуска автомата joystick[0] = maxVolX; TimeX = currentTime;// записываем новое значение } } }
И еще один вопрос возник объясните пожалуйста что происходит в этой строке Что означает ? и : Код (C++): digitalWrite(13, (output==HIGH) ? output=LOW : output=HIGH);
Код (C++): //Запись output==HIGH ? output=LOW : output=HIGH //читается как if (output==HIGH) output=LOW; else output=HIGH;