Не работает Ultrasonic (HC-SR04) с Семисегментным индикатором (TM74HC595)

Otto
Offline
Зарегистрирован: 26.06.2016

Здраствуйте. Такая проблема, есть Ультразвуковой дальномер "HC-SR04" и Семисегментный индикатор "TM74HC595" на двух сдвиговых регистрах, но при попытке вывода информации на Семисегментник результаты очень корявые, неверные и подвисают.

Библиотека TM74HC595Display.h используется НОВАЯ, для её работы необходима ещё билиотека TimerOne.h.

Выяснил, что проблема заключается в билиотеке  TM74HC595Display.h (в новой и старой такая же беда). 

Может кто сталкивался с подобной проблемой.... В инете ничего толкового не нашёл с такой проблемой семисегментника в паре с дальномером.

Вот сам код:

#include <TM74HC595Display.h>   // Библиотека Семисегментного дисплея "НОВАЯ"
#include <TimerOne.h>           // Библиотека 1-го Таймера (нужна для работы НОВОЙ библиотеки дисплея)

#define Trig 10 //пины дальномера
#define Echo 11

unsigned int impulseTime = 0;
unsigned int distance_sm = 0;


//--------СЕМИСЕГМЕНТНЫЙ ДИСПЛЕЙ-------
int SCLK = 4; //пины цифровые
int RCLK = 6;
int DIO = 5;
TM74HC595Display disp(SCLK, RCLK, DIO);   //Инициализируем дисплей
unsigned char LED_0F[29];


void timerIsr() {   //Функция для работы таймера для дисплея
  disp.timerIsr();
}


void setup() {
  
  pinMode(Trig, OUTPUT); //инициируем как выход
  pinMode(Echo, INPUT); //инициируем как вход

  //для дисплея цифры
  LED_0F[0] = 0xC0; //0
  LED_0F[1] = 0xF9; //1
  LED_0F[2] = 0xA4; //2
  LED_0F[3] = 0xB0; //3
  LED_0F[4] = 0x99; //4
  LED_0F[5] = 0x92; //5
  LED_0F[6] = 0x82; //6
  LED_0F[7] = 0xF8; //7
  LED_0F[8] = 0x80; //8
  LED_0F[9] = 0x90; //9

  Timer1.initialize(1500); // установить таймер на 1,5 сек
  Timer1.attachInterrupt(timerIsr); // Прикрепить таймер тут
}



void loop()
{
  digitalWrite(Trig, HIGH);
  /* Подаем импульс на вход trig дальномера */
  delayMicroseconds(10); // равный 10 микросекундам
  digitalWrite(Trig, LOW); // Отключаем
  impulseTime = pulseIn(Echo, HIGH); // Замеряем длину импульса
  distance_sm = impulseTime / 58; // Пересчитываем в сантиметры

  disp.digit4(distance_sm, 0);   //Вывести тумпературу начиная с 1 сегмента справа
    
  delay(300); 
}

 

Otto
Offline
Зарегистрирован: 26.06.2016

Ссылка на новую билиотеку

inspiritus
Offline
Зарегистрирован: 17.12.2012

А без дальномера все нормально выводится?

Otto
Offline
Зарегистрирован: 26.06.2016

inspiritus пишет:

А без дальномера все нормально выводится?

Да, нормально выводится инфа о температуре с датчика Термопары MAX6675 и Датчика Холла (Тахометр), а тут как только не пробовал, какая то несовместимость. Без библиотеки TM74HC595Display.h Дальномер тоже отлично работает.

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

Уберите дальномер с 10-го пина (строка 4). Пины 9 и 10 вообще не трогайте иначе Ваш дальномер за них с TimerOne подерётся.

Otto
Offline
Зарегистрирован: 26.06.2016

ЕвгенийП пишет:

Уберите дальномер с 10-го пина (строка 4). Пины 9 и 10 вообще не трогайте иначе Ваш дальномер за них с TimerOne подерётся.

На 12 и 13 пинах тоже самое.....

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

Через полчаса вернусь и посмотрю дальше. Но это (9 и 10 пины) по-любому так, не возвращайте обратно.

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

Так Otto, попробуйте перед pulseIn (строка 53) поставить

cli();

а после поставить

sei();

Если мне склероз не изменяет, то pulseIn не использует прерывания, а потому ему должно быть пофигу.

При этом может появиться мерцание экрана - не берите в голову, потом поборем.

Скажите, что получилось?

Otto
Offline
Зарегистрирован: 26.06.2016

Мерцания появляются когда расстояние от дальномера до препятствия не менее 30 см, но толку нет от этого. Вот ссылка на короткое видео, как ведёт себя дальномер + LED. На кучу проводов не обращайте внимания, там ничего не задействовано программно и не мешает работе этой маленькой программы.

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

Нет, погодите. Давайте толком.

Простите, я там немного неправильно написал. Давайте внимательно. Вот эти строки

  digitalWrite(Trig, HIGH);
  /* Подаем импульс на вход trig дальномера */
  delayMicroseconds(10); // равный 10 микросекундам
  digitalWrite(Trig, LOW); // Отключаем
  impulseTime = pulseIn(Echo, HIGH); // Замеряем длину импульса

Заключите в cli/sei. Должно получиться вот так:

cli();  
digitalWrite(Trig, HIGH);
  /* Подаем импульс на вход trig дальномера */
  delayMicroseconds(10); // равный 10 микросекундам
  digitalWrite(Trig, LOW); // Отключаем
  impulseTime = pulseIn(Echo, HIGH); // Замеряем длину импульса
sei();

Сделайте это, запустите и помсотрите что показывает дальномер. Он должен работать нормально, как без экрана вовсе.

Сделайте и напишите, что получилось.

Otto
Offline
Зарегистрирован: 26.06.2016

Тоже самое, бурду из кучи цифр выдаёт.....

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

Хорошо, а Вы уверены, что дело в измерении. Вставьте как после строки

 

distance_sm = impulseTime / 58;

вывод distance_sm в Serial. Ну, само собой, в setup добавьте Serial.begin. Правильно ли Вы дает там?

И заодно, печатайте текущий скетч, чтобы номера строк были, а то мы уже много меняли.

 

Otto
Offline
Зарегистрирован: 26.06.2016

ЕвгенийП пишет:

Хорошо, а Вы уверены, что дело в измерении. Вставьте как после строки

 

distance_sm = impulseTime / 58;

вывод distance_sm в Serial. Ну, само собой, в setup добавьте Serial.begin. Правильно ли Вы дает там?

И заодно, печатайте текущий скетч, чтобы номера строк были, а то мы уже много меняли.

 

Через Монитор порта, отлично показывает результат (проверял ещё до того как обнаружил косяк с отображением на дисплее), но заметил только сейчас то, что откуда то берётся третия цифра на дисплее, если значение меньше 3-х цифр. Что бы было понятнее, снял ещё одно видео: ВОТ.

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

Простите, Вы "проверял ещё до того" или сейчас тоже всё нормально? Если сейчас всё нормально, значит датчик у Вас вовсе не при делах - он нормально выдаёт. Проблема с показом на дисплее. Т.е. цифирь с датчика Вы получаете правильную, а показать толком не можете. Всё так? 

Отключайте датчик и отлаживайте показ чисел на дисплее. Как отладите, всё будет окей. 

Otto
Offline
Зарегистрирован: 26.06.2016

Корочи, изначально если поднести руку вплотную, то отображение верно, как только отодвигаем руку и расстояние становится в 2 знака (к примеру: 34), и пододвигаем заново, то второй знак просто не стирается на дисплее, а статически висит! Тоже самое когда становится 3 знака на LED и уменьшаем расстояние до 2 или 1 знака, то цифры слева тупо становятся статическими и не стираются. 

Otto
Offline
Зарегистрирован: 26.06.2016

У меня есть: Термодатчик MAX6675 через этот дисплей с этой библиотекой работает отлично, датчик холла через него тоже отлично выдаёт значения оборотов (Тахометр). А вот Дальномер ругается ЖУК. Косяк в библиотеки скорее всего.

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

Вы не поняли. Мы же с Вами печатали результат дальномера в сериал и тут же на Ваш экран и результаты получались разными. Т.е. одно и тоже число получалось разным! Ну, если Вы не можете правильно показать число на экране, то причём тут дальномер - он-то чем виноват? 

Otto
Offline
Зарегистрирован: 26.06.2016

Дальномер то тут не причём!)  Это Вы меня не так поняли. Вся загвоздка заключается в библиотеки от дисплея, они конфликтует с показаниями самого дальномера и на дисплее и в Мониторе порта. А без этой билиотеки нормально работает дальномер. Один раз каким то образом заработало вчера измерение и вывод на дисплей (с учётом того, что не стирались показания на дисплее, а висели статически и всё), потом опять стал неверно показывать.

Ну да ладно, наверное проще другой тип дисплея подключить для данного проекта)))

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Злой библиотекарь портит Вам показания?

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

Otto пишет:

Ну да ладно, наверное проще другой тип дисплея подключить для данного проекта)))

Да, ладно, куда как проще разобраться с библиотекой или другую взять.

olegtur77
Offline
Зарегистрирован: 09.04.2015

Проверьтье хорошенько под лупой монтаж сонара, мне попался бракованый, тоже такие танцы з бубном достались, просмотрел пайку, оказалось пару резисторов недопаяны. Пропаял и все заработало. Причем обычным осмотром ниче не было видно. Или хотяя бы в Serial monitore посмотрите сонар.

 

Otto
Offline
Зарегистрирован: 26.06.2016

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