Помогите правильно сделать программу

pitiol
Offline
Зарегистрирован: 28.06.2018
Здравствуйте я новичок в программировании и на этом сайте впервые. Вообщем, я делаю проект для школы-парктроник. Он должен выводить на дисплей 16х2 измерения сразу с 3 датчиков ультразвука. На дисплее должно показываться 
| LEFT:расстояние MID:расстояние|
| RIGHT:расстояние                      |
(так это должно выглядеть на дисплее)
Но вместо  MID пишутся нули которые не меняют значения просто нули. Объясните пожалуйста в чем причина.
Вот и сама программа
 
 
 
 
#include <LiquidCrystal.h>
#include <Ultrasonic.h>
 
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs,en,d4,d5,d6,d7);
Ultrasonic ultrasonic1 (6,13);
Ultrasonic ultrasonic2 (8,7);
Ultrasonic ultrasonic3 (9,1);
int buzzer = 10;
void setup() {
  
  Serial.begin (9600);
  lcd.begin(16,2);
  lcd.print ("LEFT:");
  lcd.setCursor(9,0);
  lcd.print ("MID:");
  lcd.setCursor(0,1);
  lcd.print ("RIGHT:");
  pinMode (buzzer,OUTPUT); 
 
  
  // put your setup code here, to run once:
 
}
 
void loop() {
  float dist_cm1 = ultrasonic1.Ranging(CM);
  lcd.setCursor(5,0);
  lcd.print (dist_cm1);
  float dist_cm2 = ultrasonic2.Ranging(CM);
  lcd.setCursor(13,0);
  lcd.print (dist_cm2);
  float dist_cm3 = ultrasonic3.Ranging(CM);
  lcd.setCursor(7,1);
  lcd.print (dist_cm3);
 
if (dist_cm1,dist_cm2,dist_cm3 < 20){
  tone (buzzer, 500);
  delay (300);
  tone (buzzer, 500);
  delay (300);
if (dist_cm1,dist_cm2,dist_cm3 < 40){
  tone (buzzer, 500);
  delay (600);
  tone (buzzer, 500);
  delay (600);
  if (dist_cm1,dist_cm2,dist_cm3 < 60) {
  tone (buzzer, 500);
  delay (1000);
  tone (buzzer, 1000);
  delay (1000);}
  
  // put your main code here, to run repeatedly:
 
}}}
 
 
Заранее спасибо за помощь
DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015
Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

pitiol, Ultrasonic, Newping и т. п. библиотеки для датчиков типа HCSR-04 правильно работают только на ext-interrupt совместимых входах, у Uno/Nano плат это D2 и D3. Можете соединить входы TRIG и ECHO у всех трёх модулей вместе, и повесить на два конкретных вывода (очевидно, ECHO на D2 или D3). Тогда можно будет выкинуть два экземпляра класса датчика, и читать это как один и тот же датчик, а датчики коммутировать по питанию. Отключать надо плюс (провод Vcc), а не землю - это делается PNP или p-FET транзистором.

Алсо, замените

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs,en,d4,d5,d6,d7);

на просто

LiquidCrystal lcd(12,11,5,4,3,2);

Вы бесполезно расходуете 12 байт оперативной памяти.

sadman41
Offline
Зарегистрирован: 19.10.2016

Вуду, ты зачем пятикласснику про мосфеты задвигаешь?)) Скорее всего там что-то простое типа оторвавшегося провода.

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Употребляемые мной термины легко гуглятся. Пусть учатся.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Voodoo Doll пишет:

Пусть учатся.

Щас это не модно.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Voodoo Doll пишет:

 Пусть учатся.

Ты шо?  Это же читать надо уметь.  

Datak
Offline
Зарегистрирован: 09.10.2014

Voodoo Doll пишет:

Алсо, замените

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs,en,d4,d5,d6,d7);

на просто

LiquidCrystal lcd(12,11,5,4,3,2);

Вы бесполезно расходуете 12 байт оперативной памяти.

В исходном варианте прекрасно видно, что означает каждая из цифр.

В новом - это просто цифры, и в следующий раз, читая этот скетч, обязательно придётся потратить какое-то время на "расшифровывание" этой строчки.

Что лучше - тратить байты, или тратить своё время - каждый решает сам. К тому же, в данном случае, значения явно прописаны как const, и скорее всего ни один вменяемый компилятор выделять под них память не будет.

А вообще, чтобы уж ни у кого не возникало сомнений, почему бы не писать это всё дефайном: #define  rs  12

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Datak, а если почаще работать с экранами на HD44780 - то в голове отложится, что пины обявляются в порядке RS, E, D4..D7. Define логично, но раз такая пьянка - можно и комментарий написать, бонусом займёт одну строку, а не шесть. Я его не пишу т. к. помню порядок.

После причастных оборотов употреблять глагол в инфинитивной форме - это тоже ошибка, кстати. Правильная формулировка - "во время чтения (...) скетча (...) придётся тратить ...". Или "читая (...) скетч, его автор будет вынужден [благополучно пропущенный в предложении] тратить (...)". Будем дальше тупой срач продолжать, или выждем автора? pitiol, приём.

Datak
Offline
Зарегистрирован: 09.10.2014

Voodoo Doll пишет:

Datak, а если почаще работать с экранами на HD44780 - то в голове отложится, что пины обявляются в порядке RS, E, D4..D7.

Я писал как раз о тех, кто с экранами HD44780 ни разу не работал. О себе, то есть.

Никого ничем задеть не хотел, сраться не планировал - это, вообще, не мой стиль.

Если что-то получилось кривовато - мои извинения.

По филологиченскому вопросу - я просто в шоке. Вряд ли получится принять это сразу. Но я буду думать. ))

ArtHome
ArtHome аватар
Offline
Зарегистрирован: 19.05.2018

Datak пишет:

Если что-то получилось кривовато - мои извинения.

Да совершенно всё нормально, вот и Вуду кой-чего новое узнал и вы не сомневайтесь, что именованные константы отличаются от неименованных только наличием имени, а не способом обработки, то есть всегда будут подставлены по значению с контролем типа и правильной арифметикой) В ассемблере имён уже не будет.

Дифайны вместо именованных констант это тоже ужасно, их существование - "эхо войны".