Упрощение кода

Glyuk1
Offline
Зарегистрирован: 30.04.2016

Есть код терморегулятора, вывод на семисегментный индикатор взял отсюда:
http://arduino.ru/forum/proekty/vyvod-informatsii-na-4-razryadnyi-7segmentnyi-indikator-pri-pomoshchi-dvukh-74hc595

На семисегмент выводится заданная температура, при нагреве горит один светодиод, при охлождении другой, температура измеряется термистором.

Если  Temp < POT_NUMBER, то включается реле нагрузки, при этом цифры на семисегменте начинают тусклее гореть, да и дёргаться всё начинает немного, в чём может быть проблема?

#include "math.h"
#define DATA_PIN    13                 // пин данных (англ. data)
#define LATCH_PIN   12                 // пин строба(защёлки) (англ. latch)
#define CLOCK_PIN   11                 // пин такта (англ. clock)
byte SegDisplay;                       // переменная для вывода символов на индикаторе
byte RazrDisplay;                      // переменная для включения разрядов
byte razryad[3]={127,191,223};         // массив цифр, указывающий разряды
byte segments[12]= {                   // массив цифр, генерирующий из сегментов цифры
  252, 96, 218, 242,                   // 0, 1, 2, 3
  102, 182, 190, 224,                  // 4, 5, 6, 7
  254, 246, 2, 0 };                    // 8, 9, -, .
int POT_PIN = A0;                      // потенциометр, задатчик температуры 
int TR_PIN = A1;                       // термистор
int RELE_PIN = 2;                      // нагрузка
int LEDN_PIN = 3;                      // индикатор нагрева    
int LEDO_PIN = 4;                      // индикатор охлаждения

void setup(){
  pinMode(DATA_PIN, OUTPUT);           // DATA_PIN выход
  pinMode(CLOCK_PIN, OUTPUT);          // CLOCK_PIN выход 
  pinMode(LATCH_PIN, OUTPUT);          // LATCH_PIN выход     
  pinMode(RELE_PIN, OUTPUT);           // RELE_PIN выход     
  pinMode(LEDN_PIN, OUTPUT);           // LEDN_PIN выход       
  pinMode(LEDO_PIN, OUTPUT);           // LEDo_PIN выход      
  Serial.begin(9600);                  
}
 
void loop(){  
  
  
  int POT = analogRead(POT_PIN);
  int POT_NUMBER = map(POT, 0, 1023, 0, 120); 
  int TR = analogRead(TR_PIN);
  long Resistance;
  double Temp;
  Resistance=((10240000/TR) - 10000);
  Temp = log(Resistance);
  Temp = 1 / (0.001129148 + (0.000234125 * Temp) + (0.0000000876741 * Temp * Temp * Temp));
  Temp = Temp - 273.15;  // Convert Kelvin to Celsius
  Serial.println(Temp);

  
  if (Temp < POT_NUMBER)
  {
    digitalWrite(RELE_PIN, HIGH);
    digitalWrite(LEDN_PIN, HIGH);
    digitalWrite(LEDO_PIN, LOW);
  }
  else
  { 
    digitalWrite(RELE_PIN, LOW);
    digitalWrite(LEDN_PIN, LOW);
    digitalWrite(LEDO_PIN, HIGH);
  }

  int number = 0;                     // создаем переменную для вывода на экран
      number = POT_NUMBER;            

                     
                                      // Разбиваем цифру по разрядам индикатора
  if (number < 10){                   // если наша цифра меньше 10, то
    Indicate(0, 11);                  // пишем в первый разряд пусто
    Indicate(1, 11);                  // пишем во второй разряд пусто
    Indicate(2, number);              // пишем в третий разряд цифру
  }
  else if (number < 100){             // если наша цифра меньше 100, то
    Indicate(0, 11);                  // пишем в первый разряд пусто
    Indicate(1, number / 10);         // пишем во второй разряд - цифру делёную на 10
    Indicate(2, number % 10);         // пишем в третий разряд - цифру цифру оставшуюся от деления на 10
  }
  else {                              // если наша цифра меньше 1000, то
    Indicate(0, number / 100);        // пишем в первый разряд - цифру делёную на 100
    Indicate(1, (number % 100) / 10); // пишем во второй разряд - цифру цифру оставшуюся от деления на 100 делённую на 10   
    Indicate(2, number % 10);         // пишем в третий разряд - цифру цифру оставшуюся от деления на 10
  }
}

void Indicate(int r,int x){
SegDisplay=segments[x];                                     // получаем цифру и выводим символ, из массива цифр, соответствующий этой цифре.
RazrDisplay=razryad[r];                                     // получаем цифру и выводим номер регистра, из массива цифр, соответствующий этой цифре.
  digitalWrite(LATCH_PIN, LOW);                             // устанавливаем синхронизацию "защелки" на LOW
      shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, RazrDisplay); // Записываем информацию для второго регистра (Номер разряда)
      shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, SegDisplay);  // Записываем информацию для первого регистра (Номер символа)
  digitalWrite(LATCH_PIN, HIGH);                            // "защелкиваем" регистр, тем самым устанавливая значения на выходах
  delay(5);                                                 // пауза, чтобы сегменты "разгорелись"
}  

 

alex0
Offline
Зарегистрирован: 14.12.2015

Падение напряжения, реле много кушает. Покажите схему устройства.

Glyuk1
Offline
Зарегистрирован: 30.04.2016

ой, использую не реле, а ключ на биполярном транзисторе. 


Регистры питаю отдельным питанием, земли соединены.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Код не смотрел, возникло не понимание, как ТС связывает тусклое горение семисегментника с вопросом оптимизации кода..

Jatixo
Offline
Зарегистрирован: 13.01.2016

Чем всё это питается (если блок питания, то напряжение V и ток mA/A)?

Glyuk1
Offline
Зарегистрирован: 30.04.2016

Вместо атмеги на схеме использую ардуино, нарисовал так для удобства, регистры и нагрузка питаются от 5 вольт блока питания лабораторного, мощности хватает точно!

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Вы бы вместо "хватает точно", указали конкретно параметры блока питания и нагревательного элемента, еоторый вы включаете через "реле".

Glyuk1
Offline
Зарегистрирован: 30.04.2016

Блок питания самопальный, не мой, конкретных параметров нету. Нагрузку питаю от 5В, сопротивление 1,1 Ом (резистор ПЭВ) , нагревается до 120 без проблем , ток при этом эколо 3.5 А, напряжение проседает немного.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Вот из-за проседания напряжения тусклее и горит.

Опять же, проседать может по-разному. Например, без нагрузки - выдавать ровно 5 Вольт, а под нагрузкой - появляются пульсации с удвоенной частотой сети, причем асимметричные: среднее напряжение 4.5 Вольт, а размах пульсаций - от 3.5 В до 5 В. ПОсмотрите осциллографом, что там с питанием происходит под нагрузкой.

И, кстати, если у Вас на нагрузке 1.1 Ом ток 3.5 А, значит, напряжение проседает ниже 4 Вольт.

Glyuk1
Offline
Зарегистрирован: 30.04.2016

Да, ниже 4В, я думал об этом, но это плохо тогда, с питанием что-то придумывать надо

releyshic
Offline
Зарегистрирован: 20.11.2015

DC-DC преобразователь

А померить не вариант?

Glyuk1
Offline
Зарегистрирован: 30.04.2016

От другого источника запитал микрухи, всё гуд, предётся транс искать

releyshic
Offline
Зарегистрирован: 20.11.2015

БП от компа за 100-200 р не вариант?

Glyuk1
Offline
Зарегистрирован: 30.04.2016

Делаю макет, размеры имеют значение, один бп от компа как макет мой по размеру будет.