 |
Форум за електроника Български форум за електроника, ремонти, схеми, документация
|
| Предишната тема :: Следващата тема |
| Автор |
Съобщение |
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);
} |
|
|
| Върнете се в началото |
|
 |
|
|
Не Можете да пускате нови теми Не Можете да отговаряте на темите Не Можете да променяте съобщенията си Не Можете да изтривате съобщенията си Не Можете да гласувате в анкети
|
|