термогигрометр на 7-сегментном индикаторе
- Войдите на сайт для отправки комментариев
Пнд, 22/02/2016 - 09:30
Не могу высести данные на индикатор. Нужна подсказка.Индикатор на сдвиговых регистрах 595-х
//Термогигрометр на SHT и семисегмнтном индикаторе int latchPin = 7; // Пин "защелки" первого регистра подключен к RCLK (SS, ST_CP) входу int clockPin = 6; // Пин "тактовый" подключен к SCLK (CLK, SH_CP) входу 74HC595 int dataPin = 5; // Пин "данных" подключен к QH (SDI, DS) входу 74HC595 int TimeLight = 5; // Время для разогрева сегментов byte SegDisplay; // Переменная для вывода символов на индикаторе byte RazrDisplay; // Переменная для включения разрядов // Настройка комбинации для отображения каждого номера на индикаторе // Массив цифр, генерирующий на сегментах цифры в двоичной системе исчисления byte g_digits[25]={ B11000000, B11111001, B10100100, B10110000, B10011001, // 0 1 2 3 4 B10010010, B10000010, B11111000, B10000000, B10010000, // 5 6 7 8 9 B01000000, B01111001, B00100100, B00110000, B00011001, // 0. 1. 2. 3. 4. B00010010, B00000010, B01111000, B00000000, B00010000, // 5. 6. 7. 8. 9. B01111111, B10111111, B10011100, B11000110, // точка, прочерк, градус, цельсия B11111111, }; // все сегменты выключены byte g_registerArray[4]={1,2,4,8}; //массив цифр, указывающий разряды #include <SHT1x.h> // Data and Сlock датчика SHT1x повесили на пины 10 и 11 #define dataPin 10 #define clockPin 11 SHT1x sht1x(dataPin, clockPin); void setup() { // обозначаем все пины как выходы pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void loop() { float temp_c; float humidity; //float temperature = -20; // Можете подставить любые значения. Следите чтобы стояла именно . (например 5.75 а не 5,75) иначе - ошибка компаиляции вам обеспечена int disp; // Переменная для целых чисел температуры int disp_sot; // Переменная для дробной части числа disp = int (temp_c); // Избавляемся от десятых и сотых (оставляем целую часть числа) temp_c = (temp_c - disp) * 100; // Переводим десятые и сотые в целую часть числа disp_sot = int (abs(temp_c)); // Обрубаем значения после запятой (оставляем целую часть числа) модуль - для избавления от минуса //переменные для влажности int disp1; // Переменная для целых чисел влажности disp1 = int (humidity); //получаем целочисленное занчение // Разбиваем цифру по разрядам индикатора if (disp < 0) // Если значение минусовое, то выполняется следующее условие { disp = abs(disp); // используем модуль дабы избавиться от минуса. Его мы подставим в процессе /* Допустим наша цифра 25. Если мы ее поделим на 10, то у нас получится 2,5. Цифры после запятой, в данном случае, у нас не остаются. Таким образом мы имеем в третем разряде цифру 2. В чевертый разряд мы, как раз и записываем цифру-остаток полученную в результате деления. В нашем случае это и есть та самая 5. Аналогичным образом разбивается наша цифра и далее. */ if (disp < 10) // если наша цифра меньше 10, то { Indicate(0, 22); // пишем во второй разряд - символ градуса Indicate(1, disp_sot / 10); // пишем во второй разряд десятую долю цифры Indicate(2, disp + 10); // пишем в третий разряд нашу цифру с точкой Indicate(3, 21); // пишем в четвертый разряд минус delay(2000); } else if (disp < 100) // если наша цифра меньше 100, то { Indicate(0, 22); // пишем во второй разряд - символ градуса Indicate(1, (disp % 10)); // пишем во второй разряд - цифру оставшуюся от деления на 10 Indicate(2, disp / 10); // пишем в третий разряд - цифру делёную на 10 Indicate(3, 21); // пишем в четвертый разряд минус delay(2000); } } else if (disp == 0) // Значение температуры ровно 0 градусов { Indicate(0, 23); // пишем в первый разряд - символ цельсия "С" Indicate(1, 22); // пишем во второй разряд - символ градуса Indicate(2, disp); // пишем в третий разряд - цифру ноль Indicate(3, 24); // пишем в четвертый разряд пусто delay(2000); } else // Если значение положительное, то выполняется следующий цикл { if (disp < 10) // если наша цифра меньше 10, то { Indicate(0, 22); // пишем в первый разряд символ градуса Indicate(1, disp_sot % 10); // пишем во второй разряд сотую долю цифры Indicate(2, disp_sot / 10); // пишем в третий разряд десятую долю цифры Indicate(3, disp + 10); // пишем в четвертый разряд нашу цифру с точкой delay(2000); } else if (disp < 100) // если наша цифра меньше 100, то { Indicate(0, 23); // пишем в первый разряд - символ цельсия "С" Indicate(1, 22); // пишем во второй разряд - символ градуса Indicate(2, (disp % 10)); // пишем в третий разряд - цифру оставшуюся от деления на 10 Indicate(3, disp / 10); // пишем в четвертый разряд - цифру делёную на 10 delay(2000); } else if (disp < 1000) // если наша цифра меньше 1000, то { Indicate(0, 22); // пишем во второй разряд - символ градуса Indicate(1, (disp % 10)); // пишем во второй разряд - последнюю целую цифру Indicate(2, (disp % 100) / 10); // пишем в третий разряд - цифру оставшуюся от деления на 100 Indicate(3, (disp / 100)); // пишем в четвертый разряд - цифру делёную на 100 delay(2000); } } Indicate(0, 21); // пишем в первый разряд - прочерк Indicate(1,(disp1 % 10)+10); // пишем во второй разряд - цифру оставшуюся от деления на 10 с точкой Indicate(2, disp1 / 10); // пишем в третий разряд - цифру оставшуюся от деления на 10 Indicate(3, 21); // пишем в четвертый разряд - прочерк delay(2000); } void Indicate(int r,int x) // Функция собственно, отображения цыфр на индикаторе. { SegDisplay=g_digits[x]; // получаем цифру и выводим символ, из массива цифр, соответствующий этой цифре. RazrDisplay=g_registerArray[r]; // получаем цифру и выводим номер регистра, из массива цифр, соответствующий этой цифре. digitalWrite(latchPin, LOW); // устанавливаем синхронизацию "защелки" на LOW shiftOut(dataPin, clockPin, MSBFIRST, SegDisplay); // Записываем информацию для первого регистра (Номер символа) shiftOut(dataPin, clockPin, MSBFIRST, RazrDisplay); // Записываем информацию для второго регистра (Номер разряда) // shiftOut(dataPin, clockPin, MSBFIRST, SegDisplay); // Записываем информацию для первого регистра (Номер символа) digitalWrite(latchPin, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах delay(TimeLight); // пауза, чтобы сегменты "разгорелись" }
Ты попробуй вывести сначала свои расчетные данные на Serial.println( " ... ").
Точность (Accuracy) измерения влажности +-2%, температуры +-0.5 С.
Поэтому все десятые и сотые доли (после запятой, разумеется) не несут никакого смысла и по-просту бесполезны.
Если только ты не преследуешь цель научиться их выводить.
Как то так.
Индикатор такой http://ru.aliexpress.com/item/J34-Free-Shipping-4-Bits-Digital-Tube-LED-...
Да, нужны только целочисленные данные
В сериал выводиться 0.00 и с делеем 3с
Ты попробуй вывести сначала свои расчетные данные на Serial.println( " ... ").
Присоединяюсь.
А когда получится, попробуй вывести на индикатор что-нибудь (число 321, например).
А уж когда и это получится, тогда объединяй всё вместе.
запросил disp выводит 0
Забыл данные считать с датчика. В сериал выводит данные на индикаторе нет
В сериал выводит нормально и температуру и влажность. А индикатор молчит. В простом термометре он работает, с другим скетчем
В сериал выводит нормально и температуру и влажность. А индикатор молчит. В простом термометре он работает, с другим скетчем
Ну, я же говорил, теперь выведи на индикатор что-нибудь (безо всякого датчика) просто числа в крохотном скетче. Как получится - объединяй всё вместе.
Вот этот скетч выводит
Но выводит только цифру которую подставляю (-80)
Наверно где то в if-ах ошибка
Вот этот скетч выводит
...
Наверно где то в if-ах ошибка
Вы по русски читать умеете? Я же написал, сделайте отдельный маленький скетч и научитесь выводить числа. И только потом беритесь за большой скетч. У Вас там 100500 строк и Вы сидите и гадаете где там чего. Сделайте маленький скетчик и отладьте его.
Впрочем, если Вы умеете сходу отлаживать большие программы - дело Ваше, мучайтесь дальше.
И я написал по русски - последний скетч выводит данные на индикатор. Но только контанту. А переменные не могу вывести
И я написал по русски - последний скетч выводит данные на индикатор. Но только контанту. А переменные не могу вывести
Блин, ну напишите скетч из трёх строк, который выводит переменную, а не константу. Причём переменную того же типа, что Вам надо. Отладьте эти три строки, добейтесьЮ чтобы работали, а потом уже возвращайтесь с большому скетчу.
Хотя, как я уже сказал - не хотите, дело Ваше.
Вот из 4-х строк. В сериале все работает а на индикатор не могу.
Насколько я понимаю индикация динамическая...
Строки 56 и 64 очевидно останавливают индикацию. Все что ты видишь - в четвертом разряде прочерк или цифра. Так?
Да, горит 0
Пиши так:
Не сочти за программу, это всего лишь алгоритм.
Вот из 4-х строк. В сериале все работает а на индикатор не могу.
Я вижу здесь 79 строк, а не 4.
Отлаживайтесь сами, мне надоело умолять Вас о чём-то, как будто это мне надо, а не Вам.
Пиши так:
Не сочти за программу, это всего лишь алгоритм.
Оставил одну переменную.В сериале показывает с интервалом 3сек. А дисплей - Не идет
Обрати внимание, где у меня вызывается Indicate(), строка 26.
Это что за переменные? Под digits понимаю идет массив цифр?
digits[3]=прочерк;
digits[2]=hum/10;
digits[1]=hum%10;
digits[0]=прочерк;
Да, уж, встрял . . .
Убери строку 43. А так, вроде должно работать...
Не хочет выводить
Где то в выводе ошибка
Обрати внимание в строке 56 ты передаешь digits[i] как x, а в строке 61 снова берешь digits[x].
Да увидел вечером посмотрю
Изначально предполагалось два массива g_digits[25] - для перекодировки символов,
и digits[4] - для хранения символов для каждого индикатора,
но у тебя остался только один byte digits[15] - в этом и есть главная ошибка.
Объяви его как: const byte digits[15] и получи ошибки компиляции в строках 48-51
В таком виде?
Только сериал работает
digits[0]=12; Это правильное присвоение градуса?
Меняем строку 58
с: for (int i=0;i<4; i++) Indicate(i, digits[i]);
на: for (int i=0;i<4; i++) Indicate(i, i);
На индикаторе должно выводиться 0123, а этого скорее всего нет, возвращаемся к посту #10, если и он не работает - ищем проблемы в железе.
Кстати, в строке 16 лишняя запятая.
полная тишина
Так с 10-го начинал. Он только константу выводит, а переменную не хочет.
Вот этот показывает и 182 градуса и минус и градус и тд Но - константы
Значит такой цикл должен выводить 3210
Это к 27-му? ничего нет
В #32 только loop заменить, остальное как есть.
бегунок. Мигающая строка. :) куды видео скинуть?
http://www.fayloobmennik.net/5834018 пароль 7
Тоже собрал индикатор на 74HC595 два разряда. Прикручиваю к нему dht11. Но пока у меня другой вопрос Если я посылаю двузначное число то оно отображаеться верно. Код ниже показывает 78
А если посылаю однозначное то оно заполняет оба разряда. А вот этот код показывает 77 а должен (по моему разумению) просто 7.
Почему так?
shiftOut выводит сегмент и разряд.а у вас там переменные для вывода
shiftOut выводит один байт информации. Я получаю двухзначное число с датчика. Разделаю его на два знака. Вывожу первую цифру, а следом вторую через мой массив данных. по крайне мере цифры я вчера на ура выводил на индикатор. Вечером проверю код.
shiftOut(dataPin, clockPin, MSBFIRST, RazrDisplay);
// Записываеn информацию для второго регистра (Номер разряда)
84
shiftOut(dataPin, clockPin, MSBFIRST, SegDisplay);
// Записываеn информацию для первого регистра (Номер символа)
http://arduino.ru/forum/proekty/vyvod-informatsii-na-4-razryadnyi-7segme...
Здесь в 35-м посте твоя программа
Парни, это конечно не мое дело, но у одного из вас динамическая индикация, у другого статическая. Вы никогда не договоритесь.
В #32 только loop заменить, остальное как есть.
Видео посмотрел?
Только "Файл не найден" посмотрел...
Короче переливающися индикатор
Что значит переливающийся? Подсвечиваются лишние сегменты?
Да