ЖК-дисплей 16*2 не отображает мой результат
Я работаю над проектом по расчёту частоты линии методом обратного счёта с помощью Arduino. Пытаюсь вывести результат на ЖК-дисплей 16*2, но он ничего не отображает. Он просто включается и зависает. Подробности проекта я взял с этого сайта Частотомер линии на основе обратного счёта
Я модифицировал стандартную программу для работы с ЖК-дисплеем, но она не работает. Вот код, который я использую:
//Для чтения и отображения частоты линии
//используя метод обратного подсчета
//clk для «Счетчика времени» генерируется с помощью функции «Тон»
//«Счетчик времени» — это физический счетчик T1
// «Счетчик событий» — это программный счетчик
#define Fin 6 // входной контакт для сигнала частоты линии
#define clk 7 // вход для счетчика «Время»
#include<LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
boolean FState; // статус сигнала 50 Гц
int countS; // Количество сигналов
int countC=0; // Счетчик часов
int LineFreq; // Результат
void setup() {
tone(8, 5000); // генерирует опорную частоту 5000 Гц на выводе 8
pinMode(Fin, INPUT); // устанавливаем вывод Fin как INPUT
pinMode(clk, INPUT); // устанавливаем вывод clk как ВХОД
lcd.begin(16, 2);
}
void loop() {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Frequency of signal");
// чтобы избежать частичных циклов, сначала определите передний фронт
while(digitalRead(Fin)) {
//ждем состояния «0» сигнала
delayMicroseconds(10);
}
//здесь состояние '0'
while(!digitalRead(Fin)) {
//ждем состояния «1»
delayMicroseconds(10);
}
//это восходящий край плавника
//отсчёт можно начать отсюда
// очистить счетчик ВРЕМЕНИ T1
counterStart1();
//подсчитайте 50 сигналов частоты линии
while(countS<50) {
while(digitalRead(Fin)) {
//ждем состояния «0»
delayMicroseconds(1);
}
//здесь состояние '0'
while(!digitalRead(Fin)) {
//ждем состояния «1»
delayMicroseconds(1);
}
// здесь состояние «1»
// здесь один цикл только что закончился
//увеличиваем счетчик событий
countS=countS+1;
}
//здесь 50 циклов сигнала
// прочитать содержимое T1 и вычислить частоту
countC = getCount1();
LineFreq = 25000000/countC;
//отправить на дисплей
lcd.setCursor(0,1);
lcd.print(LineFreq);
lcd.print(" Hz");
delay(500);
delay(100);
// очистить счетчик
countS=0;
// повторить
}
//Следующий код взят из онлайн-статей, находящихся в открытом доступе
void counterStart1() {
// настройка аппаратного счетчика для 16-битного таймера/счетчика Timer1
TCCR1A=0; // сброс регистра управления таймером/счетчиком A
TCCR1B=0; // сброс регистра управления таймером/счетчиком B
TCNT1=0; // инициализируем значение счетчика 0; этот регистр хранит текущий счет
// устанавливаем аппаратный таймер/счетчик 1 как счетчик; он считает события на выводе Tn (вывод 5 Arduino)
TCCR1B = TCCR1B | 7; // Источник тактового сигнала счетчика = контакт Tn (контакт 5 Arduino), начинаем отсчет сейчас
// 7 в двоичном коде — это 0111; операция ИЛИ установит CS10, 11, 12 в 1
return;
}
// следующий код получен из онлайн-статей в открытом доступе
// Подпрограмма для получения текущего счетчика
unsigned int getCount1() {
unsigned int count; // эта переменная возвращает текущий счет из счетного регистра
TCCR1B = TCCR1B & ~7; // Затвор выключен / Счетчик T1 остановлен,
// эта операция очищает биты (CS10,11,12)
count = TCNT1; // прочитать регистр счета
TCCR1B = TCCR1B | 7; // перезапускаем счет, сбросив биты (CS10,11,12)
return count; // вернуть полученное значение счетчика в вызывающую функцию
}
У меня пустой экран, но самая первая строка кода «Частота сигнала» печатается правильно.
Что не так с кодом и какие изменения мне нужно внести?
Заранее спасибо!
@Joy Mukherjee, 👍0
Обсуждение1 ответ
Ваши переменные — это int, которые в Arduino по умолчанию являются 2-байтовыми знаковыми типами и имеют диапазон от -32768 до 32767.
Когда вы выполняете:
LineFreq = 25000000/countC;
Результат вычисления — 2-байтовое int или 4-байтовое long? В любом случае, вы, вероятно, присваиваете 4-байтовое значение int.
Вы можете объявить LineFreq как тип long, а также добавить L в конец константы 25000000, чтобы принудительно применить математику long, так что у вас получится:
long LineFreq;
[...]
LineFreq = 25000000L/countC;
- Печать string and integer LCD
- Отправка значения с одного Arduino на другой
- ЖК-дисплей I2C отображает странные символы
- Экран LCD 16*02 I2C показывает только первый напечатанный символ
- Запрограммируйте Arduino Uno как цифровые часы
- Чтение SMS с помощью Arduino Uno и SIM800L и печать на LCD (16x2 буквенно-цифровых) с использованием последовательного соединения
- ЖК-дисплей странные символы
- 16*2 1602A LCD дисплей не отображает никаких символов или контрастности, несмотря на правильное подключение
Что происходит? Ничего не отображается или отображается только «Частота сигнала»?, @Gerben
Я исправил отступ, так как его было практически невозможно читать., @Gerben
В последнем случае, похоже, сигнал на контакте 6 отсутствует или слишком слабый. В итоге ваш код ожидает 50 переходов, которых просто нет?, @Gerben
Он отображает только частоту сигнала, указанную в начале кода. После этого ничего не работает. Я проверил сигнал на выводе 6, и он работал нормально., @Joy Mukherjee