всем добрый день. прошу сильно не пинать так как только начинаю осваивать arduino... я решил попрактиковаться и создать простую сигнализацию. 1. взял: дисплей LCD 1602, ультразвуковой датчик, 2 светодиода, простую пищалку... 2. все подключил. 3. написал скетч. Код (C++): #include <LiquidCrystal.h> #include <Ultrasonic.h> // задаем пины Ultrasonic ultrasonic(11,10); LiquidCrystal lcd(7,6,5,4,3,2); #define trigPin 11 #define echoPin 10 #define led 12 #define led2 13 // контакт подключения вывода реле int soundPin=9; // частота звукового сигнала int freq=587; void setup() { Serial.begin(9600); lcd.begin(16,2); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(led, OUTPUT); pinMode(led2, OUTPUT); pinMode(soundPin,OUTPUT); } void loop() { int cm = ultrasonic.Ranging(CM); int soundPin = ultrasonic.Ranging(CM); // очищаем экран lcd.clear(); // устанавливаем курсор в начало lcd.setCursor(5,0); lcd.print(cm); lcd.print(" cm"); delay(1000); long duration, distance; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration/2) / 29.1; if (distance < 10) { // На этом этапе происходит вкл/выкл светодиода digitalWrite(led,HIGH); // когда загорается красный, зеленый обязан выключится digitalWrite(led,HIGH); // когда загорается красный, зеленый обязан выключится digitalWrite(soundPin,HIGH); //срабатывание бипера digitalWrite(led2,LOW); } else { digitalWrite(led,LOW); digitalWrite(led2,HIGH); } if (distance >= 200 || distance <= 0){ } else { Serial.print(distance); Serial.println(" cm"); // тут тоже можно указать " см" noTone(soundPin); } delay(1000); } все работает, но пищалка не срабатывает... ткните носом, где я допустил ошибку... два дня просматриваю форумы, все перепробовал и все равно не могу найти ошибку... если отдельно заливать скетч на пищалку он работает... в моем скетче нехочет...
Плюс к тому же строчка digitalWrite(soundPin,HIGH); //срабатывание бипера включает лог уровень, а вот выключения нет, вместо него почему то другая команда noTone(soundPin); которая относиться к формированию тонового сигнала на выходе.. Нужно или логический вариант , но тогда бузер должен быть с встроенным генератором, или тоновый сигнал, но тогда усилитель с динамиком.
что то совсем мозги не догоняют... не пойму где ошибка: 1. int soundPin=9; - указал пин динамика... 2. pinMode(soundPin,OUTPUT); - указал, что это выход... 3. digitalWrite(soundPin,HIGH); - указал, что должен сработать совместно с красным светодиодом при достижении параметра... 4. указал выдаваемый тон Код (C++): tone (soundPin, 261); delay(500); noTone(soundPin); delay(1000); tone(soundPin, 493); delay(500); noTone(soundPin); delay(1000); динамик один раз звук подаст и замолкает... Код (C++): #include <LiquidCrystal.h> #include <Ultrasonic.h> // задаем пины Ultrasonic ultrasonic(11,10); LiquidCrystal lcd(7,6,5,4,3,2); #define trigPin 11 #define echoPin 10 #define led 12 #define led2 13 int soundPin=9; void setup() { Serial.begin(9600); lcd.begin(16,2); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(led, OUTPUT); pinMode(led2, OUTPUT); pinMode(soundPin,OUTPUT); } void loop() { int cm = ultrasonic.Ranging(CM); int soundPin = ultrasonic.Ranging(CM); // очищаем экран lcd.clear(); // устанавливаем курсор в начало lcd.setCursor(5,0); lcd.print(cm); lcd.print(" cm"); delay(500); long duration, distance; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration/2) / 29.1; if (distance < 20) { // На этом этапе происходит вкл/выкл светодиода digitalWrite(led,HIGH); // когда загорается красный, зеленый обязан выключится digitalWrite(led,HIGH); // когда загорается красный, зеленый обязан выключится digitalWrite(soundPin,HIGH); //срабатывание динамика digitalWrite(led2,LOW); } else { digitalWrite(led,LOW); digitalWrite(led2,HIGH); } if (distance >= 200 || distance <= 0) { // срабадывание двух тонов tone (soundPin, 261); delay(500); noTone(soundPin); delay(1000); tone(soundPin, 493); delay(500); noTone(soundPin); delay(1000); } else { Serial.print(distance); Serial.println(" cm"); // тут тоже можно указать " см" } delay(1000); }
п.3 - подал высокий уровень и все...онт там на выходе и остался(...а тону уже и нечего выдавать.. .В проге вместо п.3 должен стоять п.4..!!!! .Не надо на выход давать лог. уровень...ИЛИ уровень или ТОН.
п.3 вообще убрал, поставил вместо него п.4 - без изменений... Код (C++): #include <LiquidCrystal.h> #include <Ultrasonic.h> // задаем пины Ultrasonic ultrasonic(11,10); LiquidCrystal lcd(7,6,5,4,3,2); #define trigPin 11 #define echoPin 10 #define led 12 #define led2 13 int soundPin=9; void setup() { Serial.begin(9600); lcd.begin(16,2); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(led, OUTPUT); pinMode(led2, OUTPUT); // срабадывание двух тонов tone (soundPin, 261); delay(500); noTone(soundPin); delay(1000); tone(soundPin, 493); delay(500); noTone(soundPin); delay(1000); } void loop() { int cm = ultrasonic.Ranging(CM); int soundPin = ultrasonic.Ranging(CM); // очищаем экран lcd.clear(); // устанавливаем курсор в начало lcd.setCursor(5,0); lcd.print(cm); lcd.print(" cm"); delay(1000); long duration, distance; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration/2) / 29.1; if (distance < 10) { // На этом этапе происходит вкл/выкл светодиода digitalWrite(led,HIGH); // когда загорается красный, зеленый обязан выключится digitalWrite(led,HIGH); // когда загорается красный, зеленый обязан выключится digitalWrite(led2,LOW); } else { digitalWrite(led,LOW); digitalWrite(led2,HIGH); } if (distance >= 200 || distance <= 0){ } else { Serial.print(distance); Serial.println(" cm"); // тут тоже можно указать " см" } delay(500); }
А если так? Код (C++): #include <LiquidCrystal.h> #include <Ultrasonic.h> // задаем пины Ultrasonic ultrasonic(11,10); LiquidCrystal lcd(7,6,5,4,3,2); #define trigPin 11 #define echoPin 10 #define led 12 #define led2 13 int soundPin=9; void setup() { Serial.begin(9600); lcd.begin(16,2); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(led, OUTPUT); pinMode(led2, OUTPUT); } void loop() { int cm = ultrasonic.Ranging(CM); // очищаем экран lcd.clear(); // устанавливаем курсор в начало lcd.setCursor(5,0); lcd.print(cm); lcd.print(" cm"); delay(1000); long duration, distance; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration/2) / 29.1; if (distance < 10) { // На этом этапе происходит вкл/выкл светодиода digitalWrite(led,HIGH); // когда загорается красный, зеленый обязан выключится digitalWrite(led,HIGH); // когда загорается красный, зеленый обязан выключится // срабадывание двух тонов tone (soundPin, 261); delay(500); noTone(soundPin); delay(1000); tone(soundPin, 493); delay(500); noTone(soundPin); delay(1000); digitalWrite(led2,LOW); } else { digitalWrite(led,LOW); digitalWrite(led2,HIGH); } if (distance >= 200 || distance <= 0){ } else { Serial.print(distance); Serial.println(" cm"); // тут тоже можно указать " см" } delay(500); }
ура... заработало, так как я хотел... так как не нашел информации написания кода с нуля вопрос: - как я понял: 1. указываем на какие пины мы подключаем модули. 2. void setup() - функции этих пинов (вход, выход), скорость обмена. 3 . после void loop() действия модулей и принцип работы. такой принцип написания кода???
setup выполняется один раз при запуске. loop выполняется в бесконечном цикле. Что конкретно туда закладывать - решаете вы сами по ситуации.