Всем привет. Нашел у себя в запасах большие семисегментные индикаторы с общим анодом, и пришла мне в голову мысль собрать на них часы, заодно подучится писать скетчи для Ардуино. Схему управления индикатором организовал на сдвиговом регистре 74HC595 для катодов, и усилил выход сборкой Дарлингтона ULN2003, Аноды усилил транзисторными ключами. Пока вроде все хорошо, но вот столкнулся с проблемой, при считывании показаний с датчика температуры DS18B20 индикаторы начинают дико моргать? Проблему пока не могу локализировать. Может что-то не так с динамической индикацией, так как пробовал писать её сам. За помощь и наставления на путь истинный буду премного благодарен. Прикрепляю к посту схему устройства и код. Заранее спасибо.
75ch595:
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define latchPin 3 //Пин 8 подключен к ST_CP вход 74HC595
#define clockPin 4 //Пин 9 подключен к SH_CP входу 74HC595
#define dataPin 2 //Пин 11 подключен к DS входу 74HC595
#define pwmPin 9
#define SET_BUTTON A2
#define DOWN_BUTTON A1
#define UP_BUTTON A0
#define DS3231_I2C_ADDRESS 0x68
#define ONE_WIRE_BUS 12
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
byte hour_1, hour_2, minute_1, minute_2, seconds_1, seconds_2, temp_1, temp_2;
byte a;
byte bright;
unsigned long timer = 0;
const byte digitSegment[] = {
0b01101111, 0b00000011, 0b01011101, 0b01010111, 0b00110011,
0b01110110, 0b01111110, 0b01000011, 0b01111111, 0b01110111
};
byte decToBcd(byte val) {
return ( (val / 10 * 16) + (val % 10) );
}
byte bcdToDec(byte val) {
return ( (val / 16 * 10) + (val % 16) );
}
void setDateDs3231(byte second, // 0-59
byte minute, // 0-59
byte hour, // 0-23
byte dayOfWeek, // 1-7
byte dayOfMonth, // 1-28/29/30/31
byte month, // 1-12
byte year) // 0-99
{
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0);
Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.write(decToBcd(dayOfWeek));
Wire.write(decToBcd(dayOfMonth));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));
Wire.endTransmission();
}
void getDateDs3231(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0);
Wire.endTransmission();
Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f);
*dayOfWeek = bcdToDec(Wire.read());
*dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read());
*year = bcdToDec(Wire.read());
}
void setup() {
Serial.begin(9600);
Wire.begin();
sensors.begin();
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(pwmPin, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(10, OUTPUT);
pinMode (A0, INPUT);
pinMode (A1, INPUT);
pinMode (A2, INPUT);
pinMode (A3, INPUT);
// Шим на 9 ногу 62,5 кГц
TCCR1A = TCCR1A & 0xe0 | 1;
TCCR1B = TCCR1B & 0xe0 | 0x09;
}
void loop() {
autoBright ();
showTemp ();
// Динамическая индикация
for (a = 5; a <= 8; a++) {
digitalWrite(latchPin, LOW); // закрываем на "защелку" 74HC595
showTime();
digitalWrite(latchPin, HIGH); //открываем "защелку" 74HC595
digitalWrite (a, HIGH);
delay (1);
digitalWrite (a, LOW);
}
}
// показ времени
void showTime() {
getDateDs3231(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
hour_1 = hour / 10;
hour_2 = hour % 10;
minute_1 = minute / 10;
minute_2 = minute % 10;
seconds_1 = second / 10;
seconds_2 = second % 10;
switch (a) {
case 5: {
shiftOut(dataPin, clockPin, MSBFIRST, digitSegment[hour_1]); // передаем байт в 74HC595
break;
}
case 6: {
shiftOut(dataPin, clockPin, MSBFIRST, digitSegment[hour_2]); // передаем байт в 74HC595
break;
}
case 7: {
shiftOut(dataPin, clockPin, MSBFIRST, digitSegment[minute_1]); // передаем байт в 74HC595
break;
}
case 8: {
shiftOut(dataPin, clockPin, MSBFIRST, digitSegment[minute_2]); // передаем байт в 74HC595
break;
}
}
// моргание двоиточием
if (second % 2 != 0) {
analogWrite(10, 1);
} else
{
digitalWrite (10, LOW);
// analogWrite(10, 250);
}
//Обработка кнопок
if (millis() - timer > 200) {
if (!digitalRead(UP_BUTTON)) {
second = 0;
minute++;
if (minute > 59) minute = 0;
setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
timer = millis();
}
if (!digitalRead(DOWN_BUTTON)) {
int mins = minute;
second = 0;
mins--;
if (mins < 0) mins = 59;
minute = mins;
setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
timer = millis();
}
if (!digitalRead(SET_BUTTON)) {
second = 0;
hour++;
if (hour > 23) hour = 0;
setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
timer = millis();
}
}
}
//Автояркость дисплея
void autoBright () {
if (millis() - timer > 1000) {
int val = map (analogRead(A3), 0, 1023, 0, 5);
if (val <= 1) {
bright = 250;
}
if (val > 1 && val <= 2) {
bright = 180;
}
if (val > 2 && val <= 4) {
bright = 70;
}
if (val >= 4 && val <= 5) {
bright = 13;
}
}
analogWrite(pwmPin, bright); //шим сигнал на вывод ОЕ 74HC595
}
//Считывание температуры
void showTemp () {
float tempC = sensors.getTempCByIndex(0);
Serial.println(tempC);
}
Вложения
-
5.6 KB Просмотры: 20