arduino сигнализация

Тема в разделе "Arduino & Shields", создана пользователем andrys, 24 мар 2017.

  1. andrys

    andrys Нерд

    всем добрый день.
    прошу сильно не пинать так как только начинаю осваивать 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);
    }
    все работает, но пищалка не срабатывает...
    ткните носом, где я допустил ошибку... два дня просматриваю форумы, все перепробовал и все равно не могу найти ошибку...

    если отдельно заливать скетч на пищалку он работает... в моем скетче нехочет...
     
  2. rkit

    rkit Гуру

    У вас не звук на пищалку выводится, а просто высокий уровень.
     
    andrys и olegtur77 нравится это.
  3. olegtur77

    olegtur77 Нерд

    Плюс к тому же строчка digitalWrite(soundPin,HIGH); //срабатывание бипера
    включает лог уровень, а вот выключения нет, вместо него почему то другая команда noTone(soundPin); которая относиться к формированию тонового сигнала на выходе.. Нужно или логический вариант , но тогда бузер должен быть с встроенным генератором, или тоновый сигнал, но тогда усилитель с динамиком.
     
    andrys и arkadyf нравится это.
  4. andrys

    andrys Нерд

    спасибо за подсказку... попробую по вашим советам
     
  5. andrys

    andrys Нерд

    что то совсем мозги не догоняют...
    не пойму где ошибка:
    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);
    }
     
     
  6. olegtur77

    olegtur77 Нерд

    п.3 - подал высокий уровень и все...онт там на выходе и остался(...а тону уже и нечего выдавать..
    .В проге вместо п.3 должен стоять п.4..!!!!
    .Не надо на выход давать лог. уровень...ИЛИ уровень или ТОН.
     
    arkadyf и andrys нравится это.
  7. andrys

    andrys Нерд

    п.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);
    }
     
  8. olegtur77

    olegtur77 Нерд

    А если так?
    Код (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);
    }
     
    andrys нравится это.
  9. andrys

    andrys Нерд

    ура... заработало, так как я хотел...
    так как не нашел информации написания кода с нуля вопрос:
    - как я понял:
    1. указываем на какие пины мы подключаем модули.
    2. void setup() - функции этих пинов (вход, выход), скорость обмена.
    3 . после void loop() действия модулей и принцип работы.
    такой принцип написания кода???
     
  10. rkit

    rkit Гуру

    setup выполняется один раз при запуске. loop выполняется в бесконечном цикле. Что конкретно туда закладывать - решаете вы сами по ситуации.
     
    andrys нравится это.