Arduino nano + 4x 7-сегментный дисплей + 74HC595 — включены только точки

Я пытаюсь запустить термометр с датчиком термопары на Arduino Nano.

Я купил 4x 7-сегментный дисплей и чип 74HC595. Все подключено как на приложенной схеме ниже (без DS18B20) dots.

Ниже вы можете найти мой код

#include <OneWire.h>

const int latchPin = 8; // Контакт, подключенный к ST_CP 74HC595
const int clockPin = 9; // Контакт, подключенный к SH_CP 74HC595
const int dataPin = 10; // Контакт, подключенный к DS 74HC595
const int digitPins[4] = {
    3, 4, 5, 6}; // контакты для управления 4 общими анодными контактами дисплея
// семь сегментных разрядов + пробел + минус
const byte digit[12] = {
    B00111111, // 0
    B00000110, // 1
    B01011011, // 2
    B01001111, // 3
    B01100110, // 4
    B01101101, // 5
    B01111101, // 6
    B00000111, // 7
    B01111111, // 8
    B01101111, // 9
    B00000000, // Пусто
    B01000000  //-
};

int digitBuffer[4] = {1};
int digitScan = 0;
int soft_scaler = 0;
float tempC, tempF;
int tmp;
boolean sign = false;

void setup()
{
    TCCR2A = 0;
    TCCR2B = (1 << CS21);
    TIMSK2 = (1 << TOIE2);
    TCNT2 = 0;

    for (int i = 0; i < 4; i++)
        pinMode(digitPins[i], OUTPUT);

    pinMode(latchPin, OUTPUT);
    pinMode(clockPin, OUTPUT);
    pinMode(dataPin, OUTPUT);
}

ISR(TIMER2_OVF_vect)
{
    soft_scaler++;
    if (soft_scaler == 15)
    {
        refreshDisplay();
        soft_scaler = 0;
    }
};

void refreshDisplay()
{
    for (byte k = 0; k < 4; k++)
        digitalWrite(digitPins[k], LOW);

    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, B11111111);
    digitalWrite(latchPin, HIGH);
    delayMicroseconds(50);
    digitalWrite(digitPins[digitScan], HIGH);
    digitalWrite(latchPin, LOW);

    if (digitScan == 1)
    {
        shiftOut(dataPin, clockPin, MSBFIRST,
                 ~(digit[digitBuffer[digitScan]] | B10000000));
    }
    else
    {
        shiftOut(dataPin, clockPin, MSBFIRST, ~digit[digitBuffer[digitScan]]);
    }

    digitalWrite(latchPin, HIGH);
    digitScan++;
    if (digitScan > 3)
        digitScan = 0;
}

void loop()
{

    tempC = 90.8;
    tmp = int(tempC * 10);
    if (tempC < 0)
    {
        sign = true;
        tmp = abs(tmp);
    }
    else
    {
        sign = false;
    }

    if (int(tmp) / 1000 == 0)
    {
        digitBuffer[3] = 10;
        if (sign)
        {
            digitBuffer[3] = 11;
        }
    }
    else
    {
        digitBuffer[3] = int(tmp) / 1000;
    }

    if (int(tmp) / 1000 == 0 && (int(tmp) % 1000) / 100 == 0)
    {
        digitBuffer[2] = 10;
        if (sign)
        {
            digitBuffer[2] = 11;
            digitBuffer[3] = 10;
        }
    }
    else
    {
        digitBuffer[2] = (int(tmp) % 1000) / 100;
    }

    digitBuffer[1] = (int(tmp) % 100) / 10;
    digitBuffer[0] = (int(tmp) % 100) % 10;

    delay(500);
}

Термопару пока не подключал, но использую константу "tempC" со значением = 90,8, чтобы проверить, работает ли он. Если я изменю значение на более высокое, точки на дисплеях станут более тусклыми.

, 👍1

Обсуждение

пожалуйста, сделайте правильный отступ в коде... сейчас его трудно читать, @jsotola

Это большой дисплей. То, что горят только точки, указывает на то, что напряжение может быть слишком низким. В точках, вероятно, меньше последовательных диодов, чем в сегментах. Зеленые индикаторные диоды также имеют относительно высокое прямое напряжение. Могут быть и другие проблемы. Разместите ссылку на техпаспорт или сайт поставщика для этого дисплея. Также это указывает на проблему с программным обеспечением, поскольку схема подразумевает отображение общего катодного типа: //контакты для управления 4 общими анодными контактами дисплея Помните также об абсолютном максимальном пределе 40 мА для контактов Arduino, особенно актуальном для контактов с d3 по d6 здесь., @6v6gt

Ваши цифровые контакты, вероятно, не могут обеспечить достаточный ток для освещения сегментов дисплея. Вам нужен PNP-транзистор с соответствующим базовым резистором на каждом цифровом выводе для управления дисплеями с использованием активного низкого (инвертированного) сигнала. Это было бы проще, если бы ваш дисплей был типа с общим катодом. Тот факт, что горят только точки, может также указывать на то, что с вашим кодом что-то не так., @StarCat

Спасибо за ответ! Вы можете быть правы, что транзисторы будут необходимы. Ниже Вы можете найти сайт производителя этого дисплея https://sklep.avt.pl/wyswietlacz-led-2-30-57mm-zielony-wa.html Вы можете найти в описании - это обычный анодный дисплей., @Krzychotnik


1 ответ


Лучший ответ:

-1

Описание поставщика не очень хорошее, однако ясно, что 5 вольт недостаточно для этих дисплеев, а это означает, что вам нужно перепроектировать схему, чтобы включить источник питания с более высоким напряжением. Однако из описания следует, что это устройство с обычным анодом. На снимке экрана из таблицы данных показано, что каждый сегмент имеет 4 последовательных диода, а DP имеет 2 последовательных диода. То, что DP загорается при напряжении 5 вольт, указывает на то, что сегменты будут светиться при напряжении 10 вольт (возможно, немного меньше). Поскольку это обычный тип анода, вы можете использовать сдвиговый регистр TPIC6B595 для замены 74HC595. Вам также потребуются 4 переключателя верхнего плеча (каждый транзистор 1xPNP + 1xNPN) для 4 анодов. Для этого вы также можете использовать микросхему драйвера верхней стороны, скажем, MIC2981. Поскольку падение напряжения на сегментном диоде не показано, но должно находиться в диапазоне от 2,1 до 4 вольт, вам действительно необходимо провести тест, чтобы определить оптимальное значение токоограничивающих резисторов сегмента, чтобы обеспечить 10 мА, о которых говорится в описании, при напряжение, при котором вы решили управлять дисплеем. Для DP действительно требуется токоограничивающий резистор соответственно более высокого номинала.

,

Спасибо за Вашу поддержку! Требует ли замена 74HC595 на TPIC6B595 изменения кода или схемы? И для верности - на выход D3-D6 нужно поставить MIC2981?, @Krzychotnik

Подключение к TPIC6B595 отличается от подключения к 74HC595. Лучше всего поискать учебник Arduino TPIC6B595. Кроме того, данные, которые вы отправляете, инвертируются, потому что отправка «1» включает сегмент, переводя его в НИЗКИЙ уровень. На 74HC595 отправка «1» отключила бы сегмент, потянув его на ВЫСОКИЙ уровень. Проще всего было бы инвертировать таблицу, например "8" на данный момент B01111111, //8. Вы бы изменили это на B10000000, //8 . MIC2981 — это 8-канальный драйвер источника. Вы должны подключить контакты Arduino D3–D6 к контактам 1–4 MIC2981. Выходы MIC2981 с 18 по 15 пойдут на общие аноды дисплея., @6v6gt

Глядя на ваш код, трудно понять, как все четыре точки могут отображаться одновременно, как на вашей картинке. Должна отображаться только точка на второй цифре. Однако распиновка дисплея на схеме отличается от распиновки в документе поставщика. Анод подключается к контактам 3 и 8 на схеме и 1 и 5 в документации поставщика. Это также означает, что вы неправильно подключили дисплей. Изменение кода для TPIC6B595 должно быть даже проще, чем я говорил ранее. Просто удалите инвертирующие тильды '~' в двух операторах shiftOut()., @6v6gt