термогигрометр на 7-сегментном индикаторе

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Попробуй вот так:

void loop()
{
 for (int i=0; i<4; i++) {Indicate(i,i); Indicate(i,14);}// 14=все сегменты выключены
}

Попробуй TimeLight=10;

Вячеслав 151
Offline
Зарегистрирован: 25.03.2015

Почти то же самое



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); // пауза, чтобы сегменты "разгорелись"
  }

http://www.fayloobmennik.net/5837117     пароль 7

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Так дело не пойдет. Этот код нормально отображается?


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()
{
    for (int i=0; i<4; i++) Indicate(i,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); // пауза, чтобы сегменты "разгорелись"
  }

 

Вячеслав 151
Offline
Зарегистрирован: 25.03.2015

Да, 3210

Вячеслав 151
Offline
Зарегистрирован: 25.03.2015

Но стоит объявить датчик, все исчезает :(


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>

  // 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()
{
    for (int i=0; i<4; i++) Indicate(i,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); // пауза, чтобы сегменты "разгорелись"
  }

 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Датчик с индикатором на одних и тех же ногах висит что ли?

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

 

Вячеслав 151
Offline
Зарегистрирован: 25.03.2015

И ЧТО ПЕРЕИМЕНОВЫВАТЬ?

Вячеслав 151
Offline
Зарегистрирован: 25.03.2015

SHT1x sht1x(dataPin1, clockPin1);

shiftOut(dataPin, clockPin, MSBFIRST, SegDisplay); // Записываем информацию для первого регистра (Номер символа)

таким образом?

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Вот как-то так. Писал здесь, на компилируемость не проверял.

// Data and Сlock индикатора
#define latchPin 7     // Пин "защелки" первого регистра подключен к RCLK (SS, ST_CP) входу 
#define clockPin 6    // Пин "тактовый" подключен к SCLK (CLK, SH_CP) входу 74HC595
#define dataPin 5     // Пин "данных" подключен к QH (SDI, DS) входу 74HC595
#define TimeLight 5    // Время для разогрева сегментов

// Data and Сlock датчика  SHT1x повесили на пины 10 и 11
#define dataPin1  10 
#define clockPin1 11 

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}; //массив цифр, указывающий разряды
char pos[4]={14,14,14,14};//массив цифр для каждого индикатора
unsigned long time;
  
#include <SHT1x.h>
  
SHT1x sht1x(dataPin1, clockPin1);

void setup()
{ // обозначаем все пины как выходы
  pinMode(latchPin, OUTPUT); 
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin1, OUTPUT);
  pinMode(dataPin1, INPUT);
}

void loop()
{
 if (millis()-time>3000)
 {
  time = millis();
  temp = sht1x.readTemperatureC();
  pos[0]=12;
  pos[1]=13;
  pos[2]=temp%10;
  pos[3]=temp/10;
 }
 for (int i=0; i<4; i++) Indicate(i, pos[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); // пауза, чтобы сегменты "разгорелись"
  }

 

Вячеслав 151
Offline
Зарегистрирован: 25.03.2015

Нет не компилируется. Надо всю библиотеку переписывать SHT, а она у меня в других проектах работает.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Переменную int temp; забыл объявить.

Что еще не компиляется? Из чего следует, что всю библиотеку нужно переписывать?

Вячеслав 151
Offline
Зарегистрирован: 25.03.2015

В таком виде заработала, только первая цифра не гасится.

Подправил библиотеку SHT.  http://www.fayloobmennik.net/5838250  пароль7

Теперь надо влажность выводить :)

#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); // пауза, чтобы сегменты "разгорелись"
  }

       
       

 

Вячеслав 151
Offline
Зарегистрирован: 25.03.2015

Andy пишет:

Переменную int temp; забыл объявить.

Что еще не компиляется? Из чего следует, что всю библиотеку нужно переписывать?

Спасибо за помощь!

с меня термогигрометр : )

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Как-то так:

#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); // пауза, чтобы сегменты "разгорелись"
  }

Я подозреваю индикация несколько замирает во время чтения температуры/влажности, можно либо гасить индикатор перед чтением, либо надо переносить вывод в прерывание.

Вячеслав 151
Offline
Зарегистрирован: 25.03.2015

http://www.fayloobmennik.net/5838769   пароль 7

Зароботала. С косячком :)

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Добавь между строк 51 и 52: Indicate(3, 14);

Крайний левый разряд будет гаснуть на время чтения.

Вячеслав 151
Offline
Зарегистрирован: 25.03.2015

Да, так и есть. Теперь все как надо. Готов отблагодарить

Вячеслав 151
Offline
Зарегистрирован: 25.03.2015

Andy? ты здесь?

Вячеслав 151
Offline
Зарегистрирован: 25.03.2015

Термометр не хочет выводиться как надо. Первая цыфра горит, остальное все мигает

//Термометр на DS18B20 и семисегмнтном индикаторе
#define ONE_WIRE_BUS 10      // назначаем пин для шины OneWire и датчиков температуры
#define TIME_REFRESH 2000       // Задаем время обновления показаний

#include <OneWire.h>
#include <DallasTemperature.h>

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

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;
bool b = 0;

int temp_c = 0;     // Переменная для целых чисел температуры
int tempSensor1 = 0;// Переменная показаний температуры

void setup()
{
  Serial.begin(9600);
  // pin
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(8, OUTPUT);
  digitalWrite(8, HIGH);

  sensors.begin(); // Инициализация датчика
}
void loop()
{
  sensorTempRead();  // Опрос датчика температуры
  delay (TIME_REFRESH);
  if (millis() - time > 3000)
  {
    time = millis();
    Indicate(3, 14);
    if (b ^= 1)
    {
      temp_c = tempSensor1;
      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); // пауза, чтобы сегменты "разгорелись"
}

// Опрос датчиков температуры
void sensorTempRead()
{
  sensors.requestTemperatures(); // Отправка команды на опрос датчика
  tempSensor1 = sensors.getTempCByIndex(0);
}