Упрощение кода
- Войдите на сайт для отправки комментариев
Сб, 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 р не вариант?
Делаю макет, размеры имеют значение, один бп от компа как макет мой по размеру будет.