Оператор For для новичка

Tails_MP
Tails_MP аватар
Offline
Зарегистрирован: 11.11.2015

Всем добрый вечер. Есть у меня ультразвуковой дальномер и пьезо пищалка, 

хочу что бы она пищала громче, чаще и тоньше если расстояние становится ближе.

Ни че не понимаю, помогите плииииз....)))

 

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

 

Dr_grizzly
Dr_grizzly аватар
Offline
Зарегистрирован: 07.12.2015

погляди функцию map - очень интересная штуковина, думаю те то, что надо

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Непонятно, в чем проблема, и чем мы можем помочь.

Опять же, пищалки бывают активные и пассивные. С активной - по большей части хотелок - "нет". Но, судя по коду, используется пассивная. Тогда можно порекомендовать использовать tone() (кажется, так называется - ни разу не пользовался).

Tails_MP
Tails_MP аватар
Offline
Зарегистрирован: 11.11.2015

Собственно поглядел функцию мар. Отдельно работает, в моем коде нет... т.е. частота щелчков не увеличивается как должна.

и еще кое что указал в коментах, касательно вибрации

#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);} //выключение красного светодиода
//-----------------------------------------------------------------------------------
}
}

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Tails_MP, что вы называете пьезо пищалкой, название, модель, фото?

Tails_MP
Tails_MP аватар
Offline
Зарегистрирован: 11.11.2015

стоит первая. если со второй будет работать лучше или по другому, могу ее поставить

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Tails_MP,  вы включаете и отключаете пин излучателя, соответствеено и получаете щелчки. С чего бы там взяться писку? Пищать нужно командой tone() , и непонятно для чего это странная конструкция из tone в сетапе. Я бы сделал что-то типа этого:


uint16_t distance = (pulseIn(ECHO_PIN, HIGH, 50000))/58;
uint16_t freq=map(distance, 4, 300, 3500,32);
if (distance) tone(buz3,freq,10);

 

Tails_MP
Tails_MP аватар
Offline
Зарегистрирован: 11.11.2015

не заработало,  дистанцию не корректно показывает, из зи этого не могу зажечи светодиоды и все прочее.

и писк я хотел получить не такого формата.

я хотел что бы на рассоянии 1 метр, он пищал один раз в секунду, на 50см, 2 раза в секунду, ну и так далее. т.е. каждый сантиметр равен своему количеству писков. Как такое реализовать?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

delayInterval = 1.0/distance;

Tails_MP
Tails_MP аватар
Offline
Зарегистрирован: 11.11.2015

Замутил кароче так. Взял этот скетч, 

#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);} //выключение красного светодиода
//-----------------------------------------------------------------------------------

}
}

 

Tails_MP
Tails_MP аватар
Offline
Зарегистрирован: 11.11.2015

еще немного поколдовал. сделал с библиотекой и захотел добавить кнопки.

да вот беда, мозгов не хватило) режимы не переключаются, а если убрать подтягивающии резистор с земли, начинают перескакивать все подрят сами по себе. Ссылки на форум можете не кидать, уже смотрел и не понял)


#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);} //выключение красного светодиода
//-----------------------------------------------------------------------------------

}

 

Tails_MP
Tails_MP аватар
Offline
Зарегистрирован: 11.11.2015

еще немного поколдовал. сделал с библиотекой и захотел добавить кнопки.

да вот беда, мозгов не хватило) режимы не переключаются, а если убрать подтягивающии резистор с земли, начинают перескакивать все подрят сами по себе. Ссылки на форум можете не кидать, уже смотрел и не понял)


#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);} //выключение красного светодиода
//-----------------------------------------------------------------------------------

}

 

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Я вот так пищу:

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

при этом вызывается так:

play_tone(15,500,500) // 15-это тон, от 0 до 29

Проблем не возникало. Я так и не понял почему в Вашем случае используются analogWrite, это же тоже самое что и digitelWrite.

 

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

на счет кнопки я так понял что живет она на 7 пине. я бы сделал встроенную подтяжку. в void setup() добавьте

digitalWrite (7, HIGH);
pinMode (7, INPUT);

 теперь у нас если на 7 пине 1 то кнопка не нажата, если 0 то нажата...

 

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Я