Пн июн 09, 2014 15:35:00
Пн июн 09, 2014 17:04:32
ArtyLight писал(а):Можно просто ответить - "Нужно!"
Пн июл 14, 2014 07:40:06
Пт фев 28, 2020 14:43:56
Чт мар 05, 2020 01:55:16
Чт мар 05, 2020 02:04:22
Чт мар 05, 2020 07:40:26
АлександрЛ писал(а):Тот датчик, который вы показали- скорее всего- 6 импульсов на оборот.
Alexeyslav писал(а):Сборка схемы готовой это хорошо, но тут пахнет разработкой с нуля, начиная с теории и техзадания.
Чт мар 05, 2020 13:13:06
Чт мар 05, 2020 14:49:36
Пн мар 23, 2020 11:38:43
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4); // LCD address 0x27
volatile uint16_t impuls = 0;
uint16_t k = 3744; // 626 * 6 Количество импульсов на 1000 метров пути
uint32_t lastTime = 0;
uint32_t secTime = 0; // Суммарное количество секунд
uint32_t secTime0 = 0; // Время отсечки, [c]
float S = 0; // Расстояние от старта, [м]
float S0 = 0; // Расстояние отсечки, [м]
uint8_t buttonPin = 12; // Номер контакта кнопки отсечки (замыкать на массу)
void pinChange () // Функция обработки прерывания
{
impuls = impuls + 1;
}
void setup (){
attachInterrupt (0, pinChange, RISING); // Вызов обработчика внешних прерываний
lcd.init(); // Инициализация экрана
lcd.backlight(); // Подсветка экрана
pinMode(buttonPin, INPUT_PULLUP); // Встроенный подтягивающий (к +5В) резистор активирован
}
void loop (){
uint16_t secTime1 = 0; // Время с момента предыдущей отсечки, [с]
float S1 = 0; // Расстояние, пройденное с момента отсечки, [м]
float Ss = 0; // Расстояние, пройденное за секунду, [м]
float V = 0; // Средняя скорость, [км/ч]
float Vs = 0; // Текущая скорость, [км/ч]
float V1 = 0; // Средняя скорость отсечки, [км/ч]
while(millis() - lastTime >= 1000){
lastTime = millis();
Ss = ((float)impuls*1000)/(float)k; // Расстояние, пройденное за секунду, [м]
impuls = 0;
secTime = secTime+1;
S = S + Ss; // Расстояние от старта, [м]
V = 3600*S/lastTime; // Средняя скорость [км/ч]
Vs = 36*Ss/10; // Текущая скорость [км/ч]
showTime (12, 1, secTime); // Вызов функции вывода времени на экран (столбец первого символа, строка первого символа, количество секунд)
showTrip (10, 0, S); // Вызов функции вывода расстояния на экран (столбец первого символа, строка первого символа, расстояние)
showSpeed (0, 0, V); // Вызов функции вывода скорости на экран (столбец первого символа, строка первого символа, скорость)
showSpeed (0, 1, Vs); // Вызов функции вывода скорости на экран (столбец первого символа, строка первого символа, скорость)
/* По нажатию кнопки запоминаем время пройденного участка */
if (digitalRead(buttonPin) == LOW){
secTime1 = secTime-secTime0; // Определяем сколько прошло секунд с момента предыдущей отсечки, [с]
secTime0 = secTime; // Делаем новую отсечку времени, [с]
showTime (12, 3, secTime1); // Вызов функции вывода времени на экран (столбец первого символа, строка первого символа, количество секунд)
S1 = S - S0; // Определяем пройденное расстояние с момента отсечки, [м]
S0 = S; // Делаем новую отсечку расстояния, [м]
showTrip (10, 2, S1); // Вызов функции вывода расстояния на экран (столбец первого символа, строка первого символа, расстояние)
V1 = S1/secTime1*3.6; // Средняя скорость отсечки, [км/ч]
showSpeed (0, 3, V1); // Вызов функции вывода скорости на экран (столбец первого символа, строка первого символа, скорость)
}
}
}
/* Функция вывода времени на экран*/
void showTime (uint8_t posCol, uint8_t posRow, uint16_t secTimeShow) {
uint8_t minutes = 0;
uint8_t hours = 0;
uint8_t seconds = 0;
hours = secTimeShow/3600;
minutes = (secTimeShow-(hours*3600))/60;
seconds = secTimeShow-(hours*3600)-(minutes*60);
lcd.setCursor(posCol,posRow);
lcd.print(" ");
if (hours < 10) {
lcd.setCursor(posCol+1,posRow);
}
else {
lcd.setCursor(posCol,posRow);
}
lcd.print(hours);
lcd.setCursor(posCol+2,posRow);
lcd.print(":");
if (minutes < 10) {
lcd.setCursor(posCol+3,posRow);
lcd.print("0");
lcd.setCursor(posCol+4,posRow);
}
else {
lcd.setCursor(posCol+3,posRow);
}
lcd.print(minutes);
lcd.setCursor(posCol+5,posRow);
lcd.print(":");
if (seconds < 10) {
lcd.setCursor(posCol+6,posRow);
lcd.print("0");
lcd.setCursor(posCol+7,posRow);
}
else {
lcd.setCursor(posCol+6,posRow);
}
lcd.print(seconds);
}
/* Функция вывода скорости на экран */
void showSpeed (uint8_t posCol, uint8_t posRow, float VShow){
lcd.setCursor(posCol,posRow);
lcd.print(" ");
if (VShow < 10) {
lcd.setCursor(posCol+1,posRow);
}
else {
lcd.setCursor(posCol,posRow);
}
lcd.print(VShow);
lcd.setCursor(posCol+6,posRow);
lcd.print("km/h");
}
/* Функция вывода расстояния на экран */
void showTrip (uint8_t posCol, uint8_t posRow, float SShow){
lcd.setCursor(posCol,posRow);
lcd.print(" ");
if (SShow < 10000) {
lcd.setCursor(posCol+3,posRow);
}
else {
if (SShow < 100000) {
lcd.setCursor(posCol+2,posRow);
}
else {
lcd.setCursor(posCol+1,posRow);
}
}
lcd.print(SShow/1000);
lcd.setCursor(posCol+8,posRow);
lcd.print("km");
}