РЕШЕНО Помогите решить проблему

Тема в разделе "Arduino & Shields", создана пользователем EzaHettR, 31 май 2020.

  1. EzaHettR

    EzaHettR Нуб

    Добрый день. Собрал себе проект аквариумной подсветки, обогрева и вывода все на дисплей
    из железа:
    ардуино нано
    модуль реального времени по i2c - вот такие https://amperka.ru/product/troyka-rtc
    сервопривод
    реле твердотельное
    LCD 16x2 по i2c
    LED ws2812B
    джойстик
    датчик температуры
    на этапе проектирования на макетной плате никаких проблем не было.
    спаял, заклеил, все собрал - заметил, что не много подтормаживать стал экран LCD. хотя не сильно заметно, но все же видно. подумал, что шумы может или просто провод длинный (хотя там где то 7 см провода)
    поставил работать, в принципе все хорошо было, пока не вырубили свет в доме часа на пол. потом снова включили. Но потом ардуино стало глючить
    вставил в setup() вывод Serial.
    Код (C++):
    #include <Wire.h>
    #include "TroykaRTC.h"
    #include <FastLED.h>
    #include <Thread.h>
    #include <OneWire.h>
    #include <Servo.h>
    #include <LiquidCrystal_I2C.h>

    #define LEN_TIME 12
    #define LEN_DATE 12
    #define LEN_DOW 12
    #define NUM_LEDS 60                                  //количество светодиодов
    #define DATA_PIN 9                                   //пин светодиодной ленты
    #define pin_temp 5                                   //пин датчика температуры
    #define pinRele 2                                    //пин управления реле
    #define pin_butt 11                                  //пин кнопки на джойстике
    #define vert_joy A2                                  //пин для получения вертикальных значений
    #define gorizont_joy A1                              //пин для получения горизонтальных значений
    #define MAX_NUM_LIGHT 3                              //максимлальное значение режимов освещения
    #define SEC_EAT 3                                    //время оборотов сервопривода

    boolean work_light;                                  // флаг работает/выключена светодиодная лента
    boolean work_heater;                                 // флаг работы нагревателя
    boolean work_auto_light;                             // флаг работы автоматического режима светодиодной ленты
    boolean work_feeder;                                 // флаг работы кормушки
    boolean LCD_work;                                    // флаг работы LCD



    Servo servo;                                         // создаем объект Servo, отвечающий за работу сервопривода
    RTC clock;                                           //создаем объект clock, отвечающий за работу модуля часов
    CRGB leds[NUM_LEDS];                                 //создаем объект - массив, хрянящий адреса всех светодиодов в ленте
    LiquidCrystal_I2C lcd(0x3F, 16, 2);                  //создаем объект LCD

    char time[LEN_TIME];                                 //получение значения времени из датчика (char [])
    char date[LEN_DATE];                                 //получение значения даты из датчика (char [])
    char weekDay[LEN_DOW];                               //получение значения дня недели с датчика (char [])
    int time_now[3];                                     // массиов для конвертации char времени в int
    int time_to_light[ ] = {0,0,0,0};                    // массив для таймера света
    int time_to_eat[ ] = {8,0};                          //массив для таймера кормления

    unsigned long int time_flag;                         //флаг времени работы светодиодов для режимов
    unsigned long int time_flag_t;                       //флаг времени работы нагревателя
    unsigned long int flag_time;                         //флаг времени работы сервопривода
    unsigned long int flag_time_butt;                    //флаг нажатия кнопки для дребезга
    unsigned long int time_work_LED;                     //флаг времени работы LED
    unsigned long int time_work_LCD;                     //флаг времени работы LCD экрана

    int ind_led;                                         //порядковый номер светодиода в ленте (при режиме "один диод бегает")
    int set_light;                                       //режим работы ленты
    int k = 0;                                           //позиция массива таймера времени для освещения (0, 1)
    int flag;                                            //флаг опреедения движения светодиода в режиме blinkOne() и
                                                         //увеличение/уменьшение насыщения  и
                                                         //режим мигания в blinkLed()
    int flag_j;                                          //флаг увеличения/уменьшения значения цвета  режиме blinkLowHight ()
    int flag_light_AH;                                   //флаг режима работы светодиодной ленты - автоматический или ручной

    int flag_but;                                        //флаг нажатия кнопки
    int flag_temp;                                       //флаг работы нагревателя
    int flag_joy;                                        //флаг движения джойстика
    int color;                                           //значение цвета
    int saturation;                                      //значение насыщенности
    int num_light;                                       //порядковый номер режима свещения светодиодной ленты

    int flag_joy_g;                                      //флаг определения горизонтального перемещения
    int flag_joy_v;                                      //флаг определения вертикального перемещения

    float norm_temper = 25.00;                           //значение номальной температуры

    int set_menu;                                        //режим переключения экранов
    int set_menu_buf_A;                                  //режим переключения подэкранов в режиме управления светодиодной лентой автоматическом режиме
    int set_menu_buf_H;                                  //режим переключения подэкранов в режиме управления светодиодной лентой в ручном режиме
    int set_heat;                                        //режим переключения экранов в режиме управления обогревателем
    int set_eat;                                         //режим перекрючения экранов в режиме управления кормушкой


    float temper(int);                                   // значение полученной температуры
    void blinkLowHight();                                // - плавное изменение цвета и насыщенности ленты
    void blinkLed();                                     // - мигание всей ленты с переменой цветов
    void blinkOne();                                     // - один светодиод "бегает" по ленте в одну и в другую сторону
    void what_time();
    void LED (int);
    void heat_rele();
    void eat_time();

    byte degree[8] =                                     // кодируем символ градуса
    {
      B00111,
      B00101,
      B00111,
      B00000,
      B00000,
      B00000,
      B00000,
    };
    byte arrow_right[8] =                                // кодируем символ градуса
    {
      B00000,
      B00100,
      B00010,
      B11111,
      B00010,
      B00100,
      B00000,
    };
    byte arrow_up[8] =                                   // кодируем символ градуса
    {
      B00000,
      B00000,
      B00100,
      B01110,
      B10101,
      B00100,
      B00100,
    };
    byte arrow_down[8] =                                 // кодируем символ градуса
    {
      B00100,
      B00100,
      B10101,
      B01110,
      B00100,
      B00000,
      B00000,
    };
    void setup()
    {
    Serial.begin(9600);

      FastLED.addLeds<WS2812B, DATA_PIN, RGB>(leds, NUM_LEDS); //подключение светодиодной ленты

      clock.begin();                                           //начало работы модуля часов
      //clock.set(__TIMESTAMP__);                                //выставление начала отсчета времени с момента, какое на компьютере время

      pinMode(pinRele, OUTPUT);                                //пин реле на "выход"

      pinMode(pin_butt, INPUT_PULLUP);                         //пин реле кнопки на джойстике на "ВХОД"
      pinMode (A1, INPUT);                                     //пин джойстика по получение значения вертикальной составляющей
      pinMode(A2, INPUT);                                      //пин джойстика по получение значения горизонтальной составляющей
    Serial.print("one  ");
      lcd.init();
      Serial.print("two ");// Инициализация дисплея
      lcd.backlight();                                         // Подключение подсветки
      lcd.createChar(5, degree);                               // Создаем символ градуса цельсия под номером 1
      lcd.createChar(1, arrow_right);                          // создаем символ стрелки вправо
      lcd.createChar(2, arrow_up);                             // создаем символ стрелки вверх
      lcd.createChar(3, arrow_down);                           // создаем символ стрелки вниз

    }
     
    часть кода с loop() не влезло в сообщение. пришлю, если нужно, в комментариях
    все строки Serial добавил для проверки работоспособности, так их нет в коде
    путем методы тыка нашлось следующее
    при запуске вышеизложенного кода выводит в порт только "one" и больше ничего
    поэтому проблема в инициализации LCD я так понимаю... виснет при этом все.

    подключение такое:
    один блок питания 5v 5a подключается к ардуине, часам, реле и LED и датчику температуры
    второй блок питания 5v 1а подключается к LCD, джойстику, сервоприводу
    вся земля объединена
    SDA часов и SDA экрана припаяны вместе и затем привязаны к ардуино
    SCL соответственно также

    при этом экран сам горит, подсветка работает, следовательно питание на него есть

    но виснет при инициализации

    при написании скетча отдельного просто на LCD экран, ситуация та же самая

    при запуске скетча для поиска адресов на i2c тоже виснет. ничего не выводи и не показывает

    схемы рисовать не умею, буду благодарен, если скажите, где можно их нарисовать, то поработаю над этим, если нужно

    может кто знает как проверить или что подкрутить для решения ситуации данной?
    на форуме не нашел решения проблемы
     
  2. Ariadna-on-Line

    Ariadna-on-Line Гуру

    То есть вы оключаете всё кроме дисплея, и зависание продолжается ?
     
  3. EzaHettR

    EzaHettR Нуб

    нет, ничего не отключал. добавил просто Serial для проверки каждой строки. путем проб и ошибок нашел, что на этапе инициализации был сбой
     
  4. EzaHettR

    EzaHettR Нуб

    Всем спасибо! решил попробовать заменить резисторы на подтяжке i2c (думал вдруг что там), припаял новые и заработало.
    так что, проблема решена)
    вопрос конечно остался открытым, почему lcd не много стала притормаживать при пайке всего, но основной вопрос закрыт
    хоть и внезапно для меня. лишнюю тему создал только.
     
  5. Daniil

    Daniil Гуру

    Вариант случайных замыканий не рассматривали? Часто тормошили шлейфы подключения?
     
  6. EzaHettR

    EzaHettR Нуб

    та нет. быстро все припаял и изолировал. не сильно и тормошил их
    про случайные замыкания не слышал
    где почитать о таком или в двух словах можно?
     
  7. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Резисторы с браком ? Или номиналы изменили ? Сколько на сколько ? Надо чтобы сообщество на вашем опыте училось, и наоборот. Для этого форум и существует. Может в резисторах и было торможение ?
     
    Последнее редактирование: 31 май 2020
  8. EzaHettR

    EzaHettR Нуб

    скорее всего не в них, потому что еще подтормаживает экран, даже после замены резисторов
    нет, номинал тот же, просто заменил на такие же - 9.8 кОм, покупал на Алюхе. Поэтому, может да, с браком были. хотя странно. их же использовал раньше в проектах, были рабочими. хз что в итоге с ними. А может при пайке задел как то, даже не знаю.

    проверил остальные подтягивающие резисторы, может в них дело, но больше не нашел брака. вроде все работает, ну кроме подтормаживания легкого LCD.
     
  9. b707

    b707 Гуру

    9.8 К ? - вы ничего не путаете?такого номинала ни в основной. ни в дополнительной линейке нет.
    А если взять тестер и измерить реальное сопротивление?
     
  10. EzaHettR

    EzaHettR Нуб

    я тоже удивился. опять таки, заказывал на Али. не помню, какое они писали в документации сопротивление, а сейчас магазин закрыт и нельзя посмотреть описание. поэтому взял тестер и померил - показал 9.8 примерно. сам как то удивился этому, но подумал, может я не знаю такого номинала
     
  11. parovoZZ

    parovoZZ Гуру

    это 10к с диким допуском.