Вопрос по прошивке.
- Войдите на сайт для отправки комментариев
Вс, 18/11/2018 - 16:45
Здравствуйте!Подскажите,возникла проблема код не робит,точнее не включается дисплей.Хотя стандартное вывод "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);
}
Попробуйте Ваши функции из loop убрать в setup.
внимательно сравните 3,4-ю строки своего кода с работающим
Емаё,спасибо вам огромное!Первый мой проект,программирую на других языках давно,а на ардуино такую ошибку глупую не заметил!Спасибо ещё раз!!!!