Привет ребята, нужна ваша помощь. Удалось запустить скеч для MPU6050. Он передает данные осей X и Y, в монитор порта с помощью "Kalman.h" . Нужно добавить функцыи, с кнопками и рэле. Но чтобы не путаца решил попробовать пока отдельно написать эти функцыи. Но чтото у меня пока не очень получается. Помогите решить эту задачу. Итак задача... Имеются: КНОПКА1 //кнопка1 обычная тактовая без фиксацый КНОПКА2 //кнопка2 обычная тактовая без фиксацый RELAY1 //реле инверсное RELAY2 //реле инверсное BUZZER //пищалка По умолчанию RELAY1 и RELAY2 отключены. При нажатии на тактовую (кнопку1): Включить (RELAY1) Запомнить покозатели (kalAngleX) Запомнить показатели (kalAngleY) При изменении показателей (kalAngleX) и (kalAngleY), больше или меньше 5 градусов: Включить (RELAY2) //на 60сек Включить (BUZZER) //на 60сек Через 60сек выключить: Выключить (РЕЛЕ2) Выключить (BUZZER) После начать цыкл, как после нажатия (кнопки1) Но есле нажать (кнопку2) то: Выключить (RELAY1) Выключить (RELAY2) есле включено Выключить (BUZZER) если включён. Пробовал написать начало. Вот что получилось: Код (C++): #define BUZZER_PIN 6; // 6 пин Пищалки #define RELAY_PIN 4; //4 пин РЕЛЕ1 #define RELAY_PIN2 5; // 5 пин РЕЛЕ2 #define BUTTON_PIN1 2; // пин для Кнопка1 #define BUTTON_PIN2 3; // пин для Кнопка2 #define BEEP_INTERVAL 1000 // частота включения зуммера, мсек #define BUZZER_TIMEOUT 30UL // длительность звучания зуммера, сек #define RELAY_TIMEOUT2 30UL // длительнасть включения Реле2, сек boolean relayEnable = false; // флаг Реле1 boolean relay2Enable = false; // флаг Реле2 boolean buzzerEnable = false; // флаг Пищалки void setup() { Serial.begin(9600); pinMode(RELAY_PIN, OUTPUT); // Реле1 pinMode(RELAY_PIN2, OUTPUT); // Реле2 pinMode(BUTTON_PIN1, INPUT); // Кнопка1 pinMode(BUTTON_PIN2, INPUT); // Кнопка2 pinMode(BUZZER_PIN, OUTPUT); // Пищалка } void loop() { }
Я так понял нужно использовать опираторы сравнения? Что то типо такого? if (kalAngleX разница записанного числа больше чем на 5 то...) // Здесь я не могу разобратся, как взять это число по нажатию на кнопку1?
Гуглом пользоваться совсем не умеете ? Код (C++): void loop(){ // считываем значения с входа кнопки buttonState = digitalRead(buttonPin); // проверяем нажата ли кнопка // если нажата, то buttonState будет HIGH: if (buttonState == HIGH) { // включаем светодиод digitalWrite(ledPin, HIGH); } else { // выключаем светодиод digitalWrite(ledPin, LOW); } } опЕраторы , типА ... В вашем случае, вместо включения диода, сравниваете ваши переменные и производите нужные действия.
Да тут понятно, сама кнопка это пол беды. А как запомнить значение одной из осей в момент нажатия кнопки1 например kalAngleX и сравнивать её с самим kalAngleX в настоящее время?
Я не знаю как вы считываете данные... но прежде чем скетч выводит данные в ком, он сохраняет их в переменную. Вот эту переменную и нужно сравнивать.. Разберитесь хорошенько со скетчем который вы используете... что и откуда он берет... И уже потом прикручивайте условия... Вам скорее всего нужно не сохранять данные (они должны быть уже сохранены перед выводом в компорт ), а начинать их сравнивать после нажатия кнопки.
Ну видимо выводится две переменные kalAngleX и kalAngleY. Ну пока что хотя бы с одной переменной разобраться. Так... вот она переменная (kalAngleX) и как её запомнить и сравнивать с ней же в настоящее время?
Не пойму, как скопировать отсюда значение переменной (kalAngleX) в момент нажатия кнопки1, и после сравнивать это значение со значением в настоящее время? Например: Значение (kalAngleX) в момент нажатия на кнопку1 было 180 (и оно запомнилось) назовем его (Число1). А через 2 минуты в настоящий момент значение (kalAngleX) изменилось допустим на 190, назовем его (Число2). И по условиям должно сработать реле2 в том случае (Если Число1 больше или меньше Числа2 более чем на 5)
Вводите ещё одну перем нную kalXold например и сохраняете в неё значение kalXold = kalAngleX; , a по нажатию кнопки сравниваете If кнопка нажата и kalXold больше или меньше (как вам нужно) kalAngelX .... Включить реле ....
Как осуществить это сохранение kalXold = kalAngleX в тот момент когда была нажата кнопка? Тоесть чтобы он не копировал одно значение в другое постоянно. А только один раз после нажатия кнопки. Ну и после уже сравнивать их в if...
If кнопка нажата, kalXold = kalAngleX; В чем сложность ? Писать одно условие в другом то же ни кто не запрещает.
Ребят, голова уже закипает))) Как правильно написать такое выражение?? Суть в том чтобы узнать разницу между двумя числами и результат сравнить с числом 5. if (kalXold > kalAngleX || kalXold < kalAngleX) // a больше > чем b на 5 и || a меньше < чем b на 5 или както так? if (kalXold - kalAngleX = Xresult && Xresult > 5 || kalXold + kalAngleX = Xresult && Xresult > 5) // a-b=c, а с в свою очередь >5