Нужна помощь со скетчем (Реле и кнопки )

Lexan
Offline
Зарегистрирован: 12.02.2016
Привет ребята, нужна ваша помощь.
Удалось запустить скеч для MPU6050. Он передает данные осей X и Y, в монитор порта. К нему, нужно добавить функцыи, с кнопками и рэле. Но чтобы не путаца решил попробовать пока отдельно написать эти функцыи.
 
Но чтото у меня пока не очень получается. Помогите решить эту задачу.
 
 
 
Итак задача...
 
Имеются:
        КНОПКА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) если включён. 
 
 
 
Пробовал написать начало. Вот что получилось:
#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() {
  

}

 

 
Lexan
Offline
Зарегистрирован: 12.02.2016

Как запомнить показатели (kalAngleX) и (kalAngleY) после нажатия кнопки?

Lexan
Offline
Зарегистрирован: 12.02.2016

Я так понял нужно использовать опираторы сравнения?

Что то типо такого?

if (разница между kalAngleX и  записанным ранее kalAngleX числом более чем 5 то...) // Здесь я не могу разобратся, как взять это число по нажатию на кнопку1?

 
 

 

vk007
Offline
Зарегистрирован: 16.06.2015

Lexan пишет:

Как запомнить показатели (kalAngleX) и (kalAngleY) после нажатия кнопки?

Элементарно:

double someVariableAfterClickingX = kalAngleX;
double someVariableAfterClickingY = kalAngleY;

 

Lexan
Offline
Зарегистрирован: 12.02.2016

тоесть double означает копировать?

vk007
Offline
Зарегистрирован: 16.06.2015

double означает двойной, двуспальный, двукратный, сдвоенный...

Lexan
Offline
Зарегистрирован: 12.02.2016

Не пойму, как скопировать  значение переменной (kalAngleX) в момент нажатия кнопки1, и после сравнивать это значение со значением в настоящее время?

Например: 
Значение (kalAngleX) в момент нажатия на кнопку1 было 180 (и оно запомнилось) назовем его (Число1).
А через 2 минуты в настоящий момент значение (kalAngleX) изменилось допустим на 190, назовем его(Число2).
И по условиям должно сработать реле2 в том случае (Если Число1 больше или меньше Числа2 более чем на 5)

 

 

 

vk007
Offline
Зарегистрирован: 16.06.2015
double Chislo1 = kalAngleX;  // где-то в обработчике кнопки1 в момент ее нажатия

// ...  прошло 2 минуты

if (abs(Chislo1 - kalAngleX) > 5.0) digitalWrite(RELAY_PIN2, HIGH);  // или LOW, если реле включается низким уровнем

 

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

странно, в этой теме, связанной с кнопками Клапауций ничего не написал про Титановый велосипед для тактильной кнопки... ладно, нужно исправить это недоразумение. http://arduino.ru/forum/programmirovanie/klass-titanovyi-velosiped-dlya-taktovoi-knopki по этой ссылке ты узнаешь как прикрутить кнопки. Также поизучай типы данных double это тоже самое что и float - тип данных для хранения чисел с плавающей запятой. Еще нужно blink without delay. смысл в том что при наступлении тех условий что тебе нужно (температура там больше или меньше либо кнопка нажата) ты сохраняешь время в какой нибудь переменой (для времени лучше unsigned long), а потом эту переменную сравниваешь с текущем значением millis() и смотришь, прошли ли нужные 60 сек или нет. Кстати динамик просто так пищать не будет, тут нужна функция tone() или самодельная какая нибудь...

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

Mr.Privet пишет:

странно, в этой теме, связанной с кнопками Клапауций ничего не написал про Титановый велосипед для тактильной кнопки...

...тактовой кнопки.

да - странно, что я на входе в форум всех новичков не луплю дубиной по голове не сбрасываю в подвал с титановыми велосипедами.

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Клапауций 322 пишет:

да - странно, что я на входе в форум всех новичков не луплю дубиной по голове не сбрасываю в подвал с титановыми велосипедами.

Пусть сперва сами помучаются)

Lexan
Offline
Зарегистрирован: 12.02.2016

Ребята, дубиной и велосипедом по голове ненадо, уж лучше я помучаюсь)))

Но вы всётаки подсказывайте, ведь в диалоге с преподователями предмет можно изучить быстрей :)

 

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Lexan пишет:

Но вы всётаки подсказывайте, ведь в диалоге с преподователями предмет можно изучить быстрей :)

Ну вектор полета тебе был задан, если что непонятно спрашивай, пиши код, выкладывай куски или весь. где ошибка есть какая то тебе подскажут, но писать код за тебя никто не станет...

Lexan
Offline
Зарегистрирован: 12.02.2016

Хорошо, я полетел )

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

Очень понравился вопрос про double. В связи с чем - история:

ПРЕАМБУЛА

Как-то давно, мой одноклассник, работающий в банке, вместе со своим начальником съездил в командировку в город Лондон, тот самый который "из зе кэпитал ов...".

Я - говорю по аглицки бегло, читаю - раза в два медленнее, чем по русски, и считаю, что знаю не очень и надо бы получше,

одноклассник мой, основываясь на том, что в чате Рейтерс-диллинга его все понимали - считал, что знает достаточно,

но его начальник - это песня - Мутко мог быть для него гуру, но считал он, что говорит свободно!

ИСТОРИЯ

После поездки начальник спрашивает моего одноклассника: Все, мол, понятно, английский - простой язык, только ты объясни мне одно слово: вот англичане все время "get" говорят, что этот "get" значит?

---------------

Мне уже 46 лет, я уже знаю не только аглицкий, но внятно ответить на вопрос - не могу! ;)

Вот и про double и оператор присваивания - точно также. Я могу представить на форуме человека, которые не уверенно пишет на С, просто потому, что он старый и писал всю жизнь базы на фокспро или коболе. Даже страшный PL-1, и тот не оставляет на мозге неустранимых рубцов.

Но никак не могу понять человека, который вообще не знает даже основ программирования, но купившего ардуино. Зачем? Запакуйте его, если сохранилась упаковка и отправьте обратно продавцу, возможно вернут деньги.

Такой человек правда считает, что можно научиться программированию на форуме?

Керниган, Ричи, Язык программирования С. Там, в зависимости от издания около 120 страниц. Хотя бы первую треть прочитайте, а потом приходите на форум.

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

wdrakula пишет:

Но никак не могу понять человека, который вообще не знает даже основ програмирования, но купившего ардуино. Зачем? Запакуйте его, если сохранилась упаковка и отправьте обратно продавцу, возможно вернут деньги.

а, если купить программируемый калькулятор, то дуино после него покажется раем.

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

Что бы не было неуместных обидок:

На Ваш вопрос просто нельзя ответить коротко и понятно.

Если Вы спрашиваете, "что тако double" значит Вы совсем ничего не знаете.

Коротко я отвечу - но Вам нужен курс программирования минимум на пару месяцев, если интенсивно. Вы просто ничего не поймете, но Ваше право, читайте:

Результат предыдущего измерения хранить в специальной переменной. Причем ни разу не double, так как все измерения в ардуино не точнее 10 бит.

Завести переменную для состояния со значениями:

1. начальное состояние;

2. состояние отслеживания (после нажатия кн1 и после обработко отклонений)

3. обнаружено отклонение, пищим баззером и ждем 60 сек.

(эти 60 секунд  отслеживать в специальной переменной "время после обнаружения отклонения")

========

Вы ведь ничего не поняли, так? Поэтому читайте Кернигана и Ричи и возвращайтесь поумнев немного.

 

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

wdrakula пишет:

Вы ведь ничего не поняли, так? Поэтому читайте Кернигана и Ричи и возвращайтесь поумнев немного.

или купите козу программируемый калькулятор.

Lexan
Offline
Зарегистрирован: 12.02.2016

Ребят, я честно прочитал первых 3-4 страницы пособие по СИ Керна и Ричи к ВВЕДЕНИЮ и СОДЕРЖАНИЮ не относится ))

Да, конечно я согласен это совсем не густо. Я там только самые азы прочел и то не все. Кое что подчерпнул в роликах ютуба. Там когда пишут, и тут же объясняют, то очень легко и быстро понять что к чему. Но всё дело во времени, у меня просто нет столько времени, чтобы читать книги, а роликов в ютубе понятных для новичков, к сожалению очень мало.

Вот поэтому и пишу на форум. Здесь спросишь и грамотные люди сразу подталкивают в нужном направлении, что читать и как писать. И я за это им очень благодарен. Жил бы рядом купил бы пиво с рыбкой ;)

 А если пытаться одному, и всё по книгам то я свой скеч наверное следующей зимой закончу. Ито это в лучшем случае. ))

Обид не каких нет. За критику даже спасибо, строго но зато честно и справедливо. Буду знать на что расчитывать с моим богажом... ))

Ну что я могу сказать, да буду читать книгу. Но думаю изучать её когда пишешь скеч и общаешся с людьми будет проще и быстрей. Надеюсь вы непротив того что я буду продолжать общатся с вами и изучать СИ поролельно???

 

vk007
Offline
Зарегистрирован: 16.06.2015

wdrakula пишет:
Результат предыдущего измерения хранить в специальной переменной. Причем ни разу не double, так как все измерения в ардуино не точнее 10 бит.

Ну double я впихнул не просто так, хоть и для ардуины что double, что float.

Так как ТС ни скетча, ни библиотеки не то что не привел, а даже и ссылок на них не дал,то я не поленился и погуглил сам. И нагуглил я, что переменная kalAngleX имеет тип double. А поскольку "по квитанции корова рыжая одна! Брали мы ее одну по квитанции! Сдавать будем одну", то и временную переменную я тоже сделал такого же типа "чтоб не нарушать отчетности!"

Lexan
Offline
Зарегистрирован: 12.02.2016

Да действительно, это я неподумав сделал. Просто хотел сначало с кнопками и переменными разобратся, чтобы не запутатся. Но теперь понемаю что зря.. )

Вот скеч, естественно писал не я, просто нашол на просторах интернета. С ним удалось получать данные осей X и Y в монтеторе компорта. Буквально выгледит так

X:180 Y:180

 

#include <Wire.h>
#include "Kalman.h"
Kalman kalmanX;
Kalman kalmanY;
uint8_t IMUAddress = 0x68;
/* IMU Data */
int16_t accX;
int16_t accY;
int16_t accZ;
int16_t tempRaw;
int16_t gyroX;
int16_t gyroY;
int16_t gyroZ;
double accXangle; // Angle calculate using the accelerometer
double accYangle;
double temp;
double gyroXangle = 180; // Angle calculate using the gyro
double gyroYangle = 180;
double compAngleX = 180; // Calculate the angle using a Kalman filter
double compAngleY = 180;
double kalAngleX; // Calculate the angle using a Kalman filter
double kalAngleY;
uint32_t timer;

void setup() {
  Wire.begin();
  Serial.begin(9600);
  i2cWrite(0x6B,0x00); // Disable sleep mode      
  kalmanX.setAngle(180); // Set starting angle
  kalmanY.setAngle(180);
  timer = micros();
}
void loop() {
  /* Update all the values */a
  uint8_t* data = i2cRead(0x3B,14);
  accX = ((data[0] << 8) | data[1]);
  accY = ((data[2] << 8) | data[3]);
  accZ = ((data[4] << 8) | data[5]);
  tempRaw = ((data[6] << 8) | data[7]);
  gyroX = ((data[8] << 8) | data[9]);
  gyroY = ((data[10] << 8) | data[11]);
  gyroZ = ((data[12] << 8) | data[13]);
  /* Calculate the angls based on the different sensors and algorithm */
  accYangle = (atan2(accX,accZ)+PI)*RAD_TO_DEG;
  accXangle = (atan2(accY,accZ)+PI)*RAD_TO_DEG;  
  double gyroXrate = (double)gyroX/131.0;
  double gyroYrate = -((double)gyroY/131.0);
  gyroXangle += kalmanX.getRate()*((double)(micros()-timer)/1000000); // Calculate gyro angle using the unbiased rate
  gyroYangle += kalmanY.getRate()*((double)(micros()-timer)/1000000);
  kalAngleX = kalmanX.getAngle(accXangle, gyroXrate, (double)(micros()-timer)/1000000); // Calculate the angle using a Kalman filter
  kalAngleY = kalmanY.getAngle(accYangle, gyroYrate, (double)(micros()-timer)/1000000);
  timer = micros();
Serial.println();
    Serial.print("X:");
    Serial.print(kalAngleX,0);
    Serial.print(" ");
    Serial.print("Y:");
    Serial.print(kalAngleY,0);
    Serial.println(" ");
  // The accelerometer's maximum samples rate is 1kHz
}
void i2cWrite(uint8_t registerAddress, uint8_t data){
  Wire.beginTransmission(IMUAddress);
  Wire.write(registerAddress);
  Wire.write(data);
  Wire.endTransmission(); // Send stop
}
uint8_t* i2cRead(uint8_t registerAddress, uint8_t nbytes) {
  uint8_t data[nbytes];
  Wire.beginTransmission(IMUAddress);
  Wire.write(registerAddress);
  Wire.endTransmission(false); // Don't release the bus
  Wire.requestFrom(IMUAddress, nbytes); // Send a repeated start and then release the bus after reading
  for(uint8_t i = 0; i < nbytes; i++)
    data [i]= Wire.read();
  return data;
}

 

Lexan
Offline
Зарегистрирован: 12.02.2016

Ребят посоветуйте какое издание Кернигана и Ричи лучше? У меня 3-е издание V0.1

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

Lexan пишет:

Ребят посоветуйте какое издание Кернигана и Ричи лучше? У меня 3-е издание V0.1

да, никакое, пока не настроишься на волну - читай пока это Программирование

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

Еще выше хотел попросить: пропускайте свой текст через проверку орфографии. Грамма-наци тут нет, форум технический и мистайпинг бывает у всех. Но мистайпинг - одно, а АшиПки - немного режут глаза.

Ясно, тут нет В.Г. Белинского, всего такого неистового, но проявите немного уважения.

сначалО

понЕмаю

монЕторе

выглЕдит

------------------

Я - зае...лся, прошу прощения!

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

Клапауций 322 пишет:

да, никакое, пока не настроишься на волну - читай пока это Программирование

Не могу согласиться, брат.

Читать описание методов и функций библиотеки wiring нет смысла, пока непонятно, что такое переменная, инструкция, оператор, параметр, значение и указатель, поток управления, прерывание.

Я уже даже не упоминаю про классы, методы, наследование, конструкторы и перегрузку, а то ведь крыша может поехать.

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

Lexan пишет:

Ребят посоветуйте какое издание Кернигана и Ричи лучше? У меня 3-е издание V0.1

Любое. И попроси друга поставить Linux на виртуалку, не забыв поставить компилятор.

В Линухе он ТОЧНО такой, как описан у Кернигана и Ричи. Даже откомпилированный файл называется a.out, как в книжке. Только он вызывается командой gcc, а не cc. Это единственное различие. Вот прямо по книжке, решая задачки к каждой главе, вот так и двигайся.

В среде Ардуино используется тот же самый компилятор gcc. 

Все, без исключения все, люди моего поколения, кто пишет на С - начинали с этой книжки. Молодежь, иногда, начинает со всяких "верхних" языков, типа C#, Python, JS, php.

Но мы с гневом отвергает такой подход! ;)

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

wdrakula пишет:

Но мы с гневом отвергает такой подход! ;)

у кого не было программируемого калькулятора, тот не умеет гневаться.

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

Клапауций 322 пишет:

у кого не было программируемого калькулятора, тот не умеет гневаться.

Каюсь, не было. Но был БК-0010, 64К, с клавой от ХТ, программы с магнитофона, о эти божественные звуки!

Я лабу по военной кафедре на нем делал. Принтера не было - переписывал результаты от руки.

Lexan
Offline
Зарегистрирован: 12.02.2016

Ребят, ну как, косяков много? )) 

Я хоть суть велосипеда понял? Или не очень  ))

Нужно ли писать в начале флаги состояния реле? (реле инверсное)

 

 


#include <class_BUTTON.h>
BUTTON BUTTON_01(2);  // Кнопка1 для включения реле1
BUTTON BUTTON_02(3);  // Кнопка2 для отключения реле1 и реле2
#define RELAY01_PIN 4; 
#define RELAY02_PIN 5; 
#define BUZZER_PIN 6;
boolean relay1Enable = false; //флаг состояния реле1
boolean relay2Enable = false; //флаг состояния реле2

void setup() {
  Serial.begin(9600);
  pinMode(BUTTON_01, INPUT);
  pinMode(BUTTON_02, INPUT);
  pinMode(RELAY01_PIN, OUTPUT);
  pinMode(RELAY02_PIN, OUTPUT);
  pinMode(BUZZER_PIN, OUTPUT);

}

void loop() {

  BUTTON_01.read();
  BUTTON_02.read();  
  
  if (BUTTON_01.click_down) {
    relay1Enable = true;
    Serial.println("Relay1 ON");
    }                                  //кнопка1 включает реле1 
     
      
  if (BUTTON_02.click_down) {
    relay1Enable = false;
    relay2Enable = false; //кнопка2 выключает реле1 и реле2
      Serial.println("Relay1 OFF\n");
      Serial.println("Relay2 OFF\n");
     }

}

 

 

У меня когда-то был микроша я кажется догадываюсь о каких звуках идёт речь )))

Буззер и включение реле2 пока не трогал.

vk007
Offline
Зарегистрирован: 16.06.2015

Это как позвонить друзьям и сказать "Друганы, я пиво купил! Приходите". Друганы пришли, а пива и нету! Могут ведь и по шапке надавать.

Так и тут, ненужный флаг (типа отвечающий за состояния реле) зачем-то взвел, но реле не включил.

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

это лишнее:

07 boolean relay1Enable = false//флаг состояния реле1
08 boolean relay2Enable = false//флаг состояния реле2

реле включается digitalWrite(pin, value) http://arduino.ru/Reference/DigitalWrite

это не нужно - это делает класс:

 

12   pinMode(BUTTON_01, INPUT);
13   pinMode(BUTTON_02, INPUT);

 

Lexan
Offline
Зарегистрирован: 12.02.2016

Исправил :)

Но что-то ошибок целую кучу показывает, после компиляции. Не пойму вроде ничего не пропустил...

 

#include <class_BUTTON.h>
BUTTON BUTTON_01(2);  // Кнопка1 для включения реле1
BUTTON BUTTON_02(3);  // Кнопка2 для отключения реле1 и реле2
#define RELAY_01 4; 
#define RELAY_02 5; 
#define BUZZER 6;


void setup() {
  Serial.begin(9600);
  pinMode(RELAY_01, OUTPUT);
  pinMode(RELAY_02, OUTPUT);
  pinMode(BUZZER, OUTPUT);

}

void loop() {

  BUTTON_01.read();
  BUTTON_02.read(); 
  
  if (BUTTON_01.click_down) {        //кнопка1 включает реле1   
    digitalWrite(RELEY_01, HIGH);
      Serial.println("Relay1 ON\n"); 
    }                                  
     
      
  if (BUTTON_02.click_down) {         //кнопка2 выключает реле1, реле2 и бузер
    digitalWrite(RELAY_01, LOW);
    digitalWrite(RELAY_02, LOW);
    digitalWrite(BUZZER, LOW);
      Serial.println("Relay1 OFF\n");
      Serial.println("Relay2 OFF\n");
      Serial.println("BUZZER OFF\n");
     }

}

 

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

RELEY_01

RELAY_01

#define RELAY_01 4
#define RELAY_02 5
#define BUZZER 6

*включи подробные логи в настройках ИДЕ

и, не понятно, зачем выключать реле 2 и буззер, если они у тебя никогда не включаются?

Lexan
Offline
Зарегистрирован: 12.02.2016
Спасибо, исправил...
Включатель Реле2 и буззера пока в разработке :)
 
А вот лог, только он что-то киллометровый получился ))
 
C:\Program Files (x86)\Arduino\arduino-builder -dump-prefs -logger=machine -hardware "C:\Program Files (x86)\Arduino\hardware" -tools "C:\Program Files (x86)\Arduino\tools-builder" -tools "C:\Program Files (x86)\Arduino\hardware\tools\avr" -built-in-libraries "C:\Program Files (x86)\Arduino\libraries" -libraries "C:\Users\Lexan\Documents\Arduino\libraries" -fqbn=arduino:avr:nano:cpu=atmega328 -ide-version=10608 -build-path "C:\Temp\build7ef658aa2d54d91aed9664e7a8b1f7c1.tmp" -warnings=default -prefs=build.warn_data_percentage=75 -verbose "C:\Users\Lexan\Documents\Arduino\Klass_Velosiped_Knopki\Klass_Velosiped_Knopki.ino"
C:\Program Files (x86)\Arduino\arduino-builder -compile -logger=machine -hardware "C:\Program Files (x86)\Arduino\hardware" -tools "C:\Program Files (x86)\Arduino\tools-builder" -tools "C:\Program Files (x86)\Arduino\hardware\tools\avr" -built-in-libraries "C:\Program Files (x86)\Arduino\libraries" -libraries "C:\Users\Lexan\Documents\Arduino\libraries" -fqbn=arduino:avr:nano:cpu=atmega328 -ide-version=10608 -build-path "C:\Temp\build7ef658aa2d54d91aed9664e7a8b1f7c1.tmp" -warnings=default -prefs=build.warn_data_percentage=75 -verbose "C:\Users\Lexan\Documents\Arduino\Klass_Velosiped_Knopki\Klass_Velosiped_Knopki.ino"
"C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics  -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10608 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR   "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs" "C:\Temp\build7ef658aa2d54d91aed9664e7a8b1f7c1.tmp\sketch\Klass_Velosiped_Knopki.ino.cpp" -o "nul"
"C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics  -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10608 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR   "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs" "-IC:\Users\Lexan\Documents\Arduino\libraries\class_BUTTON" "C:\Temp\build7ef658aa2d54d91aed9664e7a8b1f7c1.tmp\sketch\Klass_Velosiped_Knopki.ino.cpp" -o "nul"
"C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics  -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10608 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR   "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs" "-IC:\Users\Lexan\Documents\Arduino\libraries\class_BUTTON" "C:\Temp\build7ef658aa2d54d91aed9664e7a8b1f7c1.tmp\sketch\Klass_Velosiped_Knopki.ino.cpp" -o "nul"
"C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics  -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10608 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR   "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs" "-IC:\Users\Lexan\Documents\Arduino\libraries\class_BUTTON" "C:\Temp\build7ef658aa2d54d91aed9664e7a8b1f7c1.tmp\sketch\Klass_Velosiped_Knopki.ino.cpp" -o "C:\Temp\build7ef658aa2d54d91aed9664e7a8b1f7c1.tmp\preproc\ctags_target_for_gcc_minus_e.cpp"
"C:\Program Files (x86)\Arduino\tools-builder\ctags\5.8-arduino10/ctags" -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives "C:\Temp\build7ef658aa2d54d91aed9664e7a8b1f7c1.tmp\preproc\ctags_target_for_gcc_minus_e.cpp"
"C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os  -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10608 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR   "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs" "-IC:\Users\Lexan\Documents\Arduino\libraries\class_BUTTON" "C:\Temp\build7ef658aa2d54d91aed9664e7a8b1f7c1.tmp\sketch\Klass_Velosiped_Knopki.ino.cpp" -o "C:\Temp\build7ef658aa2d54d91aed9664e7a8b1f7c1.tmp\sketch\Klass_Velosiped_Knopki.ino.cpp.o"
C:\Users\Lexan\Documents\Arduino\Klass_Velosiped_Knopki\Klass_Velosiped_Knopki.ino: In function 'void setup()':
 
Klass_Velosiped_Knopki:4: error: expected ')' before ';' token
 
 #define RELAY_01 4; 
 
                   ^
 
C:\Users\Lexan\Documents\Arduino\Klass_Velosiped_Knopki\Klass_Velosiped_Knopki.ino:11:11: note: in expansion of macro 'RELAY_01'
 
   pinMode(RELAY_01, OUTPUT);
 
           ^
 
Klass_Velosiped_Knopki:11: error: expected primary-expression before ',' token
 
   pinMode(RELAY_01, OUTPUT);
 
                   ^
 
Klass_Velosiped_Knopki:11: error: expected ';' before ')' token
 
   pinMode(RELAY_01, OUTPUT);
 
                           ^
 
Klass_Velosiped_Knopki:5: error: expected ')' before ';' token
 
 #define RELAY_02 5; 
 
                   ^
 
C:\Users\Lexan\Documents\Arduino\Klass_Velosiped_Knopki\Klass_Velosiped_Knopki.ino:12:11: note: in expansion of macro 'RELAY_02'
 
   pinMode(RELAY_02, OUTPUT);
 
           ^
 
Klass_Velosiped_Knopki:12: error: expected primary-expression before ',' token
 
   pinMode(RELAY_02, OUTPUT);
 
                   ^
 
Klass_Velosiped_Knopki:12: error: expected ';' before ')' token
 
   pinMode(RELAY_02, OUTPUT);
 
                           ^
 
Klass_Velosiped_Knopki:6: error: expected ')' before ';' token
 
 #define BUZZER 6;
 
                 ^
 
C:\Users\Lexan\Documents\Arduino\Klass_Velosiped_Knopki\Klass_Velosiped_Knopki.ino:13:11: note: in expansion of macro 'BUZZER'
 
   pinMode(BUZZER, OUTPUT);
 
           ^
 
Klass_Velosiped_Knopki:13: error: expected primary-expression before ',' token
 
   pinMode(BUZZER, OUTPUT);
 
                 ^
 
Klass_Velosiped_Knopki:13: error: expected ';' before ')' token
 
   pinMode(BUZZER, OUTPUT);
 
                         ^
 
C:\Users\Lexan\Documents\Arduino\Klass_Velosiped_Knopki\Klass_Velosiped_Knopki.ino: In function 'void loop()':
 
Klass_Velosiped_Knopki:4: error: expected ')' before ';' token
 
 #define RELAY_01 4; 
 
                   ^
 
C:\Users\Lexan\Documents\Arduino\Klass_Velosiped_Knopki\Klass_Velosiped_Knopki.ino:23:18: note: in expansion of macro 'RELAY_01'
 
     digitalWrite(RELAY_01, HIGH);
 
                  ^
 
Klass_Velosiped_Knopki:23: error: expected primary-expression before ',' token
 
     digitalWrite(RELAY_01, HIGH);
 
                          ^
 
Klass_Velosiped_Knopki:23: error: expected ';' before ')' token
 
     digitalWrite(RELAY_01, HIGH);
 
                                ^
 
Klass_Velosiped_Knopki:4: error: expected ')' before ';' token
 
 #define RELAY_01 4; 
 
                   ^
 
C:\Users\Lexan\Documents\Arduino\Klass_Velosiped_Knopki\Klass_Velosiped_Knopki.ino:29:18: note: in expansion of macro 'RELAY_01'
 
     digitalWrite(RELAY_01, LOW);
 
                  ^
 
Klass_Velosiped_Knopki:29: error: expected primary-expression before ',' token
 
     digitalWrite(RELAY_01, LOW);
 
                          ^
 
Klass_Velosiped_Knopki:29: error: expected ';' before ')' token
 
     digitalWrite(RELAY_01, LOW);
 
                               ^
 
Klass_Velosiped_Knopki:5: error: expected ')' before ';' token
 
 #define RELAY_02 5; 
 
                   ^
 
C:\Users\Lexan\Documents\Arduino\Klass_Velosiped_Knopki\Klass_Velosiped_Knopki.ino:30:18: note: in expansion of macro 'RELAY_02'
 
     digitalWrite(RELAY_02, LOW);
 
                  ^
 
Klass_Velosiped_Knopki:30: error: expected primary-expression before ',' token
 
     digitalWrite(RELAY_02, LOW);
 
                          ^
 
Klass_Velosiped_Knopki:30: error: expected ';' before ')' token
 
     digitalWrite(RELAY_02, LOW);
 
                               ^
 
Klass_Velosiped_Knopki:6: error: expected ')' before ';' token
 
 #define BUZZER 6;
 
                 ^
 
C:\Users\Lexan\Documents\Arduino\Klass_Velosiped_Knopki\Klass_Velosiped_Knopki.ino:31:18: note: in expansion of macro 'BUZZER'
 
     digitalWrite(BUZZER, LOW);
 
                  ^
 
Klass_Velosiped_Knopki:31: error: expected primary-expression before ',' token
 
     digitalWrite(BUZZER, LOW);
 
                        ^
 
Klass_Velosiped_Knopki:31: error: expected ';' before ')' token
 
     digitalWrite(BUZZER, LOW);
 
                             ^
 
Используем библиотеку class_BUTTON в папке: C:\Users\Lexan\Documents\Arduino\libraries\class_BUTTON (legacy)
exit status 1
expected ')' before ';' token
Клапауций 322
Offline
Зарегистрирован: 31.12.2015

блин. занимаешься убийством времени своего и моего - что за сто чертей за тобой гонится?

что это за нах? Klass_Velosiped_Knopki.ino ?

если всё должно быть так #186

и должно быть так:

#define RELAY_01 4
#define RELAY_02 5
#define BUZZER 6

Скетч использует 2 548 байт (41%) памяти устройства. Всего доступно 6 144 байт.
Глобальные переменные используют 278 байт (13%) динамической памяти, оставляя 1 770 байт для локальных переменных. Максимум: 2 048 байт.

 

Lexan
Offline
Зарегистрирован: 12.02.2016

Ёмаё засада ( ; ) не обратил внемание :(

Спасибо.

Ошибки исчезли... Буду думать как привинтить включение на реле2 и бузер

 

Lexan
Offline
Зарегистрирован: 12.02.2016

Ребят, голова уже закипает)))

Как правильно написать такое выражение?? Суть в том чтобы узнать разницу между двумя числами и результат сравнить с числом 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
 

 

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

if (a - b == 5) {// что-то сделать если разница равна 5} 

if (a - b < 5) {// что-то сделать если разница меньше 5} 

if (a - b > 5) {// что-то сделать если разница больше 5} 

if (a - b <= 5) {// что-то сделать если разница меньше или равно 5} 

if (a - b >= 5) {// что-то сделать если разница больше или равно 5} 

Lexan
Offline
Зарегистрирован: 12.02.2016

Круть ! вот это я и искал !

Спасибо!!

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Lexan пишет:

Круть ! вот это я и искал !

Спасибо!!

поэтому и рекомендовал бросить нафиг все учебники по C++ и, сначала, прочитать основы

Клапауций 322 пишет:

Lexan пишет:

Ребят посоветуйте какое издание Кернигана и Ричи лучше? У меня 3-е издание V0.1

да, никакое, пока не настроишься на волну - читай пока это Программирование

vk007
Offline
Зарегистрирован: 16.06.2015

Lexan пишет:

Как правильно написать такое выражение?? Суть в том чтобы узнать разницу между двумя числами и результат сравнить с числом 5.

Вот объясни пожалуйста. Ты что-то спрашиваешь, тебе отвечают, через некоторое время ты снова спрашиваешь об этом же. Что не так и как это называется?

Я еще в сообщении #7 привел пример со сравнением разницы между двумя значениями. Кому я это написал?

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Ну прям на парня набросились... Вы его просто не понимаете потому что слишком умные...

Lexan
Offline
Зарегистрирован: 12.02.2016

vk007 пишет:

Lexan пишет:

Как правильно написать такое выражение?? Суть в том чтобы узнать разницу между двумя числами и результат сравнить с числом 5.

Вот объясни пожалуйста. Ты что-то спрашиваешь, тебе отвечают, через некоторое время ты снова спрашиваешь об этом же. Что не так и как это называется?

Я еще в сообщении #7 привел пример со сравнением разницы между двумя значениями. Кому я это написал?

 

Друг, я сразу не въехал ))

То есть у тебя в примере  abs это и есть разность этих двух переменных, и за скобками ты её сравниваешь?

Извиняй я просто не знал что так можно и сразу не понял что такое abs...

if (abs(Chislo1 - kalAngleX) > 5.0)

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Lexan пишет:

Извиняй я просто не знал что так можно и сразу не понял что такое abs...

if (abs(Chislo1 - kalAngleX) > 5.0)

блин. ну в который раз тебя посылать в Программирование ?

http://arduino.ru/Reference/Abs - у тебя же там походу и отрицательные значения.

vk007
Offline
Зарегистрирован: 16.06.2015

abs - это модуль числа. Я так понял, что по условиям задания, текущее значение может отклоняться от предыдущего как в большую, так и меньшую сторону.

Чтобы узнать, на сколько оно отклонилось, то из одного значения вычитается другое. Если просто вычесть, то результат может быть и положительным, и отрицательным (в зависимости, что больше).

Чтобы не делать два сравнения (первое на случай, если текущее значение больше предыдущего, а второе наоборот, если предыдущее больше текущего), то к разнице применяется модуль и уже он (будучи всегда положительным) сравнивается с предельным значением.

Lexan
Offline
Зарегистрирован: 12.02.2016

ну да получается кажется от -360 до 360...

Lexan
Offline
Зарегистрирован: 12.02.2016

У меня уже процессор закипает, походу пень1 )))  чтото я запутался... Что значит (Возвращает модуль числа.)

Тоесть если я напишу так : 

if (abs(kalXold - kalAngleX) > 5.0)

 

то получается что два раза, тоесть вот так делать ненадо, и этим самым можно сократить код?

if (kalXold - kalAngleX >= 5)

if (kalXold - kalAngleX <= 5)

 

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Lexan пишет:

У меня уже процессор закипает, походу пень1 )))  чтото я запутался... Что значит (Возвращает модуль числа.)

Тоесть если я напишу так : 

if (abs(kalXold - kalAngleX) > 5.0)

 

то получается что два раза, тоесть вот так делать ненадо, и этим самым можно сократить код?

if (kalXold - kalAngleX >= 5)

if (kalXold - kalAngleX <= 5)

на этот вопрос ты должен ответить самостоятельно - потому, что если тебе без разницы, что делать если что-то отклонилось в сторону, то модуль, а если отклонилось в минус, то крутить серву в одну сторону для возвращения в ноль, а если отклонилось в плюс, то в другую сторону, что бы вернуться. как пример, чем ты там занят с гироскопом.

Lexan
Offline
Зарегистрирован: 12.02.2016

Ааа теперь кажется понял...

Но мне получается вродебы незачем возврощать число в исходное. Нужно будет только чтобы при нажатии кнопки2 оно кагбы обнулялось и не сравнивалось. Как до ножатия кнопки1. Тоесть чтобы обратно стало не активным чтоли.

Lexan
Offline
Зарегистрирован: 12.02.2016

Ребят а как обьяснить переменной kalXold что она должна обнулится?

как то так? 

kalXold = 0;

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Lexan пишет:

Ребят а как обьяснить переменной kalXold что она должна обнулится?

как то так? 

kalXold = 0;

налить текилы, рассказать смешной анекдот - и, она твоя.