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

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

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

 

Олег М.
Олег М. аватар
Offline
Зарегистрирован: 22.11.2015

Ты попробуй вывести сначала свои расчетные данные на Serial.println( " ... ").

Точность (Accuracy) измерения влажности +-2%, температуры +-0.5 С.
Поэтому все десятые и сотые доли (после запятой, разумеется) не несут никакого смысла и по-просту бесполезны.
Если только ты не преследуешь цель научиться их выводить.

Как то так.
 

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

Да, нужны только целочисленные данные

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

В сериал выводиться 0.00   и с делеем 3с

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Олег М. пишет:

Ты попробуй вывести сначала свои расчетные данные на Serial.println( " ... ").

Присоединяюсь.

А когда получится, попробуй вывести на индикатор что-нибудь (число 321, например).

А уж когда и это получится, тогда объединяй всё вместе.

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

запросил disp  выводит 0

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

Забыл данные считать с датчика. В сериал выводит данные на индикаторе нет

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

 

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

В сериал выводит нормально и температуру и влажность. А индикатор молчит. В простом термометре он работает, с другим скетчем

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вячеслав 151 пишет:

В сериал выводит нормально и температуру и влажность. А индикатор молчит. В простом термометре он работает, с другим скетчем

Ну, я же говорил, теперь выведи на индикатор что-нибудь (безо всякого датчика) просто числа в крохотном скетче. Как получится - объединяй всё вместе.

Вячеслав 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 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-ах ошибка

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вячеслав 151 пишет:

Вот этот скетч выводит

...

Наверно где то в if-ах ошибка

Вы по русски читать умеете? Я же написал, сделайте отдельный маленький скетч и научитесь выводить числа. И только потом беритесь за большой скетч. У Вас там 100500 строк и Вы сидите и гадаете где там чего. Сделайте маленький скетчик и отладьте его.

Впрочем, если Вы умеете сходу отлаживать большие программы - дело Ваше, мучайтесь дальше.

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

И я написал по русски - последний скетч выводит данные на индикатор. Но только контанту. А переменные не могу вывести

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вячеслав 151 пишет:

И я написал по русски - последний скетч выводит данные на индикатор. Но только контанту. А переменные не могу вывести

Блин, ну напишите скетч из трёх строк, который выводит переменную, а не константу. Причём переменную того же типа, что Вам надо. Отладьте эти три строки, добейтесьЮ чтобы работали, а потом уже возвращайтесь с большому скетчу.

Хотя, как я уже сказал - не хотите, дело Ваше.

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

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

  

 

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

Насколько я понимаю индикация динамическая...

Строки 56 и 64 очевидно останавливают индикацию. Все что ты видишь - в четвертом разряде прочерк или цифра. Так?

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

Да, горит 0

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

Пиши так:

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]);
}

Не сочти за программу, это всего лишь алгоритм.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вячеслав 151 пишет:

Вот из  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.

Отлаживайтесь сами, мне надоело умолять Вас о чём-то, как будто это мне надо, а не Вам.

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

Andy пишет:

Пиши так:

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

Вячеслав 151 пишет:
Оставил одну переменную.В сериале показывает с интервалом 3сек. А дисплей - Не идет

Обрати внимание, где у меня вызывается Indicate(), строка 26.

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

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

Да, уж, встрял . . .

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

Убери строку 43. А так, вроде должно работать...

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

Где то в выводе ошибка

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

Обрати внимание в строке 56 ты передаешь digits[i] как x, а в строке 61 снова берешь digits[x].

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

Да увидел вечером посмотрю

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

Изначально предполагалось два массива g_digits[25] - для перекодировки символов,

и digits[4] - для хранения символов для каждого индикатора,

но у тебя остался только один byte digits[15] - в этом и есть главная ошибка.

Объяви его как: const byte digits[15] и получи ошибки компиляции в строках 48-51

Вячеслав 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;     // Переменная для включения разрядов

// Настройка комбинации для отображения каждого номера на индикаторе
// Массив цифр, генерирующий на сегментах цифры в двоичной системе исчисления
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); // пауза, чтобы сегменты "разгорелись"
  }

Только сериал работает

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

digits[0]=12;  Это правильное присвоение градуса?

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

Меняем строку 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 лишняя запятая.

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

полная тишина

 

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

Так с 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
        }
     

    
    }
}

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 градуса и минус и градус и тд Но - константы

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

Значит такой цикл должен выводить 3210

void loop()
{
 for (int i=0; i<4; i++) Indicate(i,i);
}

 

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

Это к 27-му? ничего нет

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

В #32 только loop заменить, остальное как есть.

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

бегунок. Мигающая строка. :) куды видео скинуть?

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

Тоже собрал индикатор на 74HC595 два разряда. Прикручиваю к нему dht11. Но пока у меня другой вопрос Если я посылаю двузначное число то оно отображаеться верно. Код ниже показывает 78

digitalWrite (latchPin, LOW); shiftOut (dataPin, clockPin, MSBFIRST, number[7]); 

shiftOut (dataPin, clockPin, MSBFIRST, number[8]); 

digitalWrite (latchPin, HIGH); 

А если посылаю однозначное то оно заполняет оба разряда. А вот этот код показывает 77 а должен (по моему разумению) просто 7.

digitalWrite (latchPin, LOW); 

shiftOut (dataPin, clockPin, MSBFIRST, number[7]); 

digitalWrite (latchPin, HIGH); 

Почему так?

serega374
Offline
Зарегистрирован: 10.08.2015
Написал код вывода на индикатор 2 разряда, но проверить не могу плата дома. Смущает что он уж очень простой не то, что у автора топика.
#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);
  }

 

 

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

shiftOut  выводит сегмент и разряд.а у вас там переменные для вывода

serega374
Offline
Зарегистрирован: 10.08.2015

Вячеслав 151 пишет:
shiftOut  выводит сегмент и разряд.а у вас там переменные для вывода

shiftOut выводит один байт  информации. Я получаю двухзначное число с датчика. Разделаю его на два знака. Вывожу первую цифру, а следом вторую через мой массив данных. по крайне мере цифры я вчера на ура выводил на индикатор. Вечером проверю код. 

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

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

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

 

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

http://arduino.ru/forum/proekty/vyvod-informatsii-na-4-razryadnyi-7segme...

Здесь в 35-м посте твоя программа

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

Парни, это конечно не мое дело, но у одного из вас динамическая индикация, у другого статическая. Вы никогда не договоритесь.

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

Andy пишет:

В #32 только loop заменить, остальное как есть.

Видео посмотрел?

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

Только "Файл не найден" посмотрел...

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

Короче  переливающися индикатор

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

Что значит переливающийся? Подсвечиваются лишние сегменты?

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

Да

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