Форум за електроника Форуми Форум за електроника
Български форум за електроника, ремонти, схеми, документация
 
 Въпроси/ОтговориВъпроси/Отговори   ТърсенеТърсене   ПотребителиПотребители   ГрупиГрупи   Регистрирайте сеРегистрирайте се 
 ПрофилПрофил   Влезте, за да видите съобщенията сиВлезте, за да видите съобщенията си   ВходВход 

Някой може ли да ми помогне с кода за Arduino

 
Създайте нова тема   Напишете отговор    Форум за електроника Форуми -> Обща електроника - General Electronics



Предишната тема :: Следващата тема  
Автор Съобщение
importante
Активен потребител
Активен потребител


Регистриран на: 20 Апр 2009
Мнения: 70

МнениеПуснато на: Съб Май 24, 2014 19:07    Заглавие: Някой може ли да ми помогне с кода за Arduino Отговорете с цитат

Здравейте! опитвам се да напиша програма на ардуино, с която да се управляват двойки релета, с помоща на ултразвукови сензори HC-SR04.Проблемът е че когато пред сензора на далечно разстояние няма нищо, Ардуиното подава високо ниво и включва релетата.Когато сложа нещо пред сензора, да речем на 1 метър, програмата си работи добре, пиновете са в ниско ниво и когато доближа предмет на 10 см, включва релетата. Някой може ли да ми помогне да открия къде греша в кода, или е друг проблема.Благодаря!! Кода който съм написал е този:
Код:
#define trigPin1 13
#define echoPin1 12
#define led1 11
#define led2 10
#define trigPin2 9
#define echoPin2 8
#define led3 7
#define led4 6

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);
}


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) {
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);
 
  }
  delay(500);
}
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
ststefanov
Опитен потребител
Опитен потребител


Регистриран на: 14 Дек 2004
Мнения: 1509

МнениеПуснато на: Нед Май 25, 2014 8:16    Заглавие: Отговорете с цитат

Пробвай на първо време вместо:
long duration, distance;

да го промениш на
unsigned long duration, distance;

Ако не - добави си в кода след
duration = pulseIn(echoPin2, HIGH);

по един ред
Serial.println(duration);

за да видиш, когато няма нищо пред сензорите, какви стойности получаваш.

После си промени обработката.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Изпрати мейла
importante
Активен потребител
Активен потребител


Регистриран на: 20 Апр 2009
Мнения: 70

МнениеПуснато на: Нед Май 25, 2014 20:00    Заглавие: Отговорете с цитат

Промених long duration, distance; на unsigned long duration, distance; , нищо не се промени.Написах и Serial.println(duration); , излизат много големи стойности, които варират от 0 до 10 000 и непрекъснато играят.

Дали сензора не се самовъзбужда някак?
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
ststefanov
Опитен потребител
Опитен потребител


Регистриран на: 14 Дек 2004
Мнения: 1509

МнениеПуснато на: Нед Май 25, 2014 20:05    Заглавие: Отговорете с цитат

Това може да го разбереш с осцилоскоп.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Изпрати мейла
T3d
Нов потребител
Нов потребител


Регистриран на: 02 Окт 2011
Мнения: 3

МнениеПуснато на: Пон Май 26, 2014 7:38    Заглавие: Отговорете с цитат

Ами там където правиш проверката за разстоянието просто си сложи още една проверка

if ( разстоянието >= един метър и нагоре )
{
не прави нищо;
}
if ( разстоянието < един колко си )
{
digitalWrite(led3,HIGH);
digitalWrite(led4,HIGH);
}
_________________
Todor todorov
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
ststefanov
Опитен потребител
Опитен потребител


Регистриран на: 14 Дек 2004
Мнения: 1509

МнениеПуснато на: Пон Май 26, 2014 7:40    Заглавие: Отговорете с цитат

T3d написа:
Ами там където правиш проверката за разстоянието просто си сложи още една проверка

if ( разстоянието >= един метър и нагоре )
{
не прави нищо;
}
else if ( разстоянието < един колко си )
{
digitalWrite(led3,HIGH);
digitalWrite(led4,HIGH);
}
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Изпрати мейла
slav4o.com
Опитен потребител
Опитен потребител


Регистриран на: 04 Юли 2004
Мнения: 2970
Местожителство: Велико Търново

МнениеПуснато на: Пон Май 26, 2014 15:21    Заглавие: Отговорете с цитат

Код:

{
long duration, distance;
  digitalWrite(trigPin2, LOW);

не мога да разбера защо пак си отворил скоба, и защо си декларирал втори път тези две променливи.
Защо не ги декларираш като глобални извън главната функция loop() ?
Освен това гледам че:
Код:

  else
    digitalWrite(led3,LOW);
    digitalWrite(led4,LOW);
 
  }

тука не си сложил заграждащи скоби, всъщност има една заграждаща, обаче тя се загражда с тази от по-горната част. Когато имаш else може да напишеш след него само един ред без заграждащи скоби. Същото е и след if statement-a. Това си го изпълнил по-горе в програмата. Всъщност не съм запознат с този програмен език, но принципно ми изглежда да е C и ако е така то не би следвало да работи нормално с тия грешки.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Изпрати мейла
importante
Активен потребител
Активен потребител


Регистриран на: 20 Апр 2009
Мнения: 70

МнениеПуснато на: Пон Май 26, 2014 22:49    Заглавие: Отговорете с цитат

Явно допускам доста грешки, но все още едва се запознавам с нещата.
Променях стойности, да не е 1 метър и половина, на 10 см, на 20, пробвах само с '>' вместо с '>=' и не става и не става.А за скобите, която и скоба да махна или да променя не ми дава да го кача в чипа, изписва ми грешка. Примерно сега на
Код:
long duration, distance;
няма скоба, но в долния израз я изисква и няма как долната част да е като горната. Сменявах адаптери, добавях кондензатори между + и маса да изчистя ако има някакви пулсации понеже се чува едно леко пукане от сензорите. Пробвах сигнала през резистори и пак си е все същото. Значи не се смущава от неизгладено напрежение или от високо ниво на сигнала до колкото аз разбирам.Сега кода го преработих на това, но пак когато няма пред сензора нищо се активира:
Код:
#define trigPin1 13
#define echoPin1 12
#define led1 11
#define led2 10
#define trigPin2 9
#define echoPin2 8
#define led3 7
#define led4 6

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);
}


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 >= 150)
{
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
}
   else if (distance < 10)
{
digitalWrite(led1,HIGH);
digitalWrite(led2,HIGH);

}
{
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 >= 150) {
    digitalWrite(led3,LOW);
  digitalWrite(led4,LOW);
}
  else if (distance < 10)
  {
    digitalWrite(led3,HIGH);
    digitalWrite(led4,HIGH);
 
  }
 
  delay(500);}
 
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
slav4o.com
Опитен потребител
Опитен потребител


Регистриран на: 04 Юли 2004
Мнения: 2970
Местожителство: Велико Търново

МнениеПуснато на: Вто Май 27, 2014 1:38    Заглавие: Отговорете с цитат

Няма да ти даде естествено, като не са еднакъв брой отварящи и затварящи.
това
Код:

long duration, distance;

го махни от двете места на които си го написал, на второто (барар със скобите), и го сложи след последното #define демек преди void setup()
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Изпрати мейла
ststefanov
Опитен потребител
Опитен потребител


Регистриран на: 14 Дек 2004
Мнения: 1509

МнениеПуснато на: Вто Май 27, 2014 8:29    Заглавие: Отговорете с цитат

Имам няколко забележки:
1. Защо дефинираш 2 пъти duration и distance?
2. Няма смисъл от 2 променливи и излишни операции като делене. Просто вместо distance < 10 можеш да използваш duration<2*29.1*10.
3. Виж какви стойности на duration ти изписва при липса на препятствие (както вече ти писах). Не трябва да са под 600 примерно. Ако имаш такива си провери датчика. Кода няма да те спаси.

Ето код, който се компилира при мен:

Код:
#define trigPin1 13
#define echoPin1 12
#define led1 11
#define led2 10
#define trigPin2 9
#define echoPin2 8
#define led3 7
#define led4 6

long duration;

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);
}


void loop() {
   digitalWrite(trigPin1, LOW);
   delayMicroseconds(2);
   digitalWrite(trigPin1, HIGH);
   delayMicroseconds(10);
   digitalWrite(trigPin1, LOW);
   duration = pulseIn(echoPin1, HIGH);
   if (duration >= 150*2*29.1)
   {
      digitalWrite(led1,LOW);
      digitalWrite(led2,LOW);
   }
    else if (duration < 10*2*29.1)
   {
      digitalWrite(led1,HIGH);
      digitalWrite(led2,HIGH);

   }
   digitalWrite(trigPin2, LOW);
   delayMicroseconds(2);
   digitalWrite(trigPin2, HIGH);
   delayMicroseconds(10);
   digitalWrite(trigPin2, LOW);
   duration = pulseIn(echoPin2, HIGH);
   if (duration >= 150*2*29.1) {
       digitalWrite(led3,LOW);
        digitalWrite(led4,LOW);
   }
     else if (duration < 10*2*29.1)
     {
       digitalWrite(led3,HIGH);
       digitalWrite(led4,HIGH);
    }
     delay(500);
}
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Изпрати мейла
Покажи мнения от преди:   
Създайте нова тема   Напишете отговор    Форум за електроника Форуми -> Обща електроника - General Electronics Часовете са според зоната GMT + 2 Часа
Страница 1 от 1

 
Към:  
Не Можете да пускате нови теми
Не Можете да отговаряте на темите
Не Можете да променяте съобщенията си
Не Можете да изтривате съобщенията си
Не Можете да гласувате в анкети


Powered by phpBB © 2001, 2005 phpBB Group
Translation by: Boby Dimitrov
Where to Find Free Service Manuals