|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 1:38 am
Код за Arduino + ultrasonic sensor + relay
| Автор |
Съобщение |
|
importante
Ранг: Минаващ
Регистриран на: Нед Яну 05, 2014 10:29 pm Мнения: 49
|
 Код за Arduino + ultrasonic sensor + relay
Здравейте!Наскоро си купих Arduino Uno R3, а контролер Atmega328.Подкарах първата схемка, която е за мигане на светодиод, и сега закупих един ултразвуков сензор HC-SR04 и искам да включвам чрез него реле, когато засече обект примерно на 50 см.Някой може ли да ми помогне с кода понеже съм твърде бос да го направя сам  .Изчетох доста по различни форуми или клипове, но повечето са за измерване на разстояние или със зумер или пък мигащ с определена честота светодиод в зависимост от дистанцията между сензора и предмета. Разбрах че на пин 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); } |  |  |  |  |
|
| Сря Мар 05, 2014 3:28 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30686 Местоположение: София
|
 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() ...
|
| Сря Мар 05, 2014 11:06 pm |
|
 |
|
importante
Ранг: Минаващ
Регистриран на: Нед Яну 05, 2014 10:29 pm Мнения: 49
|
 Re: Код за Arduino + ultrasonic sensor + relay
Предполагам да е сантиметри, за изписване на екрана е дадено ''sm'' Предполагах че може да е мм или микрометри, щом времето е на милисекунди, а не секунди. Ще пробвам да променя това онова и дано не го изгоря
|
| Чет Мар 06, 2014 12:52 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
 Re: Код за Arduino + ultrasonic sensor + relay
Е в сантиметри ще е, сметни си сам ако искаш  Скоростта на звука е около 343 м/с това прави 0.343 милиметра за микросекунда  или 3.43 сантиметра за 100 микросекунди 
|
| Чет Мар 06, 2014 1:50 pm |
|
 |
|
importante
Ранг: Минаващ
Регистриран на: Нед Яну 05, 2014 10:29 pm Мнения: 49
|
 Re: Код за Arduino + ultrasonic sensor + relay
Да в сантиметри е..и стана като промених само от 4 на 40.Обаче имам още няколко въпроса.
1. Ако сбъркам нещо и изгоря чипа, после трябва ли да е пак atmega328, или мога да сложа и atmega8 поради по-лесното и намиране и по ниска цена?
2. После трябва да кача и bootloader, това как да го направя и от къде да го заредя?
Прочетох (ако не съм се заблудил, понеже превеждам с преводачката от английски), че разликата между atmega8 и 16 е в честотата, съответно 8Mhz i 16Mhz, където на по-висока честота работи и с по-ниски напрежения, и разхода на енергия е по-малък, съответно увеличаваме живота на батериите.Но аз все пак да попитам, защото едно чета, друго може да разбера, а съм нов в областта.
|
| Пет Мар 07, 2014 12:40 pm |
|
 |
|
importante
Ранг: Минаващ
Регистриран на: Нед Яну 05, 2014 10:29 pm Мнения: 49
|
 Re: Код за Arduino + ultrasonic sensor + relay
http://www.youtube.com/watch?v=2NTSBa9e ... e=youtu.be , ето клипче как работи при мен сензора! Сега остава да науча как да сложа повече сензори.Мога ли няколко такива кода да заредя един след друг като програма и да ги налея в контролера?В смисъл да определя пиновете общо още в началото, после общо да определя и кои са входове и изходи.Общо взето всички кодове които намирам изпозват едни и същи изводи на чипа.Нямам представа когато сложа още един сензор, кои от пиновете да задам към него и кои пинове да управляват реле.  да ги променя с други, защото се дублират
|
| Пон Мар 10, 2014 5:59 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30686 Местоположение: София
|
 Re: Код за Arduino + ultrasonic sensor + relay
Ами принципно можеш ... но лично аз не бих го направил така, времената са достатъчно големи за да можеш да стартираш всички едновременно и след това да ги получващ на прекъсване, а дори и на полиране. Една идея, не обработвай веднага ако не гониш малко време за реакция, идеята ми е че можеш да пингнеш всички датчици, да изчакаш да получиш ехо от всички или да ти мене някакъв таймоут, и чак след това да обработиш. Въпреки че ако просто превключваш изход няма голям смисъл, самото превключване отнема пренебрежимо малко време.
|
| Пон Мар 10, 2014 6:23 pm |
|
 |
|
importante
Ранг: Минаващ
Регистриран на: Нед Яну 05, 2014 10:29 pm Мнения: 49
|
 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); }
|  |  |  |  |
|
| Вто Мар 18, 2014 2:32 am |
|
 |
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 12:32 pm Мнения: 8382 Местоположение: София
|
 Re: Код за Arduino + ultrasonic sensor + relay
Опитай се да не ползваш плаваща аритметика.
|
| Сря Мар 19, 2014 1:53 am |
|
 |
|
importante
Ранг: Минаващ
Регистриран на: Нед Яну 05, 2014 10:29 pm Мнения: 49
|
 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); }
|  |  |  |  |
|
| Сря Мар 19, 2014 10:21 am |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 11:22 pm Мнения: 3084
|
 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
Броят на левите и броят на десните скоби трябва да е равен. Липсват ти и ";" предполагам .
|
| Сря Мар 19, 2014 10:41 am |
|
 |
|
importante
Ранг: Минаващ
Регистриран на: Нед Яну 05, 2014 10:29 pm Мнения: 49
|
 Re: Код за Arduino + ultrasonic sensor + relay
Изчетох книжката в сайта на Ардуйно, на български която е няколко пъти! http://playground.arduino.cc/Bulgarian/Rykovodstva#.UynY56h_uwUНа страница 20 е обяснено за if, else функцията, конкретно: Според моите нужди стана така: По този начин се надявам да стане.При засечен обект на 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); } |  |  |  |  |
|
| Сря Мар 19, 2014 9:00 pm |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 11:22 pm Мнения: 3084
|
 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); }
|
| Сря Мар 19, 2014 9:25 pm |
|
 |
|
importante
Ранг: Минаващ
Регистриран на: Нед Яну 05, 2014 10:29 pm Мнения: 49
|
 Re: Код за Arduino + ultrasonic sensor + relay
Не ми дава че вече е декларирано, а ми дава грешка когато го махна.Не е винаги нула, понеже не си погледнал кода ми в края и не винаги светва, при твоя код е така.. Знам, че кода може да стане много по функционален и затова публикувам всяка промяна.
|
| Сря Мар 19, 2014 10:13 pm |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 11:22 pm Мнения: 3084
|
 Re: Код за Arduino + ultrasonic sensor + relay
Мисля , че се сещам защо ти иска да декларираш повторно, ама мене Си ми е чужд. Тука няма мой код - все си е твоят, само съм изтрил и добавил някои шпации и синволи за нов ред.
|
| Сря Мар 19, 2014 11:10 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 2 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|