Вопрос по прошивке.

Puga
Offline
Зарегистрирован: 18.11.2018


Здравствуйте!Подскажите,возникла проблема код не робит,точнее не включается дисплей.Хотя стандартное вывод "Hello",работает.

Этот код работает. #include <TM1637.h>
#define CLK 0
#define DIO 1
TM1637 tm1637(CLK, DIO);

void setSegments(byte addr, byte data)
{
tm1637.start();
tm1637.writeByte(ADDR_FIXED);
tm1637.stop();
tm1637.start();
tm1637.writeByte(addr|0xc0);
tm1637.writeByte(data);
tm1637.stop();
tm1637.start();
tm1637.writeByte(tm1637.Cmd_DispCtrl);
tm1637.stop();
}

void setup() {
tm1637.init();
tm1637.set(6);
}

void loop() {
// Вывод Hello
setSegments(0, 118);
setSegments(1, 121);
setSegments(2, 54);
setSegments(3, 63);
delay(500);
}

А вот этот нет.


#include <TM1637.h>

#define CLK 1   // Пин дисплея
#define DIO 0   // Пин дисплея
#define START_PIN 1   // Аналоговый пин старта
#define END_PIN 1     // Аналоговый пин финиша
#define START_LEV 50 // Порог срабатывания старта
#define END_LEV 50   // Порог срабатывания финиша
#define TIMEOUT 10000 // Время ожидания финиша в микросекундах
#define BULLET_WEIGHT 0.00051 // Масса пули в килограммах (для вычисления энергии)
#define ENCODER_DIST 0.1      // Расстояние между датчиками в метрах (10см = 0.1м)
#define SHOW_DELAY 3000       // Время показа результата

// Для ускорения analogRead
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

// Служебные переменные
int prevVal, curVal;
unsigned long startTime, endTime;
TM1637 tm1637(CLK, DIO);

/* Переделанная функция TM1637::display(), которая позволяет зажигать отдельные сегменты
 * Нумерация сегментов: младший бит - верхний сегмент и т.д. по часовой стрелке
 * Центральный сегмент - старший бит */
void setSegments(byte addr, byte data)
{
  tm1637.start();
  tm1637.writeByte(ADDR_FIXED);
  tm1637.stop();
  tm1637.start();
  tm1637.writeByte(addr|0xc0);
  tm1637.writeByte(data);
  tm1637.stop();
  tm1637.start();
  tm1637.writeByte(tm1637.Cmd_DispCtrl);
  tm1637.stop();
}

// Инициализация
void setup() {
  // Устанавливаем prescaler на 8 для ускорения analogRead
  cbi(ADCSRA,ADPS2);
  sbi(ADCSRA,ADPS1);
  sbi(ADCSRA,ADPS0);
  
  // Инициализация дисплея
  tm1637.init();
  tm1637.set(6);
  // Отображение приветствия
  setSegments(0, 118);
  setSegments(1, 121);
  setSegments(2, 54);
  setSegments(3, 63);
  delay(1000);
}

// Главный цикл
void loop() {
  // Заставка ожидания
  showReady();  
  // Ожидание старта
  curVal = analogRead(START_PIN);
  do
  {
     prevVal = curVal;
     curVal = analogRead(START_PIN);
  } while (curVal - prevVal < START_LEV);
  startTime = micros();

  // Ожидание финиша
  curVal = analogRead(END_PIN);
  do
  {
     prevVal = curVal;
     curVal = analogRead(END_PIN);
     // Если превышен интервал ожидания - показ ошибки и выход из цикла
     if (micros() - startTime >= TIMEOUT) { showError(); return; }
  } while (curVal - prevVal < END_LEV);
  endTime = micros();

  // Вычисление и отображение результата
  showResult();
}

// Отображение заставки ожидания выстрела
void showReady()
{
  setSegments(0, 73);
  setSegments(1, 73);
  setSegments(2, 73);
  setSegments(3, 73);
  delay(100);
}

// Вычисление и отображение скорости, энергии пули
void showResult()
{
  // Вычисление скорости пули в м/с и вывод на дисплей
  float bulletSpeed = ENCODER_DIST * 1000000 / (endTime - startTime);
  tm1637.display(0, (int)bulletSpeed / 100 % 10); 
  tm1637.display(1, (int)bulletSpeed / 10 % 10);
  tm1637.display(2, (int)bulletSpeed % 10);
  setSegments(3, 84);
  delay(SHOW_DELAY);
  
  // Вычисление энергии в джоулях и вывод на дисплей
  float bulletEnergy = BULLET_WEIGHT * bulletSpeed * bulletSpeed / 2;
  tm1637.point(1); // Вместо точки ':' - костыль, но пойдет)
  tm1637.display(0, (int)bulletEnergy / 10 % 10);
  tm1637.display(1, (int)bulletEnergy % 10);
  tm1637.display(2, (int)(bulletEnergy * 10) % 10);
  setSegments(3, 30);
  delay(SHOW_DELAY);
  tm1637.point(0);
}

// Вывод ошибки при превышении времени ожидания пули
void showError()
{
  setSegments(0, 121);
  setSegments(1, 80);
  setSegments(2, 80);
  setSegments(3, 0);
  delay(SHOW_DELAY);
}

 

IVAN222
Offline
Зарегистрирован: 19.04.2017

Попробуйте Ваши функции из loop убрать в setup.

gfx125
Offline
Зарегистрирован: 27.05.2017

внимательно сравните 3,4-ю строки своего кода с работающим

Puga
Offline
Зарегистрирован: 18.11.2018

Емаё,спасибо вам огромное!Первый мой проект,программирую на других языках давно,а на ардуино такую ошибку глупую не заметил!Спасибо ещё раз!!!!