Первый скетч, раскритикуйте плиз.

triada13
Offline
Зарегистрирован: 04.01.2013

Доброе время суток уважаемые форумчане.

Дождался я наконец то сенсоры, и вот выкладываю первое творение своих шаловливых ручек. Сознаюсь сразу что чесно скопировал из других скетчей, и прошу подсказать мне как этот код сделать более компактным и стройным.


// подключаем библиотеки для работы с LCD и Ультрасоником
#include <LiquidCrystal.h>
#include <Ultrasonic.h>



  Ultrasonic ultrasonic(8, 9); // Цепляем Соник на: Trig - 8, Echo - 9
    
  LiquidCrystal lcd(4, 5, 10, 11, 12, 13); // инициализируем LCD, указывая контакты данных

void setup()
{
  //Serial.begin(9600);                           // start the serial port
  lcd.begin(16, 2); // указываем размерность экрана и начинаем работать
  lcd.print("Hello, world!"); // пишем первую строку

  // Пишем вторую строку
  lcd.print("I love Habr!");
}

void loop()
{
  
  //float dist_cm 
  int dist = ultrasonic.Ranging(CM);       // get distance
  lcd.clear();
  lcd.setCursor(0, 1); // сдвигаем курсор на вторую строку, первый столбец (нумерация с 0)
  lcd.print("DISTANCE");
  lcd.setCursor(10, 1); // сдвигаем курсор на вторую строку, 10 столбец (нумерация с 0)
  lcd.print(dist);
  lcd.print(" CM");
  if (dist >4, dist <= 10) // если дистанция более 4 см, но меньше 10 см
  {
   lcd.setCursor(0, 0);
   lcd.print("DANGER"); //светим надпись "Опасность"
  }
  if (dist <= 4) // если дистанция меньше или равно 4 см
  {
   lcd.setCursor(10, 0);
   lcd.print("STOP"); //светим надпись "Стоп"
   
  }
  if (dist > 20) // если дистанция более 20 см
  {
   lcd.setCursor(0, 0);
   lcd.print("Forward"); // светим надпись "Вперед"
  } 
  delay(500);           // пауза пол сек.

}

 

maksim
Offline
Зарегистрирован: 12.02.2012

Странно что компилятор пропустил вот такую конструкцию

if (dist >4, dist <= 10) // если дистанция более 4 см, но меньше 10 см

работает?  что у вас на самом деле происходит в этой строке знает только компилятор, поэтому замените лучше на такую:

if (dist > 4 && dist <= 10) // если дистанция более 4 см, но меньше 10 см

 

Zapek@n
Offline
Зарегистрирован: 16.02.2012

Мне кажется, что в логику ветвлений забрался глюк, хотя может так и задумано

Что будет делать если дистанция меньше 4 - понятно

больше 4, но меньше 10 - понятно

больше 20 - понятно

А вот больше 10, но меньше 20 - непонятно. Хотя может так задумано.

triada13
Offline
Зарегистрирован: 04.01.2013

maksim спасибо за подсказку, еще одна песчинка в мою пустую копилку.

А подскажи, можно ли это код взять за основу для управления эл. машинкой? поставить туда три соника: один вперед и два по бокам и управлять ею на основе показаний с них?

Я так понял что для каждого оника надо будет завести свою строчку типа так:

int distFront = ultrasonicF.Ranging(CM);
int distLeft = ultrasonicL.Ranging(CM);
int distRight = ultrasonicR.Ranging(CM);

ну и соответственно и вывода подключить на разные пины. Я прав?

triada13
Offline
Зарегистрирован: 04.01.2013

На экране горит "DANGER". Я еще не разобрался, по идее надо чтоб гасла надпись, но пока горит.

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

В каждом операторе if нужно очищать дисплей один раз при запуске этого оператора.

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

triada13
Offline
Зарегистрирован: 04.01.2013

nestandart пишет:

В каждом операторе if нужно очищать дисплей один раз при запуске этого оператора.

А команда очистки действует на весь экран сразу, или есть возможность очищать этой командой адресно?

И что можете сказать по поводу поста #3, я прав или нет?

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

>>А команда очистки действует на весь экран сразу, или есть возможность очищать этой командой адресно?<<

На весь сразу.

>>И что можете сказать по поводу поста #3, я прав или нет?<<

Я бы как минимум поставил датчики разного класса. Как максимум выкинул УЗ и поствил ИК (только не дальномер).

И поставил бы я его на серву.

triada13
Offline
Зарегистрирован: 04.01.2013

nestandart пишет:

 

Я бы как минимум поставил датчики разного класса. Как максимум выкинул УЗ и поствил ИК (только не дальномер).

И поставил бы я его на серву.

К сожалению в наличии пока только УЗ в количестве 3 шт.

У меня есть РУ машинка, я хочу выкинуть с нее приемник а регулятор двигателя и рулевую серву оставить, поставить туда дуину чтоб она сама каталась.

P.S.

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


// подключаем библиотеки для работы с LCD и Ультрасоником
#include <LiquidCrystal.h>
#include <Ultrasonic.h>



Ultrasonic ultrasonic(8, 9); // Цепляем Соник на: Trig - 8, Echo - 9
    
LiquidCrystal lcd(4, 5, 10, 11, 12, 13); // инициализируем LCD, указывая контакты данных

// Объявляем переменные.
int lcdContr = 3; // Регулятор контрастности на 3 пин.
int ledLight = 6; // Регулятор яркости подсветки на 6 пин.


void setup()
{
  analogWrite(lcdContr, 40); // Устанавливаем контрастность дисплея.
  analogWrite(ledLight, 50); // Устанавливаем яркость подсветки.
  lcd.begin(16, 2); // указываем размерность экрана и начинаем работать
  lcd.print("Hello, world!"); // пишем первую строку
  delay(3000);
}

void loop()
{
  
  int dist = ultrasonic.Ranging(CM);       // get distance
  lcd.clear(); //Очищаем дисплей.
  lcd.setCursor(0, 1); // сдвигаем курсор на вторую строку, первый столбец (нумерация с 0).
  lcd.print("DISTANCE");  // светим надпись "Дистанция".
  lcd.setCursor(10, 1); // сдвигаем курсор на вторую строку, 10 столбец (нумерация с 0).
  lcd.print(dist); // светим значение.
  lcd.print(" CM"); // светим еденицы измерения.
  
  if (dist >4 && dist <= 10) // если дистанция более 4 см, но меньше 10 см
  {
   lcd.setCursor(0, 0);
   lcd.print("DANGER"); //светим надпись "Опасность"
  }
  
  if (dist >10 && dist <20) // если дистанция более 10 см, но меньше 20 см
  {
   lcd.setCursor(0, 0);
   lcd.print("AHTUNG"); //светим надпись "Внимание" 
  }
  
  if (dist <= 4) // если дистанция меньше или равно 4 см
  {
   lcd.setCursor(10, 0);
   lcd.print("STOP"); //светим надпись "Стоп"
   
  }
  
  if (dist > 20) // если дистанция более 20 см
  {
   lcd.setCursor(0, 0);
   lcd.print("Forward"); // светим надпись "Вперед"
  } 
  delay(500);           // пауза пол сек.

}