7 сегментные большие часы на Ардуино. Имею вопросы!

Тема в разделе "Arduino & Shields", создана пользователем GennOk, 26 июл 2016.

  1. abyrvalg

    abyrvalg Нуб

    перепроверил все. попробовал примерами подключить,все работает,лента спаяна нормально. Снова подключил все модули ,время пошло,но сегменты,которые должны не гореть,мерцают. Слабее чем основные сегменты,но все портит. И почему то сегмент G на первой цифре горит. Когда прикрываю датчик света рукой,все диоды горят тусклее и вообще нет цифр,все одинаково мерцают. снял на видео ,что выходит

     
  2. GennOk

    GennOk Нерд

    а нарисуй схемку как все у тебя подключено. и скинь сюда скетч, тот что залит у тебя!
     
  3. igarka

    igarka Нерд

    Питания не хватает.
     
  4. 6umer

    6umer Нуб

    Здравствуйте ! вы смогли разобраться с отображение температуры и погоды на ваших часиках ?
     
  5. 6umer

    6umer Нуб

    Здравствуйте! подскажите пожалуйста, правильно ли я понимаю, ниже представлена часть кода из шапки этой темы, я повторил конструкцию часов на тех же ws2812b, с отличием в том, что сегмент цифры подсвечивается одним светодиодом, а в этом коде судя по видео 3-4. Ну и само собой я не понимаю в программировании, просмотрев скетч, я так понял с 017-046 строку задаются адреса светодиодов, которые должны загораться для формирования цифры на табло, разъясните пожалуйста как поменять их под мои параметры.
    5b5d74ca-bb28-4669-ae85-fd272b167c6c.jpg

    Код (C++):
    016 byte digits[10][26] = {
    017 {
    018 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 }
    019 , // Digit 0
    020 {
    021 0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1 }
    022 , // Digit 1
    023 {
    024 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,0,0,0,0 }
    025 , // Digit 2
    026 {
    027 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1 }
    028 , // Digit 3
    029 {
    030 1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,1 }
    031 , // Digit 4
    032 {
    033 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1 }
    034 , // Digit 5
    035 {
    036 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 }
    037 , // Digit 6
    038 {
    039 0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1 }
    040 , // Digit 7
    041 {
    042 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 }
    043 , // Digit 8
    044 {
    045 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1 }
    046 }; // Digit 9 | 2D Array for numbers on 7 segment
    047
     
  6. ostrov

    ostrov Гуру

    Рисуете на бумаге схему расположения светодиодов. Прозваниваете проводочки, записывайте какой проводок какой светодиод зажег. Потом составляете таблицу цифр для каждого разряда применительно к этим прводочкам. Чтобы загорелась первая 5 нужно включить этот, тот, вон тот и так далее. Затем всю эту матрицу в память МК и пусть дергает эти проводки согласно таблице. Разумеется, ног на Ардуине не хватит, надо будет или сдвиговые регистры использовать или MAX.
     
  7. GennOk

    GennOk Нерд

    Привет. Сразу скажу, я тоже не силен в программировании и подгонял готовый проект под себя. С температурой не получилось. Не смог. По поводу цифр. В моем проекте цифры действительно из 3-4 диодов и расположение идет с лева на право. Нужно в нескольких местах подправить код. Во первых сделать слева на право. Сейчас попробую прикинуть цифры как должны быть у вас.
     

    Вложения:

    • часы.jpg
      часы.jpg
      Размер файла:
      1,2 МБ
      Просмотров:
      1.002
  8. GennOk

    GennOk Нерд

    Код (C++):
    016 byte digits[10][7] = {
    017 {
    018 0,1,1,1,1,1,1}
    019 , // Digit 0
    020 {
    021 0,1,0,0,0,0,1}
    022 , // Digit 1
    023 {
    024 1,1,1,0,1,1,0}
    025 , // Digit 2
    026 {
    027 1,1,1,0,0,1,1}
    028 , // Digit 3
    029 {
    030 1,1,0,1,0,0,1}
    031 , // Digit 4
    032 {
    033 1,0,1,1,0,1,1}
    034 , // Digit 5
    035 {
    036 1,0,1,1,1,1,1 }
    037 , // Digit 6
    038 {
    039 0,1,1,0,0,0,1}
    040 , // Digit 7
    041 {
    042 1,1,1,1,1,1,1 }
    043 , // Digit 8
    044 {
    045 1,1,1,1,0,1,1 }
    046 }; // Digit 9 | 2D Array for numbers on 7 segment
    047
     
  9. ostrov

    ostrov Гуру

    На картинке выше видно, что светодиоды не сгруппированы по сегментам, то есть их надо сперва отловить по одному.
     
  10. GennOk

    GennOk Нерд

    Вот подкорректировал код который залит у меня для вас - попробуйте!
    Код (C++):
    //http://www.instructables.com/id/Big-auto-dim-room-clock-using-arduino-and-WS2811/?comments=all#CPDXFS0INZGBXU1

    #include <DS3232RTC.h>
    #include <Time.h>
    #include <Wire.h>
    #include <FastLED.h>

    #define NUM_LEDS 30 // по 7 на цифру и 2 на разделительные точки
    #define LED_TYPE WS2812
    #define COLOR_ORDER GRB // Определение цвета ленты
    #define BRIGHTNESS 150
    #define LED_PIN 6 // Цифровой pin для led соединения

    CRGB leds[NUM_LEDS]; // Определение LED ленты

    byte digits[10][7] = {
    {
    0,1,1,1,1,1,1 }
    , // Цифра 0
    {
    0,1,0,0,0,0,1}
    , // Цифра 1
    {
    1,1,1,0,1,1,0 }
    , // Цифра 2
    {
    1,1,1,0,0,1,1 }
    , // Цифра 3
    {
    1,1,0,1,0,0,1}
    , // Цифра 4
    {
    1,0,1,1,0,1,1 }
    , // Цифра 5
    {
    1,0,1,1,1,1,1 }
    , // Цифра 6
    {
    0,1,1,0,0,0,1 }
    , // Цифра 7
    {
    1,1,1,1,1,1,1 }
    , // Цифра 8
    {
    1,1,1,1,0,1,1 }
    }; // Цифра 9 | 2D Массив для цифр из 7 сегментов

    byte firstdigit[2][10] = {
    {
    0,0,0,0,0,0,0,0,0,0 }
    , // Цифра 0 первое число

    {
    1,1,1,1,1,1,1,1,1,1 }
    }; // Цифра 1 первое число | 2D Массив для цифр из 7 сегментов

    bool Dot = true; //Dot состояние

    bool DST = false; //DST состояние
    int last_digit = 0;
    //long ledColor = CRGB::DarkOrchid; // Color used (in hex)
    long ledColor = CRGB::MediumVioletRed;
    long ColorTable[16] = {
    CRGB::Amethyst,
    CRGB::Aqua,
    CRGB::Blue,
    CRGB::Chartreuse,
    CRGB::DarkGreen,
    CRGB::DarkMagenta,
    CRGB::DarkOrange,
    CRGB::DeepPink,
    CRGB::Fuchsia,
    CRGB::Gold,
    CRGB::GreenYellow,
    CRGB::LightCoral,
    CRGB::Tomato,
    CRGB::Salmon,
    CRGB::Red,
    CRGB::Orchid};
    void setup(){

    Serial.begin(9600);

    Wire.begin();
    FastLED.addLeds<WS2812B, LED_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
    FastLED.setBrightness( BRIGHTNESS );
    pinMode(2, INPUT_PULLUP); // Настройка DST привязка кнопки к pin
    pinMode(4, INPUT_PULLUP); // Настройка Минуты привязка кнопки к pin
    pinMode(5, INPUT_PULLUP); // Настройка Часы привязка кнопки к pin

    }

    // Проверка сенсора света и установка соответсвующего уровня
    void BrightnessCheck(){
    const byte sensorPin = 3; // Сенсор света PIN
    const byte brightnessLow = 75; // Уровень слабого освещения
    const byte brightnessHigh = 100; // Уровень сильного освещения
    int sensorValue = digitalRead(sensorPin); // Чтение данных с сенсора
    if (sensorValue == 0) {
    Serial.println("Brightness High");
    LEDS.setBrightness(brightnessHigh);
    }

    else {
    Serial.println("Brightness Low");
    LEDS.setBrightness(brightnessLow);
    }

    };

    // Получить время в один номер
    int GetTime(){
    tmElements_t Now;
    RTC.read(Now);
    //time_t Now = RTC.Now();// Получение текущего времени и сохранение его в объект DateTime
    int hour=Now.Hour;
    int minutes=Now.Minute;
    int second =Now.Second;
    if (second % 2==0) {
    Dot = false;
    }
    else {
    Dot = true;
    };
    return (hour*100+minutes);
    };

    void DSTcheck(){

    int buttonDST = digitalRead(2);

    Serial.print("DST is: ");
    Serial.println(DST);

    if (buttonDST == LOW){

    if (DST){

    DST=false;

    Serial.print("Switching DST to: ");
    Serial.println(DST);

    }

    else if (!DST){

    DST=true;

    Serial.print("Switching DST to: ");
    Serial.println(DST);

    };

    delay(500);

    };

    }

    // Конвертирование времени в массив необходимый для дисплея

    void TimeToArray(){

    int Now = GetTime(); // Get time

    int cursor = 30;

    Serial.print("Time is: ");
    Serial.println(Now);

    if (Dot){
    leds[15]=ledColor;
    leds[16]=ledColor;
    }
    else {
    leds[15]=0x000000;
    leds[16]=0x000000;
    };
    for(int i=1;i<=4;i++){
    int digit = Now % 10; // get last digit in time
    if (i==1){
    cursor =23;
    Serial.print("Digit 4 is : ");
    Serial.print(digit);
    Serial.print(", the array is : ");

    for(int k=0; k<=6;k++){

    Serial.print(digits[digit][k]);

    if (digits[digit][k]== 1){
    leds[cursor]=ledColor;
    }

    else if (digits[digit][k]==0){
    leds[cursor]=0x000000;
    };

    cursor ++;

    }; // fin for

    Serial.println();
    if (digit != last_digit)
    { fadefonction();
    ledColor = ColorTable[random(16)];
    }
    last_digit = digit;

    }// fin if

    else if (i==2){

    cursor =16;

    Serial.print("Digit 3 is : ");
    Serial.print(digit);
    Serial.print(", the array is : ");

    for(int k=0; k<=6;k++){

    Serial.print(digits[digit][k]);

    if (digits[digit][k]== 1){
    leds[cursor]=ledColor;
    }

    else if (digits[digit][k]==0){
    leds[cursor]=0x000000;
    };

    cursor ++;

    };

    Serial.println();

    }

    else if (i==3){

    cursor =7;

    Serial.print("Digit 2 is : ");
    Serial.print(digit);
    Serial.print(", the array is : ");

    for(int k=0; k<=6;k++){

    Serial.print(digits[digit][k]);

    if (digits[digit][k]== 1){
    leds[cursor]=ledColor;
    }

    else if (digits[digit][k]==0){
    leds[cursor]=0x000000;
    };

    cursor ++;

    };

    Serial.println();

    }

    else if (i==4){

    cursor =0;

    Serial.print("Digit 1 is : ");
    Serial.print(digit);
    Serial.print(", the array is : ");

    for(int k=0; k<=6;k++){
    Serial.print(digits[digit][k]);
    if (digits[digit][k]== 1){
    leds[cursor]=ledColor;
    }
    else if (digits[digit][k]==0){
    leds[cursor]=0x000000;
    };
    cursor ++;
    };
    // Serial.println();

    };
    Now /= 10;
    };
    };
    void TimeAdjust()//Настройка времени
    {
    int buttonH = digitalRead(5);
    int buttonM = digitalRead(4);
    if (buttonH == LOW || buttonM == LOW){
    delay(500);
    tmElements_t Now;
    RTC.read(Now);
    int hour=Now.Hour;
    int minutes=Now.Minute;
    if (buttonH == LOW){
    if (Now.Hour== 24){
    Now.Hour=1;
    }
    else {
    Now.Hour += 1;
    };
    }
    else {
    if (Now.Minute== 59){
    Now.Minute=0;
    }
    else {
    Now.Minute += 1;
    };
    };

    RTC.write(Now);
    }
    }
    void fadeall() {
    for(int m = 0; m < NUM_LEDS; m++) {
    leds[m].nscale8(250);
    }
    }

    void fadefonction () {
    static uint8_t hue = 0;
    // First slide the led in one direction
    for(int i = 0; i < NUM_LEDS; i++) {
    // Set the i'th led to red
    leds = CHSV(hue++, 255, 255);
    // Show the leds
    FastLED.show();
    // now that we've shown the leds, reset the i'th led to black
    // leds = CRGB::Black;
    fadeall();
    // Wait a little bit before we loop around and do it again
    delay(10);
    }

    // Now go in the other direction.
    for(int i = (NUM_LEDS)-1; i >= 0; i--) {
    // Set the i'th led to red
    leds = CHSV(hue++, 255, 255);
    // Show the leds
    FastLED.show();
    // now that we've shown the leds, reset the i'th led to black
    // leds = CRGB::Black;
    fadeall();
    // Wait a little bit before we loop around and do it again
    delay(10);
    }
    }
    void loop() // Main loop
    {
    //BrightnessCheck(); // Check brightness
    //DSTcheck(); // Check DST
    TimeAdjust(); // Check to se if time is geting modified
    TimeToArray(); // Get leds array with required configuration
    FastLED.show(); // Display leds array

    /*float t = RTC.temperature();
    float celsius = t / 4.0;
    Serial.println();
    Serial.print("Temp is : ");
    Serial.print(celsius);
    Serial.println();*/


    }
    [/code]
     
  11. GennOk

    GennOk Нерд

    зеленым отображено как должны быть подключены диоды у вас
     

    Вложения:

    • часы.jpg
      часы.jpg
      Размер файла:
      1,2 МБ
      Просмотров:
      1.258
  12. 6umer

    6umer Нуб

    Спасибо!
    ostrov ведь это ws2812 их тоже касается ?
    диоды переподключить уже не имеет возможности, так как корпус собран, сделал это возможно зря, но зная, что можно настроить всё кодом, не колебался..

    при компиляции выдаёт ошибку ..
     
    Последнее редактирование: 16 янв 2017
  13. GennOk

    GennOk Нерд

    а я правильно понял, у вас 30 светодиодов WS 2812 B?
     
  14. 6umer

    6umer Нуб

    да да, их 30 штук..
    мешает эта строка
    leds = CHSV(hue++, 255, 255); убрав её в двух местах код без ошибки загрузился.
    Но результат, таже ерунда ..
    как пальцем в небо, понимаю этот подход очень неправильный .
     
    Последнее редактирование: 16 янв 2017
  15. 6umer

    6umer Нуб

    Продолжу.
    на часах горят разные сегменты не напоминающие знакомые символы, но они ровно в 60 секунд меняются, тоесть как я понимаю скетч работает и код часов вроде функционирует, только адреса светодиодов заданы не верно. хмм
     
  16. GennOk

    GennOk Нерд

    а порядок диодов такой как на моем фото?
     
  17. 6umer

    6umer Нуб

    нет, другой. фото с последовательностью диодов Посмотреть вложение 7530
    переделать уже не имеет возможности, если только новую коробку делать.
     
  18. GennOk

    GennOk Нерд

    посмотри этот рисунок
     

    Вложения:

    • часы2.png
      часы2.png
      Размер файла:
      32,1 КБ
      Просмотров:
      920
  19. GennOk

    GennOk Нерд

    в вашем случае
    "1" будет 0100001
    2 - 1011011
    3 - 1110011
    и.т.д.
     
  20. GennOk

    GennOk Нерд

    только перевернуть придется вверхногами :)