термогигрометр на 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
Забыл данные считать с датчика. В сериал выводит данные на индикаторе нет
//Термогигрометр на 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() { // Serial.begin(9600); // обозначаем все пины как выходы pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void loop() { float temp_c; float humidity; temp_c = sht1x.readTemperatureC(); humidity = sht1x.readHumidity(); //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); //получаем целочисленное занчение // Serial.print(disp1); // Разбиваем цифру по разрядам индикатора 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); // пауза, чтобы сегменты "разгорелись" }В сериал выводит нормально и температуру и влажность. А индикатор молчит. В простом термометре он работает, с другим скетчем
В сериал выводит нормально и температуру и влажность. А индикатор молчит. В простом термометре он работает, с другим скетчем
Ну, я же говорил, теперь выведи на индикатор что-нибудь (безо всякого датчика) просто числа в крохотном скетче. Как получится - объединяй всё вместе.
Вот этот скетч выводит
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}; //массив цифр, указывающий разряды void setup() { // обозначаем все пины как выходы pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void loop() { float temperature = -80; // Можете подставить любые значения. Следите чтобы стояла именно . (например 5.75 а не 5,75) иначе - ошибка компаиляции вам обеспечена int disp; // Переменная для целых чисел температуры int disp_sot; // Переменная для дробной части числа disp = int (temperature); // Избавляемся от десятых и сотых (оставляем челую часть числа) temperature = (temperature - disp) * 100; // Переводим десятые и сотые в целую часть числа disp_sot = int (abs(temperature)); // Обрубаем значения после запятой (оставляем целую часть числа) модуль - для избавления от минуса // Разбиваем цифру по разрядам индикатора if (disp < 0) // Если значение минусовое, то выполняется следующее условие { disp = abs(disp); // используем модуль дабы избавиться от минуса. Его мы подставим в процессе /* Допустим наша цифра 25. Если мы ее поделим на 10, то у нас получится 2,5. Цифры после запятой, в данном случае, у нас не остаются. Таким образом мы имеем в третем разряде цифру 2. В чевертый разряд мы, как раз и записываем цифру-остаток полученную в результате деления. В нашем случае это и есть та самая 5. Аналогичным образом разбивается наша цифра и далее. */ if (disp < 10) // если наша цифра меньше 10, то { Indicate(0, disp_sot % 10); // пишем в первый разряд сотую долю цифры Indicate(1, disp_sot / 10); // пишем во второй разряд десятую долю цифры Indicate(2, disp + 10); // пишем в третий разряд нашу цифру с точкой Indicate(3, 21); // пишем в четвертый разряд минус } else if (disp < 100) // если наша цифра меньше 100, то { Indicate(0, disp_sot / 10); // пишем в первый разряд десятую долю цифры Indicate(1, (disp % 10) + 10); // пишем во второй разряд - цифру оставшуюся от деления на 10 с точкой Indicate(2, disp / 10); // пишем в третий разряд - цифру делёную на 10 Indicate(3, 21); // пишем в четвертый разряд минус } else { Indicate(0, 21); // Думаю что температура ниже 99 градусов Indicate(1, 21); // вряд ли возможна, поэтому Indicate(2, 21); // выводим прочерки во всех регистрах Indicate(3, 21); } } else if (disp == 0) // Значение температуры ровно 0 градусов { Indicate(0, 23); // пишем в первый разряд - символ цельсия "С" Indicate(1, 22); // пишем во второй разряд - символ градуса Indicate(2, disp); // пишем в третий разряд - цифру ноль Indicate(3, 24); // пишем в четвертый разряд пусто } else // Если значение положительное, то выполняется следующий цикл { if (disp < 10) // если наша цифра меньше 10, то { Indicate(0, 22); // пишем в первый разряд символ градуса Indicate(1, disp_sot % 10); // пишем во второй разряд сотую долю цифры Indicate(2, disp_sot / 10); // пишем в третий разряд десятую долю цифры Indicate(3, disp + 10); // пишем в четвертый разряд нашу цифру с точкой } else if (disp < 100) // если наша цифра меньше 100, то { Indicate(0,22); // пишем в первый разряд символ градуса Indicate(1, (disp % 10)); // пишем во второй разряд -цифру оставшуюся от деления на 10 с точкой Indicate(2, disp / 10); // пишем в третий разряд - цифру оставшуюся от деления на 10 с точкой Indicate(3, 24); // пишем в четвертый разряд пусто } else if (disp < 1000) // если наша цифра меньше 1000, то { Indicate(0, 22); // пишем в первый разряд символ градуса Indicate(1, disp % 10); // пишем во второй разряд - последнюю целую цифру Indicate(2, (disp % 100) / 10); // пишем в третий разряд - цифру оставшуюся от деления на 100 Indicate(3, (disp / 100)); // пишем в четвертый разряд - цифру делёную на 100 } } } 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); // Записываем информацию для второго регистра (Номер разряда) digitalWrite(latchPin, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах delay(TimeLight); // пауза, чтобы сегменты "разгорелись" }Но выводит только цифру которую подставляю (-80)
Наверно где то в if-ах ошибка
Вот этот скетч выводит
...
Наверно где то в if-ах ошибка
Вы по русски читать умеете? Я же написал, сделайте отдельный маленький скетч и научитесь выводить числа. И только потом беритесь за большой скетч. У Вас там 100500 строк и Вы сидите и гадаете где там чего. Сделайте маленький скетчик и отладьте его.
Впрочем, если Вы умеете сходу отлаживать большие программы - дело Ваше, мучайтесь дальше.
И я написал по русски - последний скетч выводит данные на индикатор. Но только контанту. А переменные не могу вывести
И я написал по русски - последний скетч выводит данные на индикатор. Но только контанту. А переменные не могу вывести
Блин, ну напишите скетч из трёх строк, который выводит переменную, а не константу. Причём переменную того же типа, что Вам надо. Отладьте эти три строки, добейтесьЮ чтобы работали, а потом уже возвращайтесь с большому скетчу.
Хотя, как я уже сказал - не хотите, дело Ваше.
Вот из 4-х строк. В сериале все работает а на индикатор не могу.
//Термогигрометр на 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() { Serial.begin(9600); // обозначаем все пины как выходы pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void loop() { int temp_c; int humidity; temp_c = sht1x.readTemperatureC(); humidity = sht1x.readHumidity(); Serial.print(temp_c); Serial.print(humidity); Indicate(0, 21); // пишем в первый разряд - прочерк Indicate(1,(humidity % 10)+10); // пишем во второй разряд - цифру оставшуюся от деления на 10 с точкой Indicate(2, humidity / 10); // пишем в третий разряд - цифру оставшуюся от деления на 10 Indicate(3, 21); // пишем в четвертый разряд - прочерк delay(2000); Indicate(0, 23); // пишем в первый разряд - символ цельсия "С" Indicate(1, 22); // пишем во второй разряд - символ градуса Indicate(2, (temp_c % 10)); // пишем в третий разряд - цифру оставшуюся от деления на 10 Indicate(3, temp_c / 10); // пишем в четвертый разряд - цифру делёную на 10 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); // пауза, чтобы сегменты "разгорелись" }Насколько я понимаю индикация динамическая...
Строки 56 и 64 очевидно останавливают индикацию. Все что ты видишь - в четвертом разряде прочерк или цифра. Так?
Да, горит 0
Пиши так:
char digits[3];//это массив цифр, которые будут отображаться на индикаторе unsigned long time; bool температура=true; void loop() { if (millis()-time>30000)//раз в 30 сек читаем то температуру, то влажность { time=millis(); if (температура^=true)//если температура { readTemperature(); digits[3]=temp/10; digits[2]=temp%10; digits[1]=знак_градуса; digits[0]=знак_цельсия; } else//иначе влажность { readHumidity(); digits[3]=прочерк; digits[2]=hum/10; digits[1]=hum%10; digits[0]=прочерк; } } for (i=0;i<4; i++) Indicate(i, digits[i]); }Не сочти за программу, это всего лишь алгоритм.
Вот из 4-х строк. В сериале все работает а на индикатор не могу.
//Термогигрометр на 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() { Serial.begin(9600); // обозначаем все пины как выходы pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void loop() { int temp_c; int humidity; temp_c = sht1x.readTemperatureC(); humidity = sht1x.readHumidity(); Serial.print(temp_c); Serial.print(humidity); Indicate(0, 21); // пишем в первый разряд - прочерк Indicate(1,(humidity % 10)+10); // пишем во второй разряд - цифру оставшуюся от деления на 10 с точкой Indicate(2, humidity / 10); // пишем в третий разряд - цифру оставшуюся от деления на 10 Indicate(3, 21); // пишем в четвертый разряд - прочерк delay(2000); Indicate(0, 23); // пишем в первый разряд - символ цельсия "С" Indicate(1, 22); // пишем во второй разряд - символ градуса Indicate(2, (temp_c % 10)); // пишем в третий разряд - цифру оставшуюся от деления на 10 Indicate(3, temp_c / 10); // пишем в четвертый разряд - цифру делёную на 10 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); // пауза, чтобы сегменты "разгорелись" }Я вижу здесь 79 строк, а не 4.
Отлаживайтесь сами, мне надоело умолять Вас о чём-то, как будто это мне надо, а не Вам.
Пиши так:
char digits[3];//это массив цифр, которые будут отображаться на индикаторе unsigned long time; bool температура=true; void loop() { if (millis()-time>30000)//раз в 30 сек читаем то температуру, то влажность { time=millis(); if (температура^=true)//если температура { readTemperature(); digits[3]=temp/10; digits[2]=temp%10; digits[1]=знак_градуса; digits[0]=знак_цельсия; } else//иначе влажность { readHumidity(); digits[3]=прочерк; digits[2]=hum/10; digits[1]=hum%10; digits[0]=прочерк; } } for (i=0;i<4; i++) Indicate(i, digits[i]); }Не сочти за программу, это всего лишь алгоритм.
Оставил одну переменную.В сериале показывает с интервалом 3сек. А дисплей - Не идет
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 digits[15]={ B11000000, B11111001, B10100100, B10110000, B10011001, // 0 1 2 3 4 B10010010, B10000010, B11111000, B10000000, B10010000, // 5 6 7 8 9 B01111111, B10111111, B10011100, B11000110, // точка, прочерк, градус, цельсия B11111111, }; // все сегменты выключены byte registerArray[4]={1,2,4,8}; //массив цифр, указывающий разряды #include <SHT1x.h> #define dataPin 10 #define clockPin 11 SHT1x sht1x(dataPin, clockPin); unsigned long time; bool temper=true; void setup() { //Serial.begin(9600); // обозначаем все пины как выходы pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void loop() { int temper; if (millis()-time>3000)//раз в 3 сек читаем то температуру { time=millis(); if (temper =true) { temper = sht1x.readTemperatureC(); Indicate(0, 13); // пишем в первый разряд - символ цельсия "С" Indicate(1, 12); // пишем во второй разряд - символ градуса Indicate(2, (temper % 10)); // пишем в третий разряд - цифру оставшуюся от деления на 10 Indicate(3, temper / 10); // пишем в четвертый разряд - цифру делёную на 10 } } } void Indicate(int r,int x) // Функция собственно, отображения цыфр на индикаторе. { SegDisplay=digits[x]; // получаем цифру и выводим символ, из массива цифр, соответствующий этой цифре. RazrDisplay=registerArray[r]; // получаем цифру и выводим номер регистра, из массива цифр, соответствующий этой цифре. digitalWrite(latchPin, LOW); // устанавливаем синхронизацию "защелки" на LOW shiftOut(dataPin, clockPin, MSBFIRST, SegDisplay); // Записываем информацию для первого регистра (Номер символа) shiftOut(dataPin, clockPin, MSBFIRST, RazrDisplay); // Записываем информацию для второго регистра (Номер разряда) digitalWrite(latchPin, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах delay(TimeLight); // пауза, чтобы сегменты "разгорелись" }Обрати внимание, где у меня вызывается Indicate(), строка 26.
Это что за переменные? Под digits понимаю идет массив цифр?
digits[3]=прочерк;
digits[2]=hum/10;
digits[1]=hum%10;
digits[0]=прочерк;
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 digits[15]={ B11000000, B11111001, B10100100, B10110000, B10011001, // 0 1 2 3 4 B10010010, B10000010, B11111000, B10000000, B10010000, // 5 6 7 8 9 B01111111, B10111111, B10011100, B11000110, // точка, прочерк, градус, цельсия B11111111, }; // все сегменты выключены byte registerArray[4]={1,2,4,8}; //массив цифр, указывающий разряды #include <SHT1x.h> #define dataPin 10 #define clockPin 11 SHT1x sht1x(dataPin, clockPin); unsigned long time; bool temper=true; void setup() { Serial.begin(9600); // обозначаем все пины как выходы pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void loop() { int temper; if (millis()-time>3000)//раз в 3 сек читаем то температуру { time=millis(); if (temper =true) { temper = sht1x.readTemperatureC(); digits[3]=temper/10; digits[2]=temper%10; digits[1]=13; digits[0]=12; } } for (int i=0;i<4; i++) Indicate(i, digits[i]); } void Indicate(int r,int x) // Функция собственно, отображения цыфр на индикаторе. { SegDisplay=digits[x]; // получаем цифру и выводим символ, из массива цифр, соответствующий этой цифре. RazrDisplay=registerArray[r]; // получаем цифру и выводим номер регистра, из массива цифр, соответствующий этой цифре. digitalWrite(latchPin, LOW); // устанавливаем синхронизацию "защелки" на LOW shiftOut(dataPin, clockPin, MSBFIRST, SegDisplay); // Записываем информацию для первого регистра (Номер символа) shiftOut(dataPin, clockPin, MSBFIRST, RazrDisplay); // Записываем информацию для второго регистра (Номер разряда) digitalWrite(latchPin, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах delay(TimeLight); // пауза, чтобы сегменты "разгорелись" }Да, уж, встрял . . .
Убери строку 43. А так, вроде должно работать...
Не хочет выводить
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 digits[15]={ B11000000, B11111001, B10100100, B10110000, B10011001, // 0 1 2 3 4 B10010010, B10000010, B11111000, B10000000, B10010000, // 5 6 7 8 9 B01111111, B10111111, B10011100, B11000110, // точка, прочерк, градус, цельсия B11111111, }; // все сегменты выключены byte registerArray[4]={1,2,4,8}; //массив цифр, указывающий разряды #include <SHT1x.h> #define dataPin 10 #define clockPin 11 SHT1x sht1x(dataPin, clockPin); unsigned long time; bool temper=true; void setup() { Serial.begin(9600); // обозначаем все пины как выходы pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void loop() { int temper; if (millis()-time>3000)//раз в 3 сек читаем то температуру { time=millis(); temper = sht1x.readTemperatureC(); Serial.print (temper); digits[3]=temper/10; digits[2]=temper%10; digits[1]=13; digits[0]=12; } for (int i=0;i<4; i++) Indicate(i, digits[i]); } void Indicate(int r,int x) // Функция собственно, отображения цыфр на индикаторе. { SegDisplay=digits[x]; // получаем цифру и выводим символ, из массива цифр, соответствующий этой цифре. RazrDisplay=registerArray[r]; // получаем цифру и выводим номер регистра, из массива цифр, соответствующий этой цифре. digitalWrite(latchPin, LOW); // устанавливаем синхронизацию "защелки" на LOW shiftOut(dataPin, clockPin, MSBFIRST, SegDisplay); // Записываем информацию для первого регистра (Номер символа) shiftOut(dataPin, clockPin, MSBFIRST, RazrDisplay); // Записываем информацию для второго регистра (Номер разряда) digitalWrite(latchPin, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах delay(TimeLight); // пауза, чтобы сегменты "разгорелись" }Где то в выводе ошибка
Обрати внимание в строке 56 ты передаешь digits[i] как x, а в строке 61 снова берешь digits[x].
Да увидел вечером посмотрю
Изначально предполагалось два массива g_digits[25] - для перекодировки символов,
и digits[4] - для хранения символов для каждого индикатора,
но у тебя остался только один byte digits[15] - в этом и есть главная ошибка.
Объяви его как: const byte digits[15] и получи ошибки компиляции в строках 48-51
В таком виде?
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; // Переменная для включения разрядов // Настройка комбинации для отображения каждого номера на индикаторе // Массив цифр, генерирующий на сегментах цифры в двоичной системе исчисления const byte Gdigits[15]={ B11000000, B11111001, B10100100, B10110000, B10011001, // 0 1 2 3 4 B10010010, B10000010, B11111000, B10000000, B10010000, // 5 6 7 8 9 B01111111, B10111111, B10011100, B11000110, // точка, прочерк, градус, цельсия B11111111, }; // все сегменты выключены byte registerArray[4]={1,2,4,8}; //массив цифр, указывающий разряды #include <SHT1x.h> #define dataPin 10 #define clockPin 11 SHT1x sht1x(dataPin, clockPin); char digits[4];//это массив цифр, которые будут отображаться на индикаторе unsigned long time; bool temper=true; void setup() { Serial.begin(9600); // обозначаем все пины как выходы pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void loop() { int temper; if (millis()-time>3000)//раз в 3 сек читаем то температуру { time=millis(); temper = sht1x.readTemperatureC(); Serial.print (temper); digits[3]=temper/10; digits[2]=temper%10; digits[1]=13; digits[0]=12; } for (int i=0;i<4; i++) Indicate(i, digits[i]); } void Indicate(int r,int x) // Функция собственно, отображения цыфр на индикаторе. { SegDisplay=Gdigits[x]; // получаем цифру и выводим символ, из массива цифр, соответствующий этой цифре. RazrDisplay=registerArray[r]; // получаем цифру и выводим номер регистра, из массива цифр, соответствующий этой цифре. digitalWrite(latchPin, LOW); // устанавливаем синхронизацию "защелки" на LOW shiftOut(dataPin, clockPin, MSBFIRST, SegDisplay); // Записываем информацию для первого регистра (Номер символа) shiftOut(dataPin, clockPin, MSBFIRST, RazrDisplay); // Записываем информацию для второго регистра (Номер разряда) digitalWrite(latchPin, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах delay(TimeLight); // пауза, чтобы сегменты "разгорелись" }Только сериал работает
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-го начинал. Он только константу выводит, а переменную не хочет.
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 digits[15]={ B11000000, B11111001, B10100100, B10110000, B10011001, // 0 1 2 3 4 B10010010, B10000010, B11111000, B10000000, B10010000, // 5 6 7 8 9 B01111111, B10111111, B10011100, B11000110, // точка, прочерк, градус, цельсия B11111111, }; // все сегменты выключены byte registerArray[4]={1,2,4,8}; //массив цифр, указывающий разряды void setup() { // обозначаем все пины как выходы pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void loop() { float temperature = 182; // Можете подставить любые значения. Следите чтобы стояла именно . (например 5.75 а не 5,75) иначе - ошибка компаиляции вам обеспечена int disp; // Переменная для целых чисел температуры int disp_sot; // Переменная для дробной части числа disp = int (temperature); // Избавляемся от десятых и сотых (оставляем челую часть числа) temperature = (temperature - disp) * 100; // Переводим десятые и сотые в целую часть числа disp_sot = int (abs(temperature)); // Обрубаем значения после запятой (оставляем целую часть числа) модуль - для избавления от минуса // Разбиваем цифру по разрядам индикатора if (disp < 0) // Если значение минусовое, то выполняется следующее условие { disp = abs(disp); // используем модуль дабы избавиться от минуса. Его мы подставим в процессе /* Допустим наша цифра 25. Если мы ее поделим на 10, то у нас получится 2,5. Цифры после запятой, в данном случае, у нас не остаются. Таким образом мы имеем в третем разряде цифру 2. В чевертый разряд мы, как раз и записываем цифру-остаток полученную в результате деления. В нашем случае это и есть та самая 5. Аналогичным образом разбивается наша цифра и далее. */ if (disp < 10) // если наша цифра меньше 10, то { Indicate(0, disp_sot % 10); // пишем в первый разряд сотую долю цифры Indicate(1, disp_sot / 10); // пишем во второй разряд десятую долю цифры Indicate(2, disp + 10); // пишем в третий разряд нашу цифру с точкой Indicate(3, 21); // пишем в четвертый разряд минус } else if (disp < 100) // если наша цифра меньше 100, то { Indicate(0, disp_sot / 10); // пишем в первый разряд десятую долю цифры Indicate(1, (disp % 10) + 10); // пишем во второй разряд - цифру оставшуюся от деления на 10 с точкой Indicate(2, disp / 10); // пишем в третий разряд - цифру делёную на 10 Indicate(3, 21); // пишем в четвертый разряд минус } else { Indicate(0, 21); // Думаю что температура ниже 99 градусов Indicate(1, 21); // вряд ли возможна, поэтому Indicate(2, 21); // выводим прочерки во всех регистрах Indicate(3, 21); } } else if (disp == 0) // Значение температуры ровно 0 градусов { Indicate(0, 23); // пишем в первый разряд - символ цельсия "С" Indicate(1, 22); // пишем во второй разряд - символ градуса Indicate(2, disp); // пишем в третий разряд - цифру ноль Indicate(3, 24); // пишем в четвертый разряд пусто } else // Если значение положительное, то выполняется следующий цикл { if (disp < 10) // если наша цифра меньше 10, то { Indicate(0, 22); // пишем в первый разряд символ градуса Indicate(1, disp_sot % 10); // пишем во второй разряд сотую долю цифры Indicate(2, disp_sot / 10); // пишем в третий разряд десятую долю цифры Indicate(3, disp + 10); // пишем в четвертый разряд нашу цифру с точкой } else if (disp < 100) // если наша цифра меньше 100, то { Indicate(0,13); // пишем в первый разряд символ градуса Indicate(1,12); // пишем во второй разряд -цифру оставшуюся от деления на 10 с точкой Indicate(2, (disp % 10)); // пишем в третий разряд - цифру оставшуюся от деления на 10 с точкой Indicate(3, disp / 10); // пишем в четвертый разряд пусто } else if (disp < 1000) // если наша цифра меньше 1000, то { Indicate(0, 12); // пишем в первый разряд символ градуса Indicate(1, disp % 10); // пишем во второй разряд - последнюю целую цифру Indicate(2, (disp % 100) / 10); // пишем в третий разряд - цифру оставшуюся от деления на 100 Indicate(3, (disp / 100)); // пишем в четвертый разряд - цифру делёную на 100 } } } void Indicate(int r,int x) // Функция собственно, отображения цыфр на индикаторе. { SegDisplay=digits[x]; // получаем цифру и выводим символ, из массива цифр, соответствующий этой цифре. RazrDisplay=registerArray[r]; // получаем цифру и выводим номер регистра, из массива цифр, соответствующий этой цифре. digitalWrite(latchPin, LOW); // устанавливаем синхронизацию "защелки" на LOW shiftOut(dataPin, clockPin, MSBFIRST, SegDisplay); // Записываем информацию для первого регистра (Номер символа) shiftOut(dataPin, clockPin, MSBFIRST, RazrDisplay); // Записываем информацию для второго регистра (Номер разряда) digitalWrite(latchPin, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах delay(TimeLight); // пауза, чтобы сегменты "разгорелись" }Вот этот показывает и 182 градуса и минус и градус и тд Но - константы
Значит такой цикл должен выводить 3210
void loop() { for (int i=0; i<4; i++) Indicate(i,i); }Это к 27-му? ничего нет
В #32 только loop заменить, остальное как есть.
бегунок. Мигающая строка. :) куды видео скинуть?
http://www.fayloobmennik.net/5834018 пароль 7
Тоже собрал индикатор на 74HC595 два разряда. Прикручиваю к нему dht11. Но пока у меня другой вопрос Если я посылаю двузначное число то оно отображаеться верно. Код ниже показывает 78
А если посылаю однозначное то оно заполняет оба разряда. А вот этот код показывает 77 а должен (по моему разумению) просто 7.
Почему так?
#include <dht11.h> dht11 DHT; // Объявление переменной класса dht11 #define DHT11_PIN 3 // Датчик DHT11 подключен к цифровому пину номер 3 int latchPin = 12; //Пин подключен к ST_CP входу 74HC595 int clockPin = 13; //Пин подключен к SH_CP входу 74HC595 int dataPin = 8; //Пин подключен к DS входу 74HC595 int temper; //переменная для хранения значения температуры int hum; //переменная для хранения значения влажности byte number[]={0b00111111,0b00000110,0b01011011,0b01001111,0b01100110, 0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111}; // массив для вывода на индикатор void setup() { pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void IND_temp(int x, int y) { temper=DHT.temperature; x = temper/10; // получаем цифру первого разряда y = temper-(temper/10)*10; // получаем цифру второго разряда digitalWrite (latchPin, LOW); shiftOut (dataPin, clockPin, MSBFIRST, number[x]); shiftOut (dataPin, clockPin, MSBFIRST, number[y]); digitalWrite (latchPin, HIGH); } void IND_hum(int x, int y) { hum=DHT.humidity; x = hum/10; // получаем цифру первого разряда y = hum-(hum/10)*10; // получаем цифру второго разряда digitalWrite (latchPin, LOW); shiftOut (dataPin, clockPin, MSBFIRST, number[x]); shiftOut (dataPin, clockPin, MSBFIRST, number[y]); digitalWrite (latchPin, HIGH); } void loop() { void IND_temp(int x, int y) ; delay (1000); void IND_hum(int x, int y) ; delay (1000); }shiftOut выводит сегмент и разряд.а у вас там переменные для выводаshiftOut выводит один байт информации. Я получаю двухзначное число с датчика. Разделаю его на два знака. Вывожу первую цифру, а следом вторую через мой массив данных. по крайне мере цифры я вчера на ура выводил на индикатор. Вечером проверю код.
shiftOut(dataPin, clockPin, MSBFIRST, RazrDisplay);// Записываеn информацию для второго регистра (Номер разряда)84shiftOut(dataPin, clockPin, MSBFIRST, SegDisplay);// Записываеn информацию для первого регистра (Номер символа)http://arduino.ru/forum/proekty/vyvod-informatsii-na-4-razryadnyi-7segme...
Здесь в 35-м посте твоя программа
Парни, это конечно не мое дело, но у одного из вас динамическая индикация, у другого статическая. Вы никогда не договоритесь.
В #32 только loop заменить, остальное как есть.
Видео посмотрел?
Только "Файл не найден" посмотрел...
Короче переливающися индикатор
Что значит переливающийся? Подсвечиваются лишние сегменты?
Да