Зависание Arduino Nano при включении

k4889
Offline
Зарегистрирован: 10.02.2017

Помогите диагностировать проблему.

К Adruino подключен дисплей TM1637.

Сама ардуинка запитана от БП от мобильного телефона на VCC порт (БП выдает 5.6В).

При включении ардуинки дисплей не горит, пока не нажать на Reset, т.е. видимо даже не отрабатывает setup.

Не понимаю, почему так.

//-----------внутренняя память arduino-----------
#include <EEPROM.h>
int timer = EEPROM.read(0); //время в секундах
//-----------внутренняя память arduino-----------

//-----------дисплей TM1637-----------
#include <TM1637.h> //подключаем библиотеку для работы с диплеем
#define CLK 2 //пин дисплея
#define DIO 3 //пин дисплея
TM1637 disp(CLK,DIO);   //обозвать дисплей disp
//-----------дисплей TM1637-----------

//-----------кнопки-----------
byte butt_plus = 4;  //состояние кнопки (+)
byte butt_minus = 5;  //состояние кнопки (-)
byte butt_stop = 6;  //состояние кнопки (Stop)
byte butt_start = 7;  //состояние кнопки (Start)
byte butt_all = 11;  //питание всех кнопок
//-----------кнопки-----------

//-----------реле-----------
//byte rele = 8;  //состояние реле
//-----------реле-----------

//-----------переменные-----------
boolean start = false;
unsigned long timeStart = 0;
byte timeEdit = 0; 
byte oldTimeEdit = 0;
//-----------переменные-----------



void setup()
{
  Serial.begin(9600);    //открываем COM порт
  pinMode(butt_all,OUTPUT); //пин как вход для всех кнопок
  pinMode(butt_plus,INPUT_PULLUP); //включаем внутренние подтягивающие резисторы к +5В
  pinMode(butt_minus,INPUT_PULLUP); //включаем внутренние подтягивающие резисторы к +5В
  pinMode(butt_start,INPUT_PULLUP); //включаем внутренние подтягивающие резисторы к +5В
  pinMode(butt_stop,INPUT_PULLUP); //включаем внутренние подтягивающие резисторы к +5В 
  //pinMode(rele,INPUT_PULLUP); //включаем внутренние подтягивающие резисторы
  
  //включаем прием тока на пине
  digitalWrite(butt_all,0);  

  disp.init();  //инициализация дисплея
  disp.set(3);  //яркость диплея (0-7)
  disp.display(timer); //выведем время таймера
}



void loop()
{  
  if (start) {     
    timeEdit = timer - ((millis() - timeStart) / 1000);
    
    if (timeEdit > 0) {
      if (timeEdit != oldTimeEdit)
      {
        //Выведем оставшееся время
        setDisplay(timeEdit);
        oldTimeEdit = timeEdit;
      }
      
      //Если нажали на кнопку (Stop)
      if (digitalRead(butt_stop) == LOW) {
        stopMotor();       
      }
    }
    else
    {
      stopMotor(); 
    } 
  }
  else  
  {  
    start = false;
    
    //Если нажали на кнопку (+)
    if (digitalRead(butt_plus) == LOW) {
      editTimer(1);  
    }

    //Если нажали на кнопку (-)
    if (digitalRead(butt_minus) == LOW) {
      editTimer(0); 
    }

    //Если нажали на кнопку (Start)
    if (digitalRead(butt_start) == LOW) {      
      timeStart = millis();
      start = true;
      //Добавить включение реле  
    }
  }
}



//Функция для выключения реле
void stopMotor () {
  start = false;
  timeStart = 0;
  timeEdit = 0;
  oldTimeEdit = 0;
  setDisplay(timer);
  //Добавить выключение реле  
}



//Функция для изменения таймера
void editTimer (int edit) {
  if (edit == 1) {
    timer = timer + 1;  
  }
  else
  {
    timer = timer - 1;
  }  
  EEPROM.write(0, timer);
  setDisplay(timer);
  delay(200); 
}



//Функция вывода времени на дисплей
void setDisplay(int setTime) {
    disp.clearDisplay();
    disp.display(setTime);  
 }

 

k4889
Offline
Зарегистрирован: 10.02.2017

Еще прикладываю схему подключения, на всякий случай.

На схеме, реле с мотором отключены, т.к. еще не купил транзистор для реле. 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

+5в из БП идет на какой пин ардуинки ? VIN или +5в

k4889
Offline
Зарегистрирован: 10.02.2017

Сейчас на VCC, когда подключал на +5В, она почему-то вообще не работала.

Возможно дело в том, что блок выдает 5.6В, т.е. чуть больше.

Кстати при питании от USB, проблема все равно остается, поэтому дело тут не в питании скорей всего.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

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

k4889
Offline
Зарегистрирован: 10.02.2017

Воткнул монитор

void setup()
{
  Serial.begin(9600);    //открываем COM порт
Serial.println("1");
  pinMode(butt_all,OUTPUT); //пин как вход для всех кнопок
  pinMode(butt_plus,INPUT_PULLUP); //включаем внутренние подтягивающие резисторы к +5В
  pinMode(butt_minus,INPUT_PULLUP); //включаем внутренние подтягивающие резисторы к +5В
  pinMode(butt_start,INPUT_PULLUP); //включаем внутренние подтягивающие резисторы к +5В
  pinMode(butt_stop,INPUT_PULLUP); //включаем внутренние подтягивающие резисторы к +5В 
  pinMode(rele,OUTPUT); //включаем 
Serial.println("2");
  //включаем прием тока на пине
  digitalWrite(butt_all,0);  
Serial.println("3");
  disp.set(3);  //яркость диплея (0-7)
Serial.println("4");  
  disp.init();  //инициализация дисплея
Serial.println("5");
  disp.display(timer); //выведем время таймера
Serial.println("6");
}

Зависает на disp.init() - 17 строка;

Я на arduino программирую первый раз, поэтому еще не все констукции понимаю

Вот функция из библиотеки:

void TM1637::init(uint8_t DispType)
{
  _DispType = DispType;
  BlankingFlag = 1;
  DecPoint = 3;
  clearDisplay();
}

 

AlexeySh
Offline
Зарегистрирован: 16.01.2017

Проблема как обычно с плохим питанием. Ардуине для нормальной работы нужно стабильные 5В. На входе стоит интегральный стабилизатор на который нужно подать не менее 6В, причем заметьте не менее 6В туда должно приходить в моменты максимального потребления тока. Иначе питание Ардуино будет нестабильно и она может глючить. Это нормальное явление. Идем дальше. На дисплей вы тоже подаете нестабилизированное напряжение, да ещё больше чем нужно. Вместо 5В - 5,6В. И хотите чтобы все работало. Не будет.

Кроме того вы видимо слабо представляете какое напряжение на выходе БП от мобильного телефона. Если есть осциллограф подключите его на выход этого блока питания. Думаю после этого подключать к нему Ардуино вам больше не захочется.

Есть два способа решить проблему.

Первый - запитать все от блока питания не 5,6В, а 8-9В. Подключив при этом питание дисплея к выходу +5В Ардуино.

Второй - вместо БП от мобильного телефона взять БП на 5В выдающий на выходе стабильные 5В без шумов и помех.

С первым может быть сложность из-за ограниченой мощности встроенного интегрального стабилизатора на плате Ардуино. Реле может не потянуть. Будет проявляться сбоем в работе в момент включения реле. В таком случае могу посоветовать блок питания на 8-9В плюс дополнительный модуль стабилизатора 5В на ток 700-800 мА.

SLKH
Offline
Зарегистрирован: 17.08.2015

Когда в строке 095 допишется включение реле, начнется соревнование, что раньше сдохнет: транзистор или выход D8.

rksrk
Offline
Зарегистрирован: 21.02.2018

Приветствую всех! Уж год прошёл с открытия темы... А я, как раз, столкнулся с такой же проблемой. В итоге...! Было лень брать осциллограф. Решил искать в сети. Борьба с питанием не помогла. Решил методом тыка (ведь осциллограф лень было достать) вешать на обвес ардуинки конденсаторы. Метод тыка не подвёл. Помогли конденсаторы по 10n (такие под руку попали), которые навесил на выводы CLK и DIO (TM1637) относительно "-". Сразу все завелось)))

k4889
Offline
Зарегистрирован: 10.02.2017

 Я в итоге решил проблему заменой библиотеки для работы с дисплеем.

Брал тут https://github.com/bremme/arduino-tm1637