Не работает Ultrasonic (HC-SR04) с Семисегментным индикатором (TM74HC595)
- Войдите на сайт для отправки комментариев
Втр, 14/03/2017 - 10:48
Здраствуйте. Такая проблема, есть Ультразвуковой дальномер "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); }
Ссылка на новую билиотеку
А без дальномера все нормально выводится?
А без дальномера все нормально выводится?
Да, нормально выводится инфа о температуре с датчика Термопары MAX6675 и Датчика Холла (Тахометр), а тут как только не пробовал, какая то несовместимость. Без библиотеки TM74HC595Display.h Дальномер тоже отлично работает.
Уберите дальномер с 10-го пина (строка 4). Пины 9 и 10 вообще не трогайте иначе Ваш дальномер за них с TimerOne подерётся.
Уберите дальномер с 10-го пина (строка 4). Пины 9 и 10 вообще не трогайте иначе Ваш дальномер за них с TimerOne подерётся.
На 12 и 13 пинах тоже самое.....
Через полчаса вернусь и посмотрю дальше. Но это (9 и 10 пины) по-любому так, не возвращайте обратно.
Так Otto, попробуйте перед pulseIn (строка 53) поставить
cli();
а после поставить
sei();
Если мне склероз не изменяет, то pulseIn не использует прерывания, а потому ему должно быть пофигу.
При этом может появиться мерцание экрана - не берите в голову, потом поборем.
Скажите, что получилось?
Мерцания появляются когда расстояние от дальномера до препятствия не менее 30 см, но толку нет от этого. Вот ссылка на короткое видео, как ведёт себя дальномер + LED. На кучу проводов не обращайте внимания, там ничего не задействовано программно и не мешает работе этой маленькой программы.
Нет, погодите. Давайте толком.
Простите, я там немного неправильно написал. Давайте внимательно. Вот эти строки
Заключите в cli/sei. Должно получиться вот так:
Сделайте это, запустите и помсотрите что показывает дальномер. Он должен работать нормально, как без экрана вовсе.
Сделайте и напишите, что получилось.
Тоже самое, бурду из кучи цифр выдаёт.....
Хорошо, а Вы уверены, что дело в измерении. Вставьте как после строки
distance_sm = impulseTime / 58;
вывод distance_sm в Serial. Ну, само собой, в setup добавьте Serial.begin. Правильно ли Вы дает там?
И заодно, печатайте текущий скетч, чтобы номера строк были, а то мы уже много меняли.
Хорошо, а Вы уверены, что дело в измерении. Вставьте как после строки
distance_sm = impulseTime / 58;
вывод distance_sm в Serial. Ну, само собой, в setup добавьте Serial.begin. Правильно ли Вы дает там?
И заодно, печатайте текущий скетч, чтобы номера строк были, а то мы уже много меняли.
Через Монитор порта, отлично показывает результат (проверял ещё до того как обнаружил косяк с отображением на дисплее), но заметил только сейчас то, что откуда то берётся третия цифра на дисплее, если значение меньше 3-х цифр. Что бы было понятнее, снял ещё одно видео: ВОТ.
Простите, Вы "проверял ещё до того" или сейчас тоже всё нормально? Если сейчас всё нормально, значит датчик у Вас вовсе не при делах - он нормально выдаёт. Проблема с показом на дисплее. Т.е. цифирь с датчика Вы получаете правильную, а показать толком не можете. Всё так?
Отключайте датчик и отлаживайте показ чисел на дисплее. Как отладите, всё будет окей.
Корочи, изначально если поднести руку вплотную, то отображение верно, как только отодвигаем руку и расстояние становится в 2 знака (к примеру: 34), и пододвигаем заново, то второй знак просто не стирается на дисплее, а статически висит! Тоже самое когда становится 3 знака на LED и уменьшаем расстояние до 2 или 1 знака, то цифры слева тупо становятся статическими и не стираются.
У меня есть: Термодатчик MAX6675 через этот дисплей с этой библиотекой работает отлично, датчик холла через него тоже отлично выдаёт значения оборотов (Тахометр). А вот Дальномер ругается ЖУК. Косяк в библиотеки скорее всего.
Вы не поняли. Мы же с Вами печатали результат дальномера в сериал и тут же на Ваш экран и результаты получались разными. Т.е. одно и тоже число получалось разным! Ну, если Вы не можете правильно показать число на экране, то причём тут дальномер - он-то чем виноват?
Дальномер то тут не причём!) Это Вы меня не так поняли. Вся загвоздка заключается в библиотеки от дисплея, они конфликтует с показаниями самого дальномера и на дисплее и в Мониторе порта. А без этой билиотеки нормально работает дальномер. Один раз каким то образом заработало вчера измерение и вывод на дисплей (с учётом того, что не стирались показания на дисплее, а висели статически и всё), потом опять стал неверно показывать.
Ну да ладно, наверное проще другой тип дисплея подключить для данного проекта)))
Злой библиотекарь портит Вам показания?
Ну да ладно, наверное проще другой тип дисплея подключить для данного проекта)))
Да, ладно, куда как проще разобраться с библиотекой или другую взять.
Проверьтье хорошенько под лупой монтаж сонара, мне попался бракованый, тоже такие танцы з бубном достались, просмотрел пайку, оказалось пару резисторов недопаяны. Пропаял и все заработало. Причем обычным осмотром ниче не было видно. Или хотяя бы в Serial monitore посмотрите сонар.
Не думаю, т.к. с другими датчиками показания отлично выводятся на все сегменты.