Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Код за Arduino + ultrasonic sensor + relay
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=12747
Страница 1 от 2

Автор:  importante [ Сря Мар 05, 2014 3:28 pm ]
Заглавие:  Код за Arduino + ultrasonic sensor + relay

Здравейте!Наскоро си купих Arduino Uno R3, а контролер Atmega328.Подкарах първата схемка, която е за мигане на светодиод, и сега закупих един ултразвуков сензор HC-SR04 и искам да включвам чрез него реле, когато засече обект примерно на 50 см.Някой може ли да ми помогне с кода понеже съм твърде бос да го направя сам :oops: .Изчетох доста по различни форуми или клипове, но повечето са за измерване на разстояние или със зумер или пък мигащ с определена честота светодиод в зависимост от дистанцията между сензора и предмета.

Разбрах че на пин trigg се пуска импулс с продължителност 10 мили секунди, след което на пин Echo получавам импулс с продължителност равна на разстоянието измерено от сензора.Аз не искам да измервам разстояние или да включва различни неща в зависимост от разстоянието, само да задейства реленце на от около 50см.Разбрах и че е нужна схема да управлява релето, понеже на ардуино платката силата на тока е около 40mA.От много ровене по търсачките и къде ли не това научих.Ако може някой ако е правил нещо подобно да ми помогне, или да промениме вече някой готов код. :)


Дали с този код няма да стане, ако се промени, но не знам къде в него е обозначена дистанцията


Код:
#define trigPin 13
#define echoPin 12
#define led 11
#define led2 10

void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(led, OUTPUT);
  pinMode(led2, OUTPUT);
}

void loop() {
  long duration, distance;
  digitalWrite(trigPin, LOW);  // Added this line
  delayMicroseconds(2); // Added this line
  digitalWrite(trigPin, HIGH);
//  delayMicroseconds(1000); - Removed this line
  delayMicroseconds(10); // Added this line
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
  if (distance < 4) {  // This is where the LED On/Off happens
    digitalWrite(led,HIGH); // When the Red condition is met, the Green LED should turn off
  digitalWrite(led2,LOW);
}
  else {
    digitalWrite(led,LOW);
    digitalWrite(led2,HIGH);
  }
  if (distance >= 200 || distance <= 0){
    Serial.println("Out of range");
  }
  else {
    Serial.print(distance);
    Serial.println(" cm");
  }
  delay(500);
}

Автор:  ToHu [ Сря Мар 05, 2014 11:06 pm ]
Заглавие:  Re: Код за Arduino + ultrasonic sensor + relay

Не съм го чел много детйално, но на пръв поглед изглежда да стане .. то който и кода да преработиш ще стане :)
Значи Serial.println("Out of range"); те това не ти трябва.
digitalWrite(led,HIGH); // When the Red condition is met, the Green LED should turn off
digitalWrite(led2,LOW);
те ти на, два пина бутат тъкмо :) ако е по малко от 4, дали е 4 м или 4 см идея си нямам, както и не знам дали го смятат правилно.
изобщо ето това
if (distance >= 200 || distance <= 0){
Serial.println("Out of range");
}
else {
Serial.print(distance);
Serial.println(" cm");
}

не ти трябва, делея след него ще определя колко често ще мериш.
В кода позлват някакви явно библиотечни функции и нямам идея дали се ползват правилно, има в предвид pulseIn() ...

Автор:  importante [ Чет Мар 06, 2014 12:52 pm ]
Заглавие:  Re: Код за Arduino + ultrasonic sensor + relay

Предполагам да е сантиметри, за изписване на екрана е дадено ''sm'' Предполагах че може да е мм или микрометри, щом времето е на милисекунди, а не секунди. Ще пробвам да променя това онова и дано не го изгоря

Автор:  Cekins [ Чет Мар 06, 2014 1:50 pm ]
Заглавие:  Re: Код за Arduino + ultrasonic sensor + relay

Е в сантиметри ще е, сметни си сам ако искаш :)

Скоростта на звука е около 343 м/с това прави 0.343 милиметра за микросекунда :) или 3.43 сантиметра за 100 микросекунди :)

Автор:  importante [ Пет Мар 07, 2014 12:40 pm ]
Заглавие:  Re: Код за Arduino + ultrasonic sensor + relay

Да в сантиметри е..и стана като промених само от 4 на 40.Обаче имам още няколко въпроса.

1. Ако сбъркам нещо и изгоря чипа, после трябва ли да е пак atmega328, или мога да сложа и atmega8 поради по-лесното и намиране и по ниска цена?

2. После трябва да кача и bootloader, това как да го направя и от къде да го заредя?

Прочетох (ако не съм се заблудил, понеже превеждам с преводачката от английски), че разликата между atmega8 и 16 е в честотата, съответно 8Mhz i 16Mhz, където на по-висока честота работи и с по-ниски напрежения, и разхода на енергия е по-малък, съответно увеличаваме живота на батериите.Но аз все пак да попитам, защото едно чета, друго може да разбера, а съм нов в областта.

Автор:  importante [ Пон Мар 10, 2014 5:59 pm ]
Заглавие:  Re: Код за Arduino + ultrasonic sensor + relay

http://www.youtube.com/watch?v=2NTSBa9e ... e=youtu.be , ето клипче как работи при мен сензора! Сега остава да науча как да сложа повече сензори.Мога ли няколко такива кода да заредя един след друг като програма и да ги налея в контролера?В смисъл да определя пиновете общо още в началото, после общо да определя и кои са входове и изходи.Общо взето всички кодове които намирам изпозват едни и същи изводи на чипа.Нямам представа когато сложа още един сензор, кои от пиновете да задам към него и кои пинове да управляват реле. :?: да ги променя с други, защото се дублират

Автор:  ToHu [ Пон Мар 10, 2014 6:23 pm ]
Заглавие:  Re: Код за Arduino + ultrasonic sensor + relay

Ами принципно можеш ... но лично аз не бих го направил така, времената са достатъчно големи за да можеш да стартираш всички едновременно и след това да ги получващ на прекъсване, а дори и на полиране. Една идея, не обработвай веднага ако не гониш малко време за реакция, идеята ми е че можеш да пингнеш всички датчици, да изчакаш да получиш ехо от всички или да ти мене някакъв таймоут, и чак след това да обработиш. Въпреки че ако просто превключваш изход няма голям смисъл, самото превключване отнема пренебрежимо малко време.

Автор:  importante [ Вто Мар 18, 2014 2:32 am ]
Заглавие:  Re: Код за Arduino + ultrasonic sensor + relay

Здравейте отново!
Рових се из нета, четох книги, четях мнения и общо взето не съм спирал да мисля за това, но накрая написах един код, сигурен съм че няма да е функциониращ от раз, но вярвам че ще ми помогнете да си намеря грешките и да го ''оживя''

Идеята е 3 ултразвукови сензора да управляват по двойка светодиоди.Имаме 3 сензора и общо 6 светодиода.Два от сензорите палят съответната за тях двойка светодиоди при засечен обект на разстояние от 10 см.Другият сензор от своя страна пали останалите 2 светодиода при засечен обект на разстояние от 20 до 50 см. Идеята ми е сензора да гаси светодиодите при по малко от 20 см, но ако се отдалечи обекта над 50 см, пак да ги загаси.


Ето и кода:
Код:
#define trigPin1 13
#define echoPin1 12
#define led1 11
#define led2 10
#define trigPin2 9
#define echoPin2 8
#define led3 7
#define led4 6
#define trigPin3 4
#define echoPin3 5
#define led5 3
#define led6 2

void setup() {
  Serial.begin (9600);
  pinMode(trigPin1, OUTPUT);
  pinMode(echoPin1, INPUT);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(trigPin2, OUTPUT);
  pinMode(echoPin2, INPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(trigPin3, OUTPUT);
  pinMode(echoPin3, INPUT);
  pinMode(led5, OUTPUT);
  pinMode(led6, OUTPUT);
}


void loop() {
  long duration, distance;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2)
  digitalWrite(trigPin1, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin1, LOW);
  duration = pulseIn(echoPin1, HIGH);
  distance = (duration/2) / 29.1;
  if (distance < 10) {
    digitalWrite(led1,HIGH);
  digitalWrite(led2,HIGH);
}
  else {
    digitalWrite(led1,LOW);
    digitalWrite(led2,LOW);
  }

  long duration, distance;
  digitalWrite(trigPin2, LOW);
  delayMicroseconds(2)
  digitalWrite(trigPin2, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin2, LOW);
  duration = pulseIn(echoPin2, HIGH);
  distance = (duration/2) / 29.1;
  if (distance < 10) {
    digitalWrite(led3,HIGH);
  digitalWrite(led4,HIGH);
}
  else {
    digitalWrite(led3,LOW);
    digitalWrite(led4,LOW);
  }

long duration, distance;
  digitalWrite(trigPin3, LOW);
  delayMicroseconds(2)
  digitalWrite(trigPin3, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin3, LOW);
  duration = pulseIn(echoPin3, HIGH);
  distance = (duration/2) / 29.1;

if (distance > 20)
{
digitalWrite(led5,HIGH);
digitalWrite(led6,HIGH);
}
else if (distance >= 20;distance < 50)
{
digitalWrite(led5,LOW);
digitalWrite(led6,LOW);
}

delay(500);
}

Автор:  Реконструктор [ Сря Мар 19, 2014 1:53 am ]
Заглавие:  Re: Код за Arduino + ultrasonic sensor + relay

Опитай се да не ползваш плаваща аритметика.

Автор:  importante [ Сря Мар 19, 2014 10:21 am ]
Заглавие:  Re: Код за Arduino + ultrasonic sensor + relay

Пуснах кода на Arduino програмката, и изчиствах грешки според програмата, но накрая ми даде ''error: expected `}' at end of input
'' на
delay(500);
}
Нали си има къдрава скобка на края, не знам какво ми иска?

Код:
#define trigPin1 13
#define echoPin1 12
#define led1 11
#define led2 10
#define trigPin2 9
#define echoPin2 8
#define led3 7
#define led4 6
#define trigPin3 4
#define echoPin3 5
#define led5 3
#define led6 2

void setup() {
  Serial.begin (9600);
  pinMode(trigPin1, OUTPUT);
  pinMode(echoPin1, INPUT);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(trigPin2, OUTPUT);
  pinMode(echoPin2, INPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(trigPin3, OUTPUT);
  pinMode(echoPin3, INPUT);
  pinMode(led5, OUTPUT);
  pinMode(led6, OUTPUT);
}


void loop() {
  long duration, distance;
  digitalWrite(trigPin1, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin1, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin1, LOW);
  duration = pulseIn(echoPin1, HIGH);
  distance = (duration/2) / 29.1;
  if (distance < 10) {
    digitalWrite(led1,HIGH);
  digitalWrite(led2,HIGH);
}
  else {
    digitalWrite(led1,LOW);
    digitalWrite(led2,LOW);
  }
{
  long duration, distance;
  digitalWrite(trigPin2, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin2, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin2, LOW);
  duration = pulseIn(echoPin2, HIGH);
  distance = (duration/2) / 29.1;
  if (distance < 10) {
    digitalWrite(led3,HIGH);
  digitalWrite(led4,HIGH);
}
  else {
    digitalWrite(led3,LOW);
    digitalWrite(led4,LOW);
  }
{
  long duration, distance;
  digitalWrite(trigPin3, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin3, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin3, LOW);
  duration = pulseIn(echoPin3, HIGH);
  distance = (duration/2) / 29.1;

if (distance > 20)
{
digitalWrite(led5,HIGH);
digitalWrite(led6,HIGH);
}
else if (distance >= 20distance < 50)
{
digitalWrite(led5,LOW);
digitalWrite(led6,LOW);
}

delay(500);
}

      

Автор:  stefan63 [ Сря Мар 19, 2014 10:41 am ]
Заглавие:  Re: Код за Arduino + ultrasonic sensor + relay

void loop() { //L1
long duration, distance;
digitalWrite(trigPin1, LOW);
delayMicroseconds(2);
digitalWrite(trigPin1, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin1, LOW);
duration = pulseIn(echoPin1, HIGH);
distance = (duration/2) / 29.1;
if (distance < 10) { //L2
digitalWrite(led1,HIGH);
digitalWrite(led2,HIGH);
} //R1
else { //L3
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
}//R2
{//L4
long duration, distance;
digitalWrite(trigPin2, LOW);
delayMicroseconds(2);
digitalWrite(trigPin2, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin2, LOW);
duration = pulseIn(echoPin2, HIGH);
distance = (duration/2) / 29.1;
if (distance < 10) {//L5
digitalWrite(led3,HIGH);
digitalWrite(led4,HIGH);
}//R3
else {//L6
digitalWrite(led3,LOW);
digitalWrite(led4,LOW);
} //R4
{//L7
long duration, distance;
digitalWrite(trigPin3, LOW);
delayMicroseconds(2);
digitalWrite(trigPin3, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin3, LOW);
duration = pulseIn(echoPin3, HIGH);
distance = (duration/2) / 29.1;

if (distance > 20)
{//L8
digitalWrite(led5,HIGH);
digitalWrite(led6,HIGH);
}//R5
else if (distance >= 20distance < 50)
{//L9
digitalWrite(led5,LOW);
digitalWrite(led6,LOW);
}//R6

delay(500);
}//R7

Броят на левите и броят на десните скоби трябва да е равен.
Липсват ти и ";" предполагам .

Автор:  importante [ Сря Мар 19, 2014 9:00 pm ]
Заглавие:  Re: Код за Arduino + ultrasonic sensor + relay

Изчетох книжката в сайта на Ардуйно, на български която е няколко пъти!
http://playground.arduino.cc/Bulgarian/Rykovodstva#.UynY56h_uwU

На страница 20 е обяснено за if, else функцията, конкретно:
Код:
if (inputPin < 500)
{
napraviA;
}
else if (inputPin >= 1000)
{
napraviB;
}
else
{
napraviC;
}


Според моите нужди стана така:
Код:
if (distance < 40 ) {
    digitalWrite(led5,HIGH);
  digitalWrite(led6,HIGH);
}
  else if (distance < 20 )
    digitalWrite(led5,LOW);
    digitalWrite(led6,LOW);
  }



По този начин се надявам да стане.При засечен обект на 40 см да включи светодиодите, но обекта приближи ли до и под 20 см да ги изключи.Съответно това ще са релета с подходящата електроника, но кода започна със светодиоди и така си и остана.Няма значение.
Схема, по която мога да включа реле примерно това:
Изображение

Все още не мога да пробвам дали реално ще работи кода, понеже частите още не са ми пристигнали, а и явно ще се забавят.
Щом пристигнат ще го пробвам и дано стане.Надявам се да се получи.Благодаря много на всички за помощта!
Ето сега как ми е кода:
Код:
#define trigPin1 13
#define echoPin1 12
#define led1 11
#define led2 10
#define trigPin2 9
#define echoPin2 8
#define led3 7
#define led4 6
#define trigPin3 4
#define echoPin3 5
#define led5 3
#define led6 2

void setup() {
  Serial.begin (9600);
  pinMode(trigPin1, OUTPUT);
  pinMode(echoPin1, INPUT);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(trigPin2, OUTPUT);
  pinMode(echoPin2, INPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(trigPin3, OUTPUT);
  pinMode(echoPin3, INPUT);
  pinMode(led5, OUTPUT);
  pinMode(led6, OUTPUT);
}


void loop() { //L1
long duration, distance;
digitalWrite(trigPin1, LOW);
delayMicroseconds(2);
digitalWrite(trigPin1, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin1, LOW);
duration = pulseIn(echoPin1, HIGH);
distance = (duration/2) / 29.1;
if (distance < 10) { //L2
digitalWrite(led1,HIGH);
digitalWrite(led2,HIGH);
} //R1
else { //L3
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);

}
{
long duration, distance;
  digitalWrite(trigPin2, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin2, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin2, LOW);
  duration = pulseIn(echoPin2, HIGH);
  distance = (duration/2) / 29.1;
  if (distance < 10) {
    digitalWrite(led3,HIGH);
  digitalWrite(led4,HIGH);
}
  else
    digitalWrite(led3,LOW);
    digitalWrite(led4,LOW);
  }
  {
long duration, distance;
  digitalWrite(trigPin3, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin3, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin3, LOW);
  duration = pulseIn(echoPin3, HIGH);
  distance = (duration/2) / 29.1;
  if (distance < 40 ) {
    digitalWrite(led5,HIGH);
  digitalWrite(led6,HIGH);
}
  else if (distance < 20 )
    digitalWrite(led5,LOW);
    digitalWrite(led6,LOW);
  }
  delay(500);
}

Автор:  stefan63 [ Сря Мар 19, 2014 9:25 pm ]
Заглавие:  Re: Код за Arduino + ultrasonic sensor + relay

Чел си ,но май не си разбрал.Потърси нещо на български за Си и прочети "съставен оператор",
"compound statement" или както там се казва.
В кода ти има излишни отварящи и затварящи скоби - не пречат. Научи се да ги ползваш в IF/ELSE.



void loop()
{
long duration, distance;
digitalWrite(trigPin1, LOW);
delayMicroseconds(2);
digitalWrite(trigPin1, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin1, LOW);
duration = pulseIn(echoPin1, HIGH);
distance = (duration/2) / 29.1;

if (distance < 10) { digitalWrite(led1,HIGH);digitalWrite(led2,HIGH);}
else {digitalWrite(led1,LOW);digitalWrite(led2,LOW);}
//--------------------------

{
long duration, distance; //тук не дава ли грешка "ВЕЧЕ Е ДЕКЛАРИРАНО!!!"

digitalWrite(trigPin2, LOW);
delayMicroseconds(2);
digitalWrite(trigPin2, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin2, LOW);
duration = pulseIn(echoPin2, HIGH);
distance = (duration/2) / 29.1;

if (distance < 10) { digitalWrite(led3,HIGH); digitalWrite(led4,HIGH); }
else digitalWrite(led3,LOW);

digitalWrite(led4,LOW); // ???? винаги светва ?????
}
//-----------------

{
long duration, distance; //тук не дава ли грешка "ВЕЧЕ Е ДЕКЛАРИРАНО!!!"
digitalWrite(trigPin3, LOW);
delayMicroseconds(2);
digitalWrite(trigPin3, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin3, LOW);
duration = pulseIn(echoPin3, HIGH);
distance = (duration/2) / 29.1;
if (distance < 40 ) { digitalWrite(led5,HIGH); digitalWrite(led6,HIGH); }
else if (distance < 20 ) digitalWrite(led5,LOW);

digitalWrite(led6,LOW); //????винаги в нула????
}
//---------------------
delay(500);
}

Автор:  importante [ Сря Мар 19, 2014 10:13 pm ]
Заглавие:  Re: Код за Arduino + ultrasonic sensor + relay

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

Автор:  stefan63 [ Сря Мар 19, 2014 11:10 pm ]
Заглавие:  Re: Код за Arduino + ultrasonic sensor + relay

Мисля , че се сещам защо ти иска да декларираш повторно, ама мене Си ми е чужд.
Тука няма мой код - все си е твоят, само съм изтрил и добавил някои шпации и синволи за нов ред.

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/