Оператор For для новичка
- Войдите на сайт для отправки комментариев
Вс, 20/12/2015 - 21:32
Всем добрый вечер. Есть у меня ультразвуковой дальномер и пьезо пищалка,
хочу что бы она пищала громче, чаще и тоньше если расстояние становится ближе.
Ни че не понимаю, помогите плииииз....)))
#define ECHO_PIN 13
#define TRIG_PIN 12
int buz3 = 3;
int max_distance;
void setup() {
Serial.begin(9600);
pinMode(TRIG_PIN, OUTPUT); //дальномер
pinMode(ECHO_PIN, INPUT); //дальномер
//pinMode(buz3, OUTPUT);//пищалка на 3 пине
}
void loop() {
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
int distance = pulseIn(ECHO_PIN, HIGH, 50000); // возможно нужно больше 10к... 10000
/*
Основа duration = pulseIn(echoPin, HIGH, 17460);
Чем меньше число 17460, тем быстрее возврат будет к измерению,
но меньше максимальное расстояние измерения.
17460 = 300 см * 58,2
*/
if (distance == 0) {
pinMode(ECHO_PIN, OUTPUT);
digitalWrite(ECHO_PIN, 0);
pinMode(ECHO_PIN, INPUT);
Serial.println("Out of range!");
} else {
if (distance > max_distance) max_distance = distance;
Serial.print(distance/58);
Serial.print(" CM, max=");
Serial.print(max_distance/58);
Serial.println(" CM");}
{
for (int i=0; i < 30; i++){
analogWrite(buz3, i);}
delay(10);
}
}
погляди функцию map - очень интересная штуковина, думаю те то, что надо
Непонятно, в чем проблема, и чем мы можем помочь.
Опять же, пищалки бывают активные и пассивные. С активной - по большей части хотелок - "нет". Но, судя по коду, используется пассивная. Тогда можно порекомендовать использовать tone() (кажется, так называется - ни разу не пользовался).
Собственно поглядел функцию мар. Отдельно работает, в моем коде нет... т.е. частота щелчков не увеличивается как должна.
и еще кое что указал в коментах, касательно вибрации
#define ECHO_PIN 13 #define TRIG_PIN 12 int ledGreen = 11; //Зелёный светодиод int ledYellow = 10; //Желтый светодиод int ledRed = 9; //Красный светодиод int motor = 8; //Вибрация int buzzer = 6; //Пищалка int max_distance; //переменная с максимальной дистанцией unsigned long time; void setup() { /*tone(6, 700, 300); delay(600); tone(6, 700, 300); delay(600); tone(6, 780, 150); delay(300); tone(6, 700, 150); delay(300); tone(6, 625, 450); delay(600); tone(6, 590, 150); delay(300); tone(6, 520, 150); delay(300); tone(6, 460, 450); delay(600); tone(6, 350, 450); delay(600);*/ Serial.begin(9600); //Запускаем сериал монитор pinMode(TRIG_PIN, OUTPUT); //дальномер pinMode(ECHO_PIN, INPUT); //дальномер pinMode(ledGreen, OUTPUT); pinMode(ledYellow, OUTPUT); pinMode(ledRed, OUTPUT); pinMode(motor, OUTPUT); pinMode(buzzer, OUTPUT); } void loop() { digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); int distance = pulseIn(ECHO_PIN, HIGH, 17460); // возможно нужно больше 10к... /* Основа duration = pulseIn(echoPin, HIGH, 17460); Чем меньше число 17460, тем быстрее возврат будет к измерению, но меньше максимальное расстояние измерения. 17460 = 300 см * 58,2 */ if (distance == 0) { pinMode(ECHO_PIN, OUTPUT); digitalWrite(ECHO_PIN, 0); pinMode(ECHO_PIN, INPUT); Serial.println("Out of range!"); } else { if (distance > max_distance) max_distance = distance; Serial.print(distance/58); Serial.print(" CM, max="); Serial.print(max_distance/58); Serial.println(" CM"); int duration, cm; cm = duration / 58; if (cm < 0) cm = 0; //int wait = map(cm, 0, 300, 1, 100); int wait = map(cm, 0, 300, 1, 100); // 1 - хз, 2 - хз, 3 - скорость считывания и пиканья(бред мля), 4 - хз digitalWrite (buzzer, HIGH) ;// send voice delay (wait) ;// Delay 1ms сраный делей еще... хз как избавится(( digitalWrite (buzzer, LOW) ;// do not send voice //-------------------------------------------------------------------------------- if (distance/58 < 40 && distance/58 > 30) //если расстояние больше n` то включаем {digitalWrite(ledGreen, HIGH);} //включение желтого светодиода //тут как то нужно включить моторчик один раз на пол секунды else if (distance/58 > 50) //если расстояние больше n` то выключаем {digitalWrite(ledGreen, LOW);} //выключение желтого светодиода //---------------------------------------------------------------------------------- if (distance/58 < 30 && distance/58 > 20) //если расстояние больше n` то включаем {digitalWrite(ledYellow, HIGH);} //включение желтого светодиода //тут как то нужно включить моторчик два раза на пол секунды else if (distance/58 > 40) //если расстояние больше n` то выключаем {digitalWrite(ledYellow, LOW);} //выключение желтого светодиода //---------------------------------------------------------------------------------- if (distance/58 < 20 && distance/58 > 10) //если расстояние больше n` то включаем {digitalWrite(ledRed, HIGH);} //включение красного светодиода //тут как то нужно включить моторчик три раза на пол секунды else if (distance/58 > 30) //если расстояние больше n` то выключаем {digitalWrite(ledRed, LOW);} //выключение красного светодиода //----------------------------------------------------------------------------------- } }Tails_MP, что вы называете пьезо пищалкой, название, модель, фото?
Tails_MP, вы включаете и отключаете пин излучателя, соответствеено и получаете щелчки. С чего бы там взяться писку? Пищать нужно командой tone() , и непонятно для чего это странная конструкция из tone в сетапе. Я бы сделал что-то типа этого:
не заработало, дистанцию не корректно показывает, из зи этого не могу зажечи светодиоды и все прочее.
и писк я хотел получить не такого формата.
я хотел что бы на рассоянии 1 метр, он пищал один раз в секунду, на 50см, 2 раза в секунду, ну и так далее. т.е. каждый сантиметр равен своему количеству писков. Как такое реализовать?
delayInterval = 1.0/distance;
Замутил кароче так. Взял этот скетч,
#include «Ultrasonic.h» Ultrasonic ultrasonic(7, 6); void setup() { pinMode(14, OUTPUT); pinMode(13, OUTPUT); } void beep(int d, int l, int p){ int to = l / (d / 1000); digitalWrite(13, HIGH); for (int i=0;i<to;i++){ analogWrite(14, 0); analogWrite(14, 255); delayMicroseconds(d); } digitalWrite(13, LOW); delay(p); } void loop() { dist = ultrasonic.Ranging(CM); // get distance if(dist > 150 or dist == 0) { digitalWrite(13, LOW); } else { beep(3000, 100, 20); delay(dist * dist/ 15); } }и пытался вставить его к себе. но вот беда, пищать начинает только на расстоянии 3 сантиметра. В чем дело помогите!!!
новый скетч теперь выглядит так:
#define ECHO_PIN 13 #define TRIG_PIN 12 #define LED_GREEN 11 //Зелёный светодиод #define LED_YELLOW 10 //Желтый светодиод #define LED_RED 9 //Красный светодиод int ind = 8; //индикация писка светодиод int buzzer = 14; //Пищалка int max_distance; //переменная с максимальной дистанцией unsigned long time; void setup() { /*tone(6, 700, 300); delay(600); tone(6, 700, 300); delay(600); tone(6, 780, 150); delay(300); tone(6, 700, 150); delay(300); tone(6, 625, 450); delay(600); tone(6, 590, 150); delay(300); tone(6, 520, 150); delay(300); tone(6, 460, 450); delay(600); tone(6, 350, 450); delay(600);*/ Serial.begin(9600); //Запускаем сериал монитор pinMode(TRIG_PIN, OUTPUT); //дальномер pinMode(ECHO_PIN, INPUT); //дальномер pinMode(LED_GREEN, OUTPUT); pinMode(LED_YELLOW, OUTPUT); pinMode(LED_RED, OUTPUT); pinMode(ind, OUTPUT); pinMode(buzzer, OUTPUT);} void beep(int d, int l, int p){ int to = l / (d / 1000); digitalWrite(ind, HIGH); for (int i=0;i<to;i++){ analogWrite(14, 0); analogWrite(14, 255); delayMicroseconds(d); } digitalWrite(ind, LOW); delay(p); } void loop() { digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); int distance = pulseIn(ECHO_PIN, HIGH, 17460); // возможно нужно больше 10к... //uint16_t distance = (pulseIn(ECHO_PIN, HIGH, 17460))/58; //uint16_t freq=map(distance, 4, 300, 3500,32); //if (distance) tone(buzzer,freq,1); //тон писка 1 (можно менять) /* Основа duration = pulseIn(echoPin, HIGH, 17460); Чем меньше число 17460, тем быстрее возврат будет к измерению, но меньше максимальное расстояние измерения. 17460 = 300 см * 58,2 */ if (distance == 0) { pinMode(ECHO_PIN, OUTPUT); digitalWrite(ECHO_PIN, 0); pinMode(ECHO_PIN, INPUT); Serial.println("Out of range!"); } else { if (distance > max_distance) max_distance = distance; Serial.print(distance/58); Serial.print(" CM, max="); Serial.print(max_distance/58); Serial.println(" CM"); if(distance > 200 or distance == 0) { digitalWrite(13, LOW); } else { beep(3000, 100, 20); delay(distance/58 * distance/58 /15); } //-------------------------------------------------------------------------------- if (distance/58 < 40 && distance/58 > 30) //если расстояние больше n` то включаем {digitalWrite(LED_GREEN, HIGH);} //включение желтого светодиода //тут как то нужно включить моторчик один раз на пол секунды else if (distance/58 > 50) //если расстояние больше n` то выключаем {digitalWrite(LED_GREEN, LOW);} //выключение желтого светодиода //---------------------------------------------------------------------------------- if (distance/58 < 30 && distance/58 > 20) //если расстояние больше n` то включаем {digitalWrite(LED_YELLOW, HIGH);} //включение желтого светодиода //тут как то нужно включить моторчик два раза на пол секунды else if (distance/58 > 40) //если расстояние больше n` то выключаем {digitalWrite(LED_YELLOW, LOW);} //выключение желтого светодиода //---------------------------------------------------------------------------------- if (distance/58 < 20 && distance/58 > 10) //если расстояние больше n` то включаем {digitalWrite(LED_RED, HIGH);} //включение красного светодиода //тут как то нужно включить моторчик три раза на пол секунды else if (distance/58 > 30) //если расстояние больше n` то выключаем {digitalWrite(LED_RED, LOW);} //выключение красного светодиода //----------------------------------------------------------------------------------- } }еще немного поколдовал. сделал с библиотекой и захотел добавить кнопки.
да вот беда, мозгов не хватило) режимы не переключаются, а если убрать подтягивающии резистор с земли, начинают перескакивать все подрят сами по себе. Ссылки на форум можете не кидать, уже смотрел и не понял)
#include "Ultrasonic.h" #define LED_GREEN 11 //Зелёный светодиод #define LED_YELLOW 10 //Желтый светодиод #define LED_RED 9 //Красный светодиод #define BUZZER 14 //пищалка int LED_BLINK = 8; //светодиод моргает с пищалкой int flag=0; int regim=1; float max_distance; //переменная с максимальной дистанцией // sensor connected to: // Trig - 12, Echo - 13 Ultrasonic ultrasonic(12, 13); void setup() { pinMode(BUZZER, OUTPUT); pinMode(LED_BLINK, OUTPUT); pinMode(LED_GREEN, OUTPUT); pinMode(LED_YELLOW, OUTPUT); pinMode(LED_RED, OUTPUT); Serial.begin(9600); // start the serial port } void beep(int d, int l, int p){ int to = l / (d / 1000); digitalWrite(LED_BLINK, HIGH); for (int i=0;i<to;i++){ analogWrite(BUZZER, 0); analogWrite(BUZZER, 255); delayMicroseconds(d); } digitalWrite(LED_BLINK, LOW); delay(p); } void loop() { float dist_cm = ultrasonic.Ranging(CM); // get distance // Serial.println(dist_cm); // print the distance if (dist_cm > max_distance) max_distance = dist_cm; Serial.print(dist_cm); Serial.print(" CM, max="); Serial.print(max_distance); Serial.println(" CM"); dist_cm = ultrasonic.Ranging(CM); // get distance if(digitalRead(7)==HIGH&&flag==0) { regim++; flag=1; if(regim>5) { regim=1; } } if(digitalRead(7)==LOW&&flag==1) { flag=0; } if(regim==1) {beep(1000, 100, 20); delay(dist_cm * dist_cm/ 15); Serial.println("regim1");} if(regim==2) {beep(2000, 100, 20); delay(dist_cm * dist_cm/ 15); Serial.println("regim2");} if(regim==3) {beep(3000, 100, 20); delay(dist_cm * dist_cm/ 15); Serial.println("regim3");} if(regim==4) {beep(4000, 100, 20); delay(dist_cm * dist_cm/ 15); Serial.println("regim4");} if(regim==5) {beep(5000, 100, 20); delay(dist_cm * dist_cm/ 15); Serial.println("regim5");} //beep(3000, 100, 20); //delay(dist_cm * dist_cm/ 15); //-------------------------------------------------------------------------------- if (dist_cm <= 100) //если расстояние больше n` то включаем {digitalWrite(LED_GREEN, HIGH);} //включение желтого светодиода //тут как то нужно включить моторчик один раз на пол секунды else if (dist_cm > 105) //если расстояние больше n` то выключаем {digitalWrite(LED_GREEN, LOW);} //выключение желтого светодиода //---------------------------------------------------------------------------------- if (dist_cm <= 75) //если расстояние больше n` то включаем {digitalWrite(LED_YELLOW, HIGH);} //включение желтого светодиода //тут как то нужно включить моторчик два раза на пол секунды else if (dist_cm > 80) //если расстояние больше n` то выключаем {digitalWrite(LED_YELLOW, LOW);} //выключение желтого светодиода //---------------------------------------------------------------------------------- if (dist_cm <= 50) //если расстояние больше n` то включаем {digitalWrite(LED_RED, HIGH);} //включение красного светодиода //тут как то нужно включить моторчик три раза на пол секунды else if (dist_cm > 55) //если расстояние больше n` то выключаем {digitalWrite(LED_RED, LOW);} //выключение красного светодиода //----------------------------------------------------------------------------------- }еще немного поколдовал. сделал с библиотекой и захотел добавить кнопки.
да вот беда, мозгов не хватило) режимы не переключаются, а если убрать подтягивающии резистор с земли, начинают перескакивать все подрят сами по себе. Ссылки на форум можете не кидать, уже смотрел и не понял)
#include "Ultrasonic.h" #define LED_GREEN 11 //Зелёный светодиод #define LED_YELLOW 10 //Желтый светодиод #define LED_RED 9 //Красный светодиод #define BUZZER 14 //пищалка int LED_BLINK = 8; //светодиод моргает с пищалкой int flag=0; int regim=1; float max_distance; //переменная с максимальной дистанцией // sensor connected to: // Trig - 12, Echo - 13 Ultrasonic ultrasonic(12, 13); void setup() { pinMode(BUZZER, OUTPUT); pinMode(LED_BLINK, OUTPUT); pinMode(LED_GREEN, OUTPUT); pinMode(LED_YELLOW, OUTPUT); pinMode(LED_RED, OUTPUT); Serial.begin(9600); // start the serial port } void beep(int d, int l, int p){ int to = l / (d / 1000); digitalWrite(LED_BLINK, HIGH); for (int i=0;i<to;i++){ analogWrite(BUZZER, 0); analogWrite(BUZZER, 255); delayMicroseconds(d); } digitalWrite(LED_BLINK, LOW); delay(p); } void loop() { float dist_cm = ultrasonic.Ranging(CM); // get distance // Serial.println(dist_cm); // print the distance if (dist_cm > max_distance) max_distance = dist_cm; Serial.print(dist_cm); Serial.print(" CM, max="); Serial.print(max_distance); Serial.println(" CM"); dist_cm = ultrasonic.Ranging(CM); // get distance if(digitalRead(7)==HIGH&&flag==0) { regim++; flag=1; if(regim>5) { regim=1; } } if(digitalRead(7)==LOW&&flag==1) { flag=0; } if(regim==1) {beep(1000, 100, 20); delay(dist_cm * dist_cm/ 15); Serial.println("regim1");} if(regim==2) {beep(2000, 100, 20); delay(dist_cm * dist_cm/ 15); Serial.println("regim2");} if(regim==3) {beep(3000, 100, 20); delay(dist_cm * dist_cm/ 15); Serial.println("regim3");} if(regim==4) {beep(4000, 100, 20); delay(dist_cm * dist_cm/ 15); Serial.println("regim4");} if(regim==5) {beep(5000, 100, 20); delay(dist_cm * dist_cm/ 15); Serial.println("regim5");} //beep(3000, 100, 20); //delay(dist_cm * dist_cm/ 15); //-------------------------------------------------------------------------------- if (dist_cm <= 100) //если расстояние больше n` то включаем {digitalWrite(LED_GREEN, HIGH);} //включение желтого светодиода //тут как то нужно включить моторчик один раз на пол секунды else if (dist_cm > 105) //если расстояние больше n` то выключаем {digitalWrite(LED_GREEN, LOW);} //выключение желтого светодиода //---------------------------------------------------------------------------------- if (dist_cm <= 75) //если расстояние больше n` то включаем {digitalWrite(LED_YELLOW, HIGH);} //включение желтого светодиода //тут как то нужно включить моторчик два раза на пол секунды else if (dist_cm > 80) //если расстояние больше n` то выключаем {digitalWrite(LED_YELLOW, LOW);} //выключение желтого светодиода //---------------------------------------------------------------------------------- if (dist_cm <= 50) //если расстояние больше n` то включаем {digitalWrite(LED_RED, HIGH);} //включение красного светодиода //тут как то нужно включить моторчик три раза на пол секунды else if (dist_cm > 55) //если расстояние больше n` то выключаем {digitalWrite(LED_RED, LOW);} //выключение красного светодиода //----------------------------------------------------------------------------------- }Я вот так пищу:
void play_tone(int ton, int dur, int post_delay) { if (ton>29){ton=29;} for(long i=0;i<dur*1000L;i+=(3000-100*ton)*2) { digitalWrite(pin_piezo, HIGH); delayMicroseconds(3000-100*ton); digitalWrite(pin_piezo, LOW); delayMicroseconds(3000-100*ton); } delay(post_delay); }при этом вызывается так:
Проблем не возникало. Я так и не понял почему в Вашем случае используются analogWrite, это же тоже самое что и digitelWrite.
на счет кнопки я так понял что живет она на 7 пине. я бы сделал встроенную подтяжку. в void setup() добавьте
теперь у нас если на 7 пине 1 то кнопка не нажата, если 0 то нажата...
Я