Подключение четырехразрядного индикатора к pi.

Тема в разделе "Raspberry Pi", создана пользователем SHAG, 10 ноя 2014.

  1. SHAG

    SHAG Нуб

    Мне нужно подключить несколько вот таких: http://amperka.ru/product/troyka-quad-display

    дисплейчиков к pi для того, чтобы расставить по комнатам в доме и показывать температуру.

    Драйвера я вижу только для arduino. А хочется работать напрямую с pi и желательно на Питоне.

    Это возможно?
     
  2. SHAG

    SHAG Нуб

    Так никто и не подскажет?
    Можно-ли как-то управлять этим дисплеем с Малинки?

    В окошке продажи анонсировано, что СОВМЕСТИМО с rPI.
     
  3. SHAG

    SHAG Нуб

    Пока ждал ответа, сам все переправил. Работает на rPI.

    Код (Text):
    #include "QuadDisplay.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <errno.h>
    #include <bcm2835.h>

    #define PIN RPI_V2_GPIO_P1_11

    #define max(x, y) x>y ? x : y

    #define MACRO_DIGITAL_WRITE(a,b) (bcm2835_gpio_write(a,b))

    const static uint8_t numerals[] = {QD_0, QD_1, QD_2, QD_3, QD_4, QD_5, QD_6, QD_7, QD_8, QD_9};

    typedef unsigned char byte;


    int main(int argc, char **argv, char **envp) {

            if (!bcm2835_init()) exit(EXIT_FAILURE);

            bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_OUTP);

            if(argc!=2)
            {
              displayClear(PIN);
              return (EXIT_SUCCESS);
            }
            displayFloat(PIN,atof(argv[1]), 1);
            //displayTemperatureC(PIN, atoi(argv[1]));

            // displayInt(PIN, 123);

            bcm2835_close();
            return (EXIT_SUCCESS);
    }

    static void sendByte(uint8_t pin, byte data, byte n = 8)
    {
        for (byte i = n; i > 0; i--) {
            if (data & 1) {
                //noInterrupts();
                MACRO_DIGITAL_WRITE(pin, LOW);
                MACRO_DIGITAL_WRITE(pin, HIGH);
                //interrupts();
                delayMicroseconds(30);
            }
            else {
                MACRO_DIGITAL_WRITE(pin, LOW);
                delayMicroseconds(15);
                MACRO_DIGITAL_WRITE(pin, HIGH);
                delayMicroseconds(60);
            }
            data >>= 1;
        }
    }

    static void latch(uint8_t pin)
    {
        MACRO_DIGITAL_WRITE(pin, LOW);
        delayMicroseconds(100);
        MACRO_DIGITAL_WRITE(pin, HIGH);
        delayMicroseconds(300);
    }
    void displayDigits(uint8_t pin, uint8_t digit1, uint8_t digit2, uint8_t digit3, uint8_t digit4)
    {
        //pinMode(pin, OUTPUT);
        //turnOffPWM work here:
        MACRO_DIGITAL_WRITE(pin, HIGH);
        sendByte(pin, digit1);
        sendByte(pin, digit2);
        sendByte(pin, digit3);
        sendByte(pin, digit4);
        latch(pin);
    }

    void displayClear(uint8_t pin)
    {
        displayDigits(pin, QD_NONE, QD_NONE, QD_NONE, QD_NONE);
    }

    void displayInt(uint8_t pin, int val, bool padZeros, uint8_t dots)
    {
        uint8_t digits[4] = {0xff, 0xff, 0xff, 0xff};

        if (!padZeros && !val)
            digits[3] = numerals[0];
        else {
            bool negative = val < 0;
            val = abs(val);


            int8_t i;
            for (i = 4; i--; ) {
                uint8_t digit = val % 10;
                digits[i] = (val || padZeros) ? numerals[digit] : 0xff;

                val /= 10;
                if (!val && !padZeros)
                    break;
            }

            if (negative)
                digits[max(0, i-1)] = QD_MINUS;

            for (i = 4; i--; ) {
                if (dots & (1 << i))
                    digits[4 - i] &= QD_DOT;
            }
        }

        displayDigits(pin, digits[0], digits[1], digits[2], digits[3]);
    }

    void displayFloat(uint8_t pin, float val, uint8_t precision, bool padZeros)
    {
        uint8_t dot = 0x1;
        while (precision) {
            val *= 10;
            --precision;
            dot <<= 1;
        }

        displayInt(pin, (int)val, padZeros, dot);
    }

    void displayTemperatureC(uint8_t pin, int val, bool padZeros)
    {

        uint8_t digits[4] = {0xff, 0xff, QD_DEGREE, QD_C};

        if (!padZeros && !val)
            digits[1] = numerals[0];
        else {
            bool negative = val < 0;
            val = abs(val);

            int8_t i;
            for (i = 2; i--; ) {
                uint8_t digit = val % 10;
                digits[i] = (val || padZeros) ? numerals[digit] : 0xff;

                val /= 10;
                if (!val && !padZeros)
                    break;
            }

            if (negative)
                digits[max(0, i-1)] = QD_MINUS;
        }
        displayDigits(pin, digits[0], digits[1], digits[2], digits[3]);
    }




     
     
  4. pmkdvs200

    pmkdvs200 Нуб

    Подскажите, пжл, как в итоге это работает.

    Куда положить этот модуль ?
    Как из Python обратиться например к функции displayTemperatureC?

    Спасибо