Помогите разобраться с кодом)

Danilka
Danilka аватар
Offline
Зарегистрирован: 14.07.2016

Как зставть не моргать дисплей и серву заставить не гудеть?) может что в коде не то?) не судите строго, самоучка, первый скетч))

#include <LiquidCrystal.h>
#include <Servo.h>
 
Servo servo;
int echoPin = 44;  //44 и 45 пин подключен к ультрозвуковому датчику 
int trigPin = 45; 
int ledPin = 31; //31 и 30 пин светодиоды
int ledPinB = 30;
LiquidCrystal lcd(4, 5, 6, 7, 8, 9); //LCD дисплей
 
void setup() {
  Serial.begin (9600); 
  pinMode(trigPin, OUTPUT); 
  pinMode(echoPin, INPUT); 
  pinMode(ledPin, OUTPUT);
  pinMode(ledPinB, OUTPUT);
  servo.attach(10); //серво на 10 пину
}
void loop() 
{
  int duration, cm, mm; 
  digitalWrite(trigPin, LOW); 
  delayMicroseconds(2); 
  digitalWrite(trigPin, HIGH); 
  delayMicroseconds(10); 
  digitalWrite(trigPin, LOW); 
  duration = pulseIn(echoPin, HIGH); //измеряем продолжительность импульса
  cm = duration / 58; // преситываем продолжительность в см и мм
  mm = duration / 5.8;
  
  delay (400);
  
  Serial.print(cm); // выводим через последовательный порт на экран результаты
  Serial.print("   cm   "); 
  Serial.print(mm); 
  Serial.println("  mm   "); 
  
    lcd.begin(16, 2); // выводим а дисплей
    lcd.setCursor(3, 0);
    lcd.print("ZVUK SONAR");
    lcd.setCursor(0, 1);
    lcd.print("cm:");
    lcd.setCursor(4, 1);
    lcd.print(cm);
    lcd.setCursor(9, 1);
    lcd.print("mm:");
    lcd.setCursor(12, 1);
    lcd.print(mm);
    
  if (cm >=7 ) 
{  
     servo.write(10);  
        digitalWrite(ledPin, LOW);
        digitalWrite(ledPinB, HIGH);
}
  if (cm <7) 
{
     servo.write(170); 
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPin, HIGH);
 
}}
Marchenko
Marchenko аватар
Offline
Зарегистрирован: 15.12.2014

сам самоучка, но кажется проблема в delay (400);

Danilka
Danilka аватар
Offline
Зарегистрирован: 14.07.2016

Да уж разные значения подставлял и совсем убирал, но если убрать дисплей вообще сильно рябить начинает(

Marchenko
Marchenko аватар
Offline
Зарегистрирован: 15.12.2014

а что это вобще такое , можно в крации . и какая цель ?

Marchenko
Marchenko аватар
Offline
Зарегистрирован: 15.12.2014

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

Danilka
Danilka аватар
Offline
Зарегистрирован: 14.07.2016

Короче смысл в том, что при достижении 7 см срабытывает серво а на дисплей выводятся показания) ну еще 2 диода загораются) смысла пока в этом нет, просто эксперимент)

Danilka
Danilka аватар
Offline
Зарегистрирован: 14.07.2016

Моргает переодически, серву тоже отключал ничего не миняется, а питание 9 вольт отблока питания

 

Danilka
Danilka аватар
Offline
Зарегистрирован: 14.07.2016

Хотя моргает наверно грубо сказано, не прямо выключается и включается, а еле заметно как текст моргает с периодичностью

Marchenko
Marchenko аватар
Offline
Зарегистрирован: 15.12.2014

внутрений голос подсказывает, что вот тут

digitalWrite(trigPin, LOW); 
  delayMicroseconds(2); 
  digitalWrite(trigPin, HIGH); 
  delayMicroseconds(10); 
  digitalWrite(trigPin, LOW); 
 
какято жопа. 
это значит int trigPin = 45;
выключили , потом включили, потом опять выключили .
 
а уже опосля duration = pulseIn(echoPin, HIGH); //измеряем продолжительность импульса
 
кроме того что дисплей моргает данные правильные ? 
Danilka
Danilka аватар
Offline
Зарегистрирован: 14.07.2016

Данные правильные, сейчас попробую переделать не много

 

Danilka
Danilka аватар
Offline
Зарегистрирован: 14.07.2016

lcd.begin(16, 2); эту строчку в setup перетащил мигать перестал, зато данные стал не правильные показывать)) ладно короче, в обед попробую еще голову поломать, может что получиться)

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Danilka,

Учитывая дату Вашей регистрации, по уму, я должен бы послать Вас нафиг и не реагировать на Ваш пост, т.к. для опытного юзера такое выкладывание скетча недопустимо. Но сегодня, в честь праздника, я добрый, а потому, сделаю Вашу работу за Вас.

А именно, код нужно публиковать вот так:

#include <LiquidCrystal.h>
#include <Servo.h>

Servo servo;
int echoPin = 44;  //44 и 45 пин подключен к ультрозвуковому датчику
int trigPin = 45;
int ledPin = 31; //31 и 30 пин светодиоды
int ledPinB = 30;
LiquidCrystal lcd(4, 5, 6, 7, 8, 9); //LCD дисплей

void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(ledPinB, OUTPUT);
  servo.attach(10); //серво на 10 пину
}
void loop()
{
  int duration, cm, mm;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH); //измеряем продолжительность импульса
  cm = duration / 58; // преситываем продолжительность в см и мм
  mm = duration / 5.8;

  delay (400);

  Serial.print(cm); // выводим через последовательный порт на экран результаты
  Serial.print("   cm   ");
  Serial.print(mm);
  Serial.println("  mm   ");

  lcd.begin(16, 2); // выводим а дисплей
  lcd.setCursor(3, 0);
  lcd.print("ZVUK SONAR");
  lcd.setCursor(0, 1);
  lcd.print("cm:");
  lcd.setCursor(4, 1);
  lcd.print(cm);
  lcd.setCursor(9, 1);
  lcd.print("mm:");
  lcd.setCursor(12, 1);
  lcd.print(mm);

  if (cm >= 7 )
  {
    servo.write(10);
    digitalWrite(ledPin, LOW);
    digitalWrite(ledPinB, HIGH);
  }
  if (cm < 7)
  {
    servo.write(170);
    digitalWrite(ledPinB, LOW);
    digitalWrite(ledPin, HIGH);

  }
}

Теперь, когда есть номера строк, его можно и обсудить, а без номеров как обсуждать-то?.

Мигает и будет мигать, т.к. Вы при каждом проходе loop стираете весь экран (строка 38) и заново выводите всю информацию.

Строке 38 однозначно не место в функции loop и очень хорошо, что Вы её оттуда убрали. Точно также, туда же нужно убрать весь вывод на экран статической (никогда не изменяемой) информации, а именно строки 39-40, 41-42, 45-46 - это никогда не меняется, так зачем выводить это по многу раз? Один раз вывели и достаточно.

Что касается "неправильного вывода" после переноса строки 38 в setup, то посмотрите на строки 44 и 48. Вы там выводите числа. Прежде, чем выводить их надо стирать то. что там было. Иначе, если Вы сначала выведете 321, а потом захотите на то же место вывести 33, у Вас получится 331, т.к. единицу никто за Вас не сотрёт.

Идея понятна? Спрашивайте, если что, только при вопросе публикуйте свежую версию скетча.

С наступающим!

 

Danilka
Danilka аватар
Offline
Зарегистрирован: 14.07.2016

Спасибо за помощь, с наступающим

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

Danilka пишет:

 а питание 9 вольт отблока питания

На всякий случай: в Ардуино есть свой маломощный стабилизатор напряжения на 5 В, который позволяет питать ее от любого напряжения в диапазоне 7-20 В. Но, повторяю, он очень маломощный, поэтому питать от него электромеханику (например, серву) нельзя. Т.е. питание на моторчики, сервы, реле, Wi-Fi и пр. недопустиммо подавать через стабилизатор Ардуино.

Danilka
Danilka аватар
Offline
Зарегистрирован: 14.07.2016

Спасибо всем огромное за помощь, всем признателен. С Новым 2017 годом ардуинщики))))

Danilka
Danilka аватар
Offline
Зарегистрирован: 14.07.2016

После многочисленных проб и ошибок, а так же уйму потраченного времени, получилось правильно составить скетч) Хотел бы отдельно поблагодорить ЕвгенийП за его так сказать пинок)) а так же за ценный совет andriano и Marchenko за то что откликнулся на мою просьбу) 

Вот конечный вариант:

#include <LiquidCrystal.h>
#include <Servo.h>

Servo servo;
int echoPin = 44;  //44 и 45 пин подключен к ультрозвуковому датчику 
int trigPin = 45; 
int ledPin = 31; //31 и 30 пин светодиоды
int ledPinB = 30;
LiquidCrystal lcd(4, 5, 6, 7, 8, 9); //LCD дисплей

void setup() {
  Serial.begin (9600); 
  pinMode(trigPin, OUTPUT); 
  pinMode(echoPin, INPUT); 
  pinMode(ledPin, OUTPUT);
  pinMode(ledPinB, OUTPUT);
  servo.attach(10); //серво на 10 пину   
  
    lcd.begin(16, 2); // устанавливаем размер экрана и задаем постоянные надписи на дисплей
    lcd.setCursor(3, 0);
    lcd.print("ZVUK SONAR");
    lcd.setCursor(0, 1);
    lcd.print("cm:"); 
    lcd.setCursor(9, 1);
    lcd.print("mm:");
}
void loop() 
{
  int duration, cm, mm; 
  digitalWrite(trigPin, LOW); 
  delayMicroseconds(2); 
  digitalWrite(trigPin, HIGH); 
  delayMicroseconds(10); 
  digitalWrite(trigPin, LOW); 
  duration = pulseIn(echoPin, HIGH); //измеряем продолжительность импульса
  cm = duration / 58; // преситываем продолжительность в см и мм
  mm = duration / 5.8;
  
  delay (400);
  
  Serial.print(cm); // выводим через последовательный порт на экран результаты
  Serial.print("   cm   "); 
  Serial.print(mm); 
  Serial.println("  mm   "); 
  
    lcd.setCursor(4, 1);
    lcd.print(cm);
    lcd.setCursor(4, 1);
    lcd.print("     ");
    lcd.setCursor(4, 1);
    lcd.print(cm);
 
    lcd.setCursor(12, 1);
    lcd.print(mm);
    lcd.setCursor(12, 1);
    lcd.print("     ");
    lcd.setCursor(12, 1);
    lcd.print(mm);
    
  if (cm >=7 ) 
{  
     servo.write(10);  
        digitalWrite(ledPin, LOW);
        digitalWrite(ledPinB, HIGH);
}
  if (cm <7) 
{
     servo.write(170); 
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPin, HIGH);

}}

Всего то нужно было перенести строки с 19 по 25 в setup и дописать строки 48...51, 55...58)) Очень хороший получился для меня урок)

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
/*
#1 УЗ датчик ->44,45
#2 светодиоды ->31,30
#3 LCD 1602  ->4, 5, 6, 7, 8, 9
#4 серво  ->10
*/
//#1
const int ECHO_pin = 44;  //44 и 45 пин подключен к ультрозвуковому датчику
const int TRIG_pin = 45;
int L, L_cm, L_mm;
void Ultrasonic() { // измерение расстояния
  digitalWrite(TRIG_pin, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_pin, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_pin, LOW);
  L = pulseIn(ECHO_pin, HIGH); //измеряем продолжительность импульса
  L_cm = L / 58; // преситываем продолжительность в см и мм
  L_mm = L / 5.8;
}
//#2
const int Led1_pin = 31; //31 и 30 пин светодиоды
const int Led2_pin = 30;
//#3
#include <LiquidCrystal.h>
LiquidCrystal lcd(4, 5, 6, 7, 8, 9); //LCD дисплей
//#4
#include <Servo.h>
Servo servo;
const int Servo_pin = 10;

void setup() {
  Serial.begin (9600);
  //#1
  pinMode(TRIG_pin, OUTPUT);
  pinMode(ECHO_pin, INPUT);
  //#2
  pinMode(Led1_pin, OUTPUT);
  pinMode(Led2_pin, OUTPUT);
  //#3
  servo.attach(Servo_pin);
  //#4
  lcd.begin(16, 2); // устанавливаем размер экрана и задаем постоянные надписи на дисплей
  lcd.setCursor(3, 0);
  lcd.print("ZVUK SONAR");
  lcd.setCursor(0, 1);
  lcd.print("L_cm:");
  lcd.setCursor(9, 1);
  lcd.print("L_mm:");
}
void loop() {
  static uint32_t past_1 = 0 ;
  if (millis() - past_1 >= 400) { // если прошло 400 миллисек
    past_1 = millis() ;
    //#1
    Ultrasonic();
    Serial.print(L_cm); // выводим через последовательный порт на экран результаты
    Serial.print("   L_cm   ");
    Serial.print(L_mm);
    Serial.println("  L_mm   ");
    //#2,#3
    if (L_cm >= 7 ) {
      digitalWrite(Led1_pin, LOW);
      digitalWrite(Led2_pin, HIGH);
      servo.write(10);
    }
    else {
      digitalWrite(Led1_pin, HIGH);
      digitalWrite(Led2_pin, LOW);
      servo.write(170);
    }
    //#4
    lcd.setCursor(4, 1);
    lcd.print(L_cm);
    lcd.print("     ");
    lcd.setCursor(12, 1);
    lcd.print(L_mm);
    lcd.print("     ");
  }
}

 

Danilka
Danilka аватар
Offline
Зарегистрирован: 14.07.2016

Как я понял тоже самое только по другому написано?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Danilka пишет:
Как я понял тоже самое только по другому написано?

Ну да. Как я мог узнать, что вам надо. Просто я предложил вариант, который с моей точки лучше.