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
}
}
for (int i=0; i<4; i++) {Indicate(i,i); Indicate(i,14);}// 14=все сегменты выключены
}
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); // пауза, чтобы сегменты "разгорелись"
}
Датчик с индикатором на одних и тех же ногах висит что ли?
SHT1x sht1x(dataPin, clockPin);
shiftOut(dataPin, clockPin, MSBFIRST, SegDisplay); // Записываем информацию для первого регистра (Номер символа)
Как вообще компилятор это проглотил?
int clockPin = 6; // Пин "тактовый" подключен к SCLK (CLK, SH_CP) входу 74HC595
int dataPin = 5; // Пин "данных" подключен к QH (SDI, DS) входу 74HC595
// Data and Сlock датчика SHT1x повесили на пины 10 и 11
#define dataPin 10
#define clockPin 11
#include "SHT1x.h"
//Термогигрометр на 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; // time для разогрева сегментов
byte SegDisplay; // Переменная для вывода символов на индикаторе
byte RazrDisplay; // Переменная для включения разрядов
// Настройка комбинации для отображения каждого номера на индикаторе
// Массив цифр, генерирующий на сегментах цифры в двоичной системе исчисления
byte g_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, }; // all segm.
byte g_registerArray[4]={1,2,4,8}; //массив цифр, указывающий разряды
char pos[4]={14,14,14,14};//массив цифр для каждого индикатора
unsigned long time;
#include <SHT1x.h>
// Data and Сlock датчика SHT1x
#define dataPin1 10
#define clockPin1 11
SHT1x sht1x(dataPin1, clockPin1);
int temp_c=0; // Переменная для целых чисел температуры
int humidity=0; // Переменная для целых чисел влажности
void setup()
{
Serial.begin(9600);
// pin
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop()
{
if (millis()-time>3000)
{
time = millis();
temp_c = sht1x.readTemperatureC();
Serial.print(temp_c);
pos[0]=13;
pos[1]=12;
pos[2]=temp_c%10;
pos[3]=temp_c/10;
}
for (int i=0; i<4; i++) Indicate(i, pos[i]);
}
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); // пауза, чтобы сегменты "разгорелись"
}
#include "SHT1x.h"
//Термогигрометр на 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; // time для разогрева сегментов
byte SegDisplay; // Переменная для вывода символов на индикаторе
byte RazrDisplay; // Переменная для включения разрядов
// Настройка комбинации для отображения каждого номера на индикаторе
// Массив цифр, генерирующий на сегментах цифры в двоичной системе исчисления
byte g_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, }; // all segm.
byte g_registerArray[4]={1,2,4,8}; //массив цифр, указывающий разряды
char pos[4]={14,14,14,14};//массив цифр для каждого индикатора
unsigned long time;
#include <SHT1x.h>
// Data and Сlock датчика SHT1x
#define dataPin1 10
#define clockPin1 11
SHT1x sht1x(dataPin1, clockPin1);
int temp_c=0; // Переменная для целых чисел температуры
int humidity=0; // Переменная для целых чисел влажности
bool b=0;
void setup()
{
Serial.begin(9600);
// pin
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop()
{
if (millis()-time>3000)
{
time = millis();
if (b^=1)
{
temp_c = sht1x.readTemperatureC();
Serial.print(temp_c);
pos[0]=13;
pos[1]=12;
pos[2]=temp_c%10;
pos[3]=temp_c/10;
}
else
{
humidity = sht1x.readHumidity();
Serial.print(humidity);
pos[0]=14;
pos[1]=humidity%10;
pos[2]=humidity/10;
pos[3]=14;
}
}
for (int i=0; i<4; i++) Indicate(i, pos[i]);
}
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); // пауза, чтобы сегменты "разгорелись"
}
Я подозреваю индикация несколько замирает во время чтения температуры/влажности, можно либо гасить индикатор перед чтением, либо надо переносить вывод в прерывание.
Попробуй вот так:
Попробуй TimeLight=10;
Почти то же самое
http://www.fayloobmennik.net/5837117 пароль 7
Так дело не пойдет. Этот код нормально отображается?
Да, 3210
Но стоит объявить датчик, все исчезает :(
Датчик с индикатором на одних и тех же ногах висит что ли?
SHT1x sht1x(dataPin, clockPin);
shiftOut(dataPin, clockPin, MSBFIRST, SegDisplay); // Записываем информацию для первого регистра (Номер символа)
Как вообще компилятор это проглотил?
И ЧТО ПЕРЕИМЕНОВЫВАТЬ?
SHT1x sht1x(dataPin1, clockPin1);
shiftOut(dataPin, clockPin, MSBFIRST, SegDisplay); // Записываем информацию для первого регистра (Номер символа)
таким образом?
Вот как-то так. Писал здесь, на компилируемость не проверял.
Нет не компилируется. Надо всю библиотеку переписывать SHT, а она у меня в других проектах работает.
Переменную int temp; забыл объявить.
Что еще не компиляется? Из чего следует, что всю библиотеку нужно переписывать?
В таком виде заработала, только первая цифра не гасится.
Подправил библиотеку SHT. http://www.fayloobmennik.net/5838250 пароль7
Теперь надо влажность выводить :)
Переменную int temp; забыл объявить.
Что еще не компиляется? Из чего следует, что всю библиотеку нужно переписывать?
Спасибо за помощь!
с меня термогигрометр : )
Как-то так:
Я подозреваю индикация несколько замирает во время чтения температуры/влажности, можно либо гасить индикатор перед чтением, либо надо переносить вывод в прерывание.
http://www.fayloobmennik.net/5838769 пароль 7
Зароботала. С косячком :)
Добавь между строк 51 и 52: Indicate(3, 14);
Крайний левый разряд будет гаснуть на время чтения.
Да, так и есть. Теперь все как надо. Готов отблагодарить
Andy? ты здесь?
Термометр не хочет выводиться как надо. Первая цыфра горит, остальное все мигает