Упрощение кода
- Войдите на сайт для отправки комментариев
Сб, 30/04/2016 - 16:36
Есть код терморегулятора, вывод на семисегментный индикатор взял отсюда:
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); // пауза, чтобы сегменты "разгорелись"
}
Падение напряжения, реле много кушает. Покажите схему устройства.
ой, использую не реле, а ключ на биполярном транзисторе.
Регистры питаю отдельным питанием, земли соединены.
Код не смотрел, возникло не понимание, как ТС связывает тусклое горение семисегментника с вопросом оптимизации кода..
Чем всё это питается (если блок питания, то напряжение V и ток mA/A)?
Вместо атмеги на схеме использую ардуино, нарисовал так для удобства, регистры и нагрузка питаются от 5 вольт блока питания лабораторного, мощности хватает точно!
Вы бы вместо "хватает точно", указали конкретно параметры блока питания и нагревательного элемента, еоторый вы включаете через "реле".
Блок питания самопальный, не мой, конкретных параметров нету. Нагрузку питаю от 5В, сопротивление 1,1 Ом (резистор ПЭВ) , нагревается до 120 без проблем , ток при этом эколо 3.5 А, напряжение проседает немного.
Вот из-за проседания напряжения тусклее и горит.
Опять же, проседать может по-разному. Например, без нагрузки - выдавать ровно 5 Вольт, а под нагрузкой - появляются пульсации с удвоенной частотой сети, причем асимметричные: среднее напряжение 4.5 Вольт, а размах пульсаций - от 3.5 В до 5 В. ПОсмотрите осциллографом, что там с питанием происходит под нагрузкой.
И, кстати, если у Вас на нагрузке 1.1 Ом ток 3.5 А, значит, напряжение проседает ниже 4 Вольт.
Да, ниже 4В, я думал об этом, но это плохо тогда, с питанием что-то придумывать надо
DC-DC преобразователь
А померить не вариант?
От другого источника запитал микрухи, всё гуд, предётся транс искать
БП от компа за 100-200 р не вариант?
Делаю макет, размеры имеют значение, один бп от компа как макет мой по размеру будет.