Arduino зависает на самой ПРОСТОМ СКЕТЧЕ

maks12
Offline
Зарегистрирован: 13.06.2016

Доброго времени суток! Помогите пожалуйста, делаю САМЫЙ простой счетчик импульсов с 7-ми сегментным дисплеем(tm1637). Вот код: http://paste.ubuntu.com/23084999/ или http://paste.ubuntu.com/23085005/ вот фото блока питания http://radikal.ru/lfp/i057.radikal.ru/1608/e3/9102e46d595e.jpg/htm
Проблема заключается в том, что переменная перестает изменяться на 62, 188, 189, 288, 267 и вообще на любых числах примерно 3 раза за 20 минут. (подключаю через резистор 10 кОм к GND)

maks12
Offline
Зарегистрирован: 13.06.2016

Пишу с телефона поэтому не получилось код вставить.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

maks12 пишет:
Пишу с телефона поэтому не получилось код вставить.

Вот, когда получится, тогда и поговорим.

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

Более того, Вы привели два РАЗНЫХ кода. И который из них не работает? Второй, так даже и не компилируется. 

Заниматься расследованием никому нафиг не нужно. Нужна помощь - давайте полный код в нормальном виде.

maks12
Offline
Зарегистрирован: 13.06.2016

Спасибо, что откликнулись! Подскажите в каком направлении искать причину...  Вот с этим кодом зависает, если подключить к 7-ми сегментному дисплею. А если выводить значение переменной через Serial., то не виснет, перепробывал все библиотеки и различные значения delay(x); Может беда в коде? 

#include "TM1637.h"
#define CLK 3
#define DIO 2

TM1637 disp(CLK,DIO);
int s=0;
void setup()
{
  pinMode(7, INPUT);
  digitalWrite(7,LOW);
  disp.set(5);
  disp.init(D4056A);
}

void lcd ()
{
   disp.display(s);
}

void loop()
{
  if (digitalRead(7)==HIGH)
  {
    s=s+1;
    delay(2000);
   }
   lcd();
}

А также пробывал все делать в ОДИН цикл, все равно зависает на числах до 300., причем значение выводилось на дисплей без задержки 2000мс. При таком скетче:

if (digitalRead(7)==HIGH)
  {
    s=s+1;
    delay(2000);
    disp.display(s);
   }

Использую вот такую библиотеку: http://www.arduino.md/wp-content/uploads/library/TM1637-4-digit-display-tube.zip

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Попробуйте поставить небольшую задержку (ну, там 3-5 миллисекунд) между строками 27 и 28. Отпишитесь, что получилось.

ingi777
Offline
Зарегистрирован: 24.01.2016

не в коде дело,у Вас "импульсник",поставьте блок - кондёры по питанию сразу возле платы,и провода не больше 20 см,и всё у Вас должно получиться

maks12
Offline
Зарегистрирован: 13.06.2016

Спасибо попробую. А как именно конденсатор ставить и какой емкости?

ingi777
Offline
Зарегистрирован: 24.01.2016

по питанию ,между "общим" и "+",ёмкость (0,1 мкФ керамика)+(4,7мкФ электролит) паралельно друг-другу, и перед платой!!!!

Joiner
Offline
Зарегистрирован: 04.09.2014

Я, конечно, не очень программист..., но мне кажется что в скетче считывается HIGH. Сколько раз его посчитают ни кому не известно. Должно быть как-то HIGH, LOW, ...короче, фиксировать пару.

Мне кажется пока выполняется Delay, много чего может произойти, тех же импульсов может проскочить туева хуча, а их ни кто и не защитает.

fsdb
Offline
Зарегистрирован: 24.10.2015

вы давайте не тупите. обявили s как int, переполняется и все. ардуина перезагружается.

fsdb
Offline
Зарегистрирован: 24.10.2015

вы давайте не тупите. обявили s как int, переполняется и все. ардуина перезагружается.

maks12
Offline
Зарегистрирован: 13.06.2016

А как ее по другому объявить? Виснет при s до 300, а потом не разу не зависало, необходим подсчет максимум до 9000. Так почему же не int?

fsdb
Offline
Зарегистрирован: 24.10.2015

если вам не надо более 9000 то нужно описывать это в коде.

делей я бы вообще не использовал. millis тогда уж.

нужно оставить что то вроде этого если конечно дисплей при этом не гаснет..

 

if (digitalRead(7)==HIGH)

 

2   {
3     s=s+1;
4  
5     disp.display(s);
6    }

 

Joiner
Offline
Зарегистрирован: 04.09.2014

fsdb пишет:

если вам не надо более 9000 то нужно описывать это в коде.

делей я бы вообще не использовал. millis тогда уж.

нужно оставить что то вроде этого если конечно дисплей при этом не гаснет..

 

if (digitalRead(7)==HIGH)

 

2   {
3     s=s+1;
4  
5     disp.display(s);
6    }

 

Я вообще не въезжаю как таким скетчем можно считать? Доустим, импульс длинный а Loop шустрый. Он может один импульс за несколько посчитать. Нахрена такой счетчик? Мне кажется, что надо применить прерывания, что-то вроде attachInterrupt(0, myShetshik, FALLING); Вот тогда будет считать как положено.

maks12
Offline
Зарегистрирован: 13.06.2016

Большое спасибо за совет. Просто ситуация такая, что импульс появляется один раз в 5-10 секунд. Сейчас попробую с внешним прерыванием.

murash20
Offline
Зарегистрирован: 21.03.2016

здравстуйте. удлиннил провода до 3 метров на датчик и экран, и ардуино начало виснуть. Нашел, пришлось отдельное питание на экран дать.

#include <OLED_I2C.h>
OLED  myOLED(A4, A5, A4); // A4 - SDA , A5 - SCL
extern uint8_t RusFont[]; // Русский шрифт
extern uint8_t MegaNumbers[]; // Подключение больших шрифтов
extern uint8_t SmallFont[]; // Базовый шрифт без поддержки русскийх символов.
#include <OneWire.h>
#include <Wire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 8 // номер пина к которому подключен DS18B20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

unsigned long last_time;
unsigned long last_press;

int ledPin1 = 4;
int ledPin2 = 13;
int ledPin3 = A0;
int ledPin4 = A1;
int ledPin5 = A2;
int ledPin6 = A3;
int switchPin1 = 2;
int switchPin2 = 3;
int heatPin1 = 5;
int heatPin2 = 6;

int val1;
int val2;

int state1;
int state2;
int c;
int d;

void setup()
{

  sensors.begin(); 
  myOLED.begin();
 
  
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  pinMode(ledPin5, OUTPUT);
  pinMode(ledPin6, OUTPUT);
  pinMode(heatPin1, OUTPUT);
  pinMode(heatPin2, OUTPUT);
  pinMode(switchPin1, INPUT);
  pinMode(switchPin2, INPUT);
  digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, LOW);
  digitalWrite(ledPin4, LOW);
  digitalWrite(ledPin5, LOW);
  digitalWrite(ledPin6, LOW);
}

void loop()
{

  if(millis() - last_time > 2000)
  {
    last_time = millis();
     sensors.requestTemperatures();
     myOLED.clrScr(); // очищаем экран
     myOLED.setFont(RusFont); // Устанавливаем русский шрифт
     myOLED.print("Ntvgthfnehf", CENTER, 0); // Выводим надпись "Температура"
     myOLED.setFont(SmallFont);
     myOLED.print("CHERY A13", CENTER, 55); // вывод текста
     myOLED.setFont(MegaNumbers);
     myOLED.print(String(sensors.getTempCByIndex(0) , 1), CENTER, 11);   // Отображение температуры
     myOLED.update();
  }

 
  state1 = digitalRead(switchPin1);
  state2 = digitalRead(switchPin2);
  

  if (state1 == HIGH && c == 0 && millis() - last_press > 50) // нажали кнопку
  {
    c = 1;
    last_press = millis();
  }
  if (state1 == LOW && c == 1 ) // отпустили кнопку
  {
    val1 = ++val1;
    if (val1 == 4)
    {
      val1 = 0;
    }
    c = 0;
  }

  if (state2 == HIGH && d == 0) // нажали кнопку
  {
    d = 1;
  }
  if (state2 == LOW && d == 1) // отпустили кнопку
  {
    val2 = ++val2;
    if (val2 == 4)
    {
      val2 = 0;
    }
    d = 0;
  }
  

  if (val1 == 0) // выключаем светодиоды
  {
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, LOW);
    digitalWrite(ledPin3, LOW);
    analogWrite(heatPin1, LOW);

  }
   if (val2 == 0) // выключаем светодиоды
  {
    digitalWrite(ledPin4, LOW);
    digitalWrite(ledPin5, LOW);
    digitalWrite(ledPin6, LOW);
    analogWrite(heatPin2, LOW);

  }
  if (val1 == 1) // Если мы кнопку 1 раз нажали и отпустили
  {
    digitalWrite(ledPin1, HIGH);
    digitalWrite(ledPin2, LOW);
    digitalWrite(ledPin3, LOW);
    analogWrite(heatPin1, 85);
  }
  if (val2 == 1) // Если мы кнопку 1 раз нажали и отпустили
  {
    digitalWrite(ledPin4, HIGH);
    digitalWrite(ledPin5, LOW);
    digitalWrite(ledPin6, LOW);
    analogWrite(heatPin2, 85);
  }
  if (val1 == 2) // Если мы кнопку 2 раз нажали и отпустили
  {
    digitalWrite(ledPin1, HIGH);
    digitalWrite(ledPin2, HIGH);
    digitalWrite(ledPin3, LOW);
    analogWrite(heatPin1, 170);
  }
  if (val2 == 2) // Если мы кнопку 2 раз нажали и отпустили
  {
    digitalWrite(ledPin4, HIGH);
    digitalWrite(ledPin5, HIGH);
    digitalWrite(ledPin6, LOW);
    analogWrite(heatPin2, 170);
  }
  if (val1 == 3) // Если мы кнопку 3 раз нажали и отпустили
  {
    digitalWrite(ledPin1, HIGH);
    digitalWrite(ledPin2, HIGH);
    digitalWrite(ledPin3, HIGH);
    analogWrite(heatPin1, 255);
  }
  if (val2 == 3) // Если мы кнопку 3 раз нажали и отпустили
  {
    digitalWrite(ledPin4, HIGH);
    digitalWrite(ledPin5, HIGH);
    digitalWrite(ledPin6, HIGH);
    analogWrite(heatPin2, 255);
  }
  delay(10);


}

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

murash20 пишет:

здравстуйте. удлиннил провода до 3 метров на датчик и экран, и ардуино начало виснуть. 

Так его, этот I2C! Мало удлинил, надо удлинить ВНУТРИСХЕМНЫЙ интерфейс ещё больше - вытаскивай сразу метров на двадцать.

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

надо экранированный провод подключать и экран этого провода надо на землю подключать, и это действительно внутрисхемный интерфейс