Дописать скетч хронографа
- Войдите на сайт для отправки комментариев
Пт, 25/11/2016 - 09:05
Сделать энергонезависимую память EEROM выстрелов на 60-100 с просмотром и сброса оной
Или хотя б что б хранилась память до выключения прибора.
Serial.println();
}
flagbut = 0;
//********************* режим ввода массы пульки ***************************************
if (set == 2) { //если 2 режим
if (flagmass == 0) { //флажок чтобы показать надпись только 1 раз
Serial.print("Set the mass of bullet (gramm): "); //надпись
lcd.begin(16, 2);
lcd.print("set mass bullet");
lcd.print(mass);
flagmass = 1;
delay(1000);
}
rightstat = digitalRead(rightbut); //Читаем, что с кнопкой "Вправо"
if (rightstat == HIGH && flagbut == 0) { //Если нажата, и флаг опущен то:
flagbut = 1; //Поднять флаг кнопок
digitalWrite(13, HIGH); // зажигаем светодиод
delay(100); // ждем секунду
digitalWrite(13, LOW); // выключаем светодиод
++massset; //Увеличить переменную массы на 1
if(massset > 7) { // Если номер режима выше требуемого
massset = 0; // то отсчет начинается с нуля
}
flagbut = 0; //Опустить флаг кнопок
}
leftstat = digitalRead(leftbut); //Читаем, что с кнопкой "Влево"
if (leftstat == HIGH && flagbut == 0) { //Если нажата, и флаг опущен то:
flagbut = 1; //Поднять флаг кнопок
digitalWrite(13, HIGH); // зажигаем светодиод
delay(100); // ждем секунду
digitalWrite(13, LOW); // выключаем светодиод
--massset; //Уменьшить переменную массы на 1
if(massset < 0) { // Если номер режима ниже требуемого
massset = 7; // то отсчет начинается с конца
}
flagbut = 0; //Опустить флаг кнопок
}
delay(100); //защита от дребезга
switch (massset)
{
case 0: mass = 0.20; //Если значение massset=0, то задаем массу 0.20 гр.
lcd.begin(16, 2);
lcd.print(" Mass = ");
lcd.print(mass); //вывод значения массы на дисплей
lcd.setCursor(0, 1);
lcd.print("<-0.43 0.23->"); //Выводим предыдущее и следующее значение массы
Serial.println("Mass = ");
Serial.println(mass); //вывод значения массы в COM порт
break;
case 1: mass = 0.23; //Если значение massset=1, то задаем массу 0.23 гр.
lcd.begin(16, 2);
lcd.print("Mass = ");
lcd.print(mass); //вывод значения массы на дисплей
Serial.println("Mass = ");
Serial.println(mass); //вывод значения массы в COM порт
lcd.setCursor(0, 1);
lcd.print("<-0.20 0.25->"); //Выводим предыдущее и следующее значение массы
break;
case 2: mass = 0.25; //Если значение massset=2, то задаем массу 0.25 гр.
lcd.begin(16, 2);
lcd.print("Mass = ");
lcd.print(mass); //вывод значения массы на дисплей
Serial.println("Mass = ");
Serial.println(mass); //вывод значения массы в COM порт
lcd.setCursor(0, 1);
lcd.print("<-0.23 0.28->"); //Выводим предыдущее и следующее значение массы
break;
case 3: mass = 0.28; //Если значение massset=3, то задаем массу 0.28 гр.
lcd.begin(16, 2);
lcd.print("Mass = ");
lcd.print(mass); //вывод значения массы на дисплей
lcd.setCursor(0, 1);
lcd.print("<-0.25 0.30->"); //Выводим предыдущее и следующее значение массы
Serial.println("Mass = ");
Serial.println(mass); //вывод значения массы в COM порт
break;
case 4: mass = 0.3; //Если значение massset=4, то задаем массу 0.30 гр.
lcd.begin(16, 2);
lcd.print("Mass = ");
lcd.print(mass); //вывод значения массы на дисплей
lcd.setCursor(0, 1);
lcd.print("<-0.28 0.36->"); //Выводим предыдущее и следующее значение массы
Serial.println("Mass = ");
Serial.println(mass); //вывод значения массы в COM порт
break;
case 5: mass = 0.36; //Если значение massset=5, то задаем массу 0.36 гр.
lcd.begin(16, 2);
lcd.print("Mass = ");
lcd.print(mass); //вывод значения массы на дисплей
lcd.setCursor(0, 1);
lcd.print("<-0.30 0.40->"); //Выводим предыдущее и следующее значение массы
Serial.println("Mass = ");
Serial.println(mass); //вывод значения массы в COM порт
break;
case 6: mass = 0.4; //Если значение massset=6, то задаем массу 0.40 гр.
lcd.begin(16, 2);
lcd.print("Mass = ");
lcd.print(mass); //вывод значения массы на дисплей
lcd.setCursor(0, 1);
lcd.print("<-0.36 0.43->"); //Выводим предыдущее и следующее значение массы
Serial.println("Mass = ");
Serial.println(mass); //вывод значения массы в COM порт
break;
case 7: mass = 0.43; //Если значение massset=7, то задаем массу 0.43 гр.
lcd.begin(16, 2);
lcd.print("Mass = ");
lcd.print(mass); //вывод значения массы на дисплей
lcd.setCursor(0, 1);
lcd.print("<-0.40 0.20->"); //Выводим предыдущее и следующее значение массы
Serial.println("Mass = ");
Serial.println(mass); //вывод значения массы в COM порт
break;
}
//*************************************** Задание массы через COM порт ******************************************************
if (Serial.available() > 0) //если есть что на вход с порта
{
massstring = Serial.readStringUntil('\n'); //присвоить massstring всё что было послано в порт
flagmassset = 1; //поднять флажок
}
if (flagmassset == 1) { //если флажок поднят (приняли значение в порт)
Serial.println(massstring); //написать введённое значение
Serial.println(" ");
massstring.toCharArray(masschar, sizeof(masschar)); //перевод значения в float (десятичная дробь)
mass = atof(masschar); //всё ещё перевод
flagmass = 0; //опустить все флажки
flagmassset = 0;
initial = 0;
flagbut = 0;
set = 0; //показать приветственную надпись
}
}
//********************* режим замера скорости ***************************************
if (gap1 != 0 && gap2 != 0 && gap2 > gap1 && set == 0) { //если пуля прошла оба датчика в 0 режиме
velocity = (1000000 * (dist) / (gap2 - gap1)); //вычисление скорости как расстояние/время
energy = velocity * velocity * mass / 2000; //вычисление энергии
velocity2 = sqrt(energy * 2000 / 0.2);
digitalWrite(13, HIGH); // зажигаем светодиод
delay(100); // ждем секунду
digitalWrite(13, LOW); // выключаем светодиод
Serial.print("Shot №");
Serial.println(n); //вывод номера выстрела
Serial.print("Speed ");
Serial.print(mass);
Serial.print(" :");
Serial.println(velocity); //вывод скорости в COM
Serial.print("Energy ");
Serial.print(mass);
Serial.print(" : ");
Serial.println(energy); //вывод энергии в COM
Serial.print("Speed 0.2: ");
Serial.println(velocity2); //вывод скорости в COM
Serial.println(" ");
lcd.begin(16, 2);
lcd.print("#");
lcd.print(n);
lcd.print(" ");
lcd.print("V");
lcd.print(mass);
lcd.print("=");
lcd.print(velocity);
lcd.setCursor(0, 1);
lcd.print("E=");
lcd.print(energy);
lcd.print(" V2=");
lcd.print(velocity2);
gap1 = 0; //сброс значений
gap2 = 0;
n++; //номер выстрела +1
}
if (micros() - gap1 > 1000000 && gap1 != 0 && set != 1) { // (если пуля прошла первый датчик) И (прошла уже 1 секунда, а второй датчик не тронут)
Serial.println("FAIL"); //выдаёт FAIL через 1 секунду, если пуля прошла через первый датчик, а через второй нет
lcd.print("FAIL");
gap1 = 0;
gap2 = 0;
}
//********************* режим скорострельности ***************************************
if (set == 3) {
if (rapidflag == 0) {
Serial.println("Welcome to the fire rate test!");
Serial.println("");
lcd.begin(16, 2);
lcd.print("Fire rate test");
rapidflag = 1; //показать надпись один раз
}
if (gap1 != 0) { //если пролетели через первый датчик
rapidtime = 60 / ((float)(gap1 - lastshot) / 1000000); //расчет скорострельности выстр/мин
lastshot = gap1; //запомнить время между выстрелами
Serial.println("Fire rate (shot/min): "); //вывод
digitalWrite(13, HIGH); // зажигаем светодиод
delay(100); // ждем секунду
digitalWrite(13, LOW); // выключаем светодиод
Serial.println(rapidtime);
Serial.println(" ");
lcd.begin(16, 2);
lcd.print("Shot/min): ");
lcd.print(rapidtime);
gap1 = 0;
}
}
delay(200); //задержка для стабильности
}
Скетч без начала и, возможно, без конца + две строки пояснений. Щас народ разберётся и поможет.
#include <LiquidCrystal.h> LiquidCrystal lcd(4, 5, 6, 7, 8, 9); //Подключаем дисплей LCD1602 const int leftbut = 10; //Сюда подключена кнопка "Влево" const int okbut = 11; //Сюда подключена кнопка "Ок" const int rightbut = 12; //Сюда подключена кнопка "Вправо" const int LED = 13; //Сюда подключен встроенный светодиод char masschar[5]; //массив символов для перевода String massstring; //строка, в которую задаётся масса в режиме выбора массы int mode, set, setmass, rapidtime, massset, setmode; //Переменные boolean initial, show, flagmass, flagmassset, flagbut, button, state, rapidflag, flagtest; //флажки int n = 1; //номер выстрела, начиная с 1 int leftstat = 0; //Задаем статус кнопки "Влево" int okstat = 0; //Задаем статус кнопки "Ок" int rightstat = 0; //Задаем статус кнопки "Вправо" float velocity, velocity2, energy; //переменная для хранения скорости float mass = 0.25; //масса снаряда в килограммах float dist = 0.1; //расстояние между датчиками в метрах volatile unsigned long gap1, gap2; //отметки времени прохождения пулей датчиков unsigned long lastshot; //Время между выстрелами void setup() { Serial.begin(9600); //открываем COM порт attachInterrupt(1, start, RISING); //аппаратное прерывание при прохождении первого датчика attachInterrupt(0, finish, RISING); //аппаратное прерывание при прохождении второго датчика pinMode(10, INPUT); //кнопка "влево" подключена сюда pinMode(11, INPUT); //кнопка "Ок" подключена сюда pinMode(12, INPUT); //кнопка "вправо" подключена сюда pinMode(13, OUTPUT); //встроенный светодиод } void start() { if (gap1 == 0) { //если измерение еще не проводилось gap1 = micros(); //получаем время работы ардуино с момента включения до момента пролетания первого датчика пулей } } void finish() { if (gap2 == 0) { //если измерение еще не проводилось gap2 = micros(); //получаем время работы ардуино с момента включения до момента пролетания второго датчика пулей } } void loop() { if (initial == 0) { //флажок первого запуска Serial.println("Press 3 to rapidity mode"); //режим измерения скорострельности Serial.println("Press 2 to mass set mode"); //режим выбора массы снаряда Serial.println("Press 1 to service mode"); //режим отладки (резисторы) Serial.println("Press 0 speed measure mode (default)"); //выход из режимов Serial.println("System is ready, shooting please"); //уведомление о том, что хрон готов к работе Serial.println(" "); int flagbut = 0; // флаг состояния int regim = 0; // Переключалка lcd.begin(16, 2); //подключаем дисплей lcd.print("System is ready"); //Выводим сообщение о готовности системы в первую строку lcd.setCursor(0, 1); //переводим курсор во вторую строку lcd.print("Shooting please"); //Выводим сообщение с предложением стрелять initial = 1; //первый запуск, больше не показываем сообщения } okstat = digitalRead(okbut); if (okstat == HIGH && flagbut == 0) { set ++; digitalWrite(13, HIGH); // зажигаем светодиод delay(100); // ждем секунду digitalWrite(13, LOW); // выключаем светодиод flagbut = 1; if(set > 3) { // Если номер режима превышает требуемого flagmass = 0; //опустить все флажки flagmassset = 0; initial = 0; flagbut = 0; rapidflag = 0; flagtest = 0; set = 0; //показать приветственную надпись } } delay(100); //защита от дребезга if (Serial.available() > 0 && set != 2) { //если есть какие буквы на вход с порта и не выбран 2 режим int val = Serial.read(); //прочитать что было послано в порт switch (val) { //оператор выбора case 48: set = 0; flagmass = 0; rapidflag = 0; initial = 0; break; //если приняли 0 то выбрать 0 режим case 49: set = 1; break; //если приняли 1 то запустить режим 1 case 50: set = 2; break; //если приняли 2 то запустить режим 2 case 51: set = 3; break; //если приняли 3 то запустить режим 3 } } //********************* режим проверки *************************************** if (set == 1) { //если 1 режим if (flagtest == 0) { //флажок чтобы показать надпись только 1 раз lcd.begin(16, 2); lcd.print("Test mode"); delay(1000); flagtest = 1; } Serial.print("sensor 1: "); Serial.println(analogRead(2)); //показать значение на первом датчике lcd.begin(16, 2); lcd.print("sensor 1: "); lcd.print(analogRead(2)); Serial.print("sensor 2: "); Serial.print(analogRead(4)); //показать значение на втором датчике lcd.setCursor(0, 1); lcd.print("sensor 2: "); lcd.print(analogRead(4)); Serial.println(); } flagbut = 0; //********************* режим ввода массы пульки *************************************** if (set == 2) { //если 2 режим if (flagmass == 0) { //флажок чтобы показать надпись только 1 раз Serial.print("Set the mass of bullet (gramm): "); //надпись lcd.begin(16, 2); lcd.print("set mass bullet"); lcd.print(mass); flagmass = 1; delay(1000); } rightstat = digitalRead(rightbut); //Читаем, что с кнопкой "Вправо" if (rightstat == HIGH && flagbut == 0) { //Если нажата, и флаг опущен то: flagbut = 1; //Поднять флаг кнопок digitalWrite(13, HIGH); // зажигаем светодиод delay(100); // ждем секунду digitalWrite(13, LOW); // выключаем светодиод ++massset; //Увеличить переменную массы на 1 if(massset > 7) { // Если номер режима выше требуемого massset = 0; // то отсчет начинается с нуля } flagbut = 0; //Опустить флаг кнопок } leftstat = digitalRead(leftbut); //Читаем, что с кнопкой "Влево" if (leftstat == HIGH && flagbut == 0) { //Если нажата, и флаг опущен то: flagbut = 1; //Поднять флаг кнопок digitalWrite(13, HIGH); // зажигаем светодиод delay(100); // ждем секунду digitalWrite(13, LOW); // выключаем светодиод --massset; //Уменьшить переменную массы на 1 if(massset < 0) { // Если номер режима ниже требуемого massset = 7; // то отсчет начинается с конца } flagbut = 0; //Опустить флаг кнопок } delay(100); //защита от дребезга switch (massset) { case 0: mass = 0.20; //Если значение massset=0, то задаем массу 0.20 гр. lcd.begin(16, 2); lcd.print(" Mass = "); lcd.print(mass); //вывод значения массы на дисплей lcd.setCursor(0, 1); lcd.print("<-0.43 0.23->"); //Выводим предыдущее и следующее значение массы Serial.println("Mass = "); Serial.println(mass); //вывод значения массы в COM порт break; case 1: mass = 0.23; //Если значение massset=1, то задаем массу 0.23 гр. lcd.begin(16, 2); lcd.print("Mass = "); lcd.print(mass); //вывод значения массы на дисплей Serial.println("Mass = "); Serial.println(mass); //вывод значения массы в COM порт lcd.setCursor(0, 1); lcd.print("<-0.20 0.25->"); //Выводим предыдущее и следующее значение массы break; case 2: mass = 0.25; //Если значение massset=2, то задаем массу 0.25 гр. lcd.begin(16, 2); lcd.print("Mass = "); lcd.print(mass); //вывод значения массы на дисплей Serial.println("Mass = "); Serial.println(mass); //вывод значения массы в COM порт lcd.setCursor(0, 1); lcd.print("<-0.23 0.28->"); //Выводим предыдущее и следующее значение массы break; case 3: mass = 0.28; //Если значение massset=3, то задаем массу 0.28 гр. lcd.begin(16, 2); lcd.print("Mass = "); lcd.print(mass); //вывод значения массы на дисплей lcd.setCursor(0, 1); lcd.print("<-0.25 0.30->"); //Выводим предыдущее и следующее значение массы Serial.println("Mass = "); Serial.println(mass); //вывод значения массы в COM порт break; case 4: mass = 0.3; //Если значение massset=4, то задаем массу 0.30 гр. lcd.begin(16, 2); lcd.print("Mass = "); lcd.print(mass); //вывод значения массы на дисплей lcd.setCursor(0, 1); lcd.print("<-0.28 0.36->"); //Выводим предыдущее и следующее значение массы Serial.println("Mass = "); Serial.println(mass); //вывод значения массы в COM порт break; case 5: mass = 0.36; //Если значение massset=5, то задаем массу 0.36 гр. lcd.begin(16, 2); lcd.print("Mass = "); lcd.print(mass); //вывод значения массы на дисплей lcd.setCursor(0, 1); lcd.print("<-0.30 0.40->"); //Выводим предыдущее и следующее значение массы Serial.println("Mass = "); Serial.println(mass); //вывод значения массы в COM порт break; case 6: mass = 0.4; //Если значение massset=6, то задаем массу 0.40 гр. lcd.begin(16, 2); lcd.print("Mass = "); lcd.print(mass); //вывод значения массы на дисплей lcd.setCursor(0, 1); lcd.print("<-0.36 0.43->"); //Выводим предыдущее и следующее значение массы Serial.println("Mass = "); Serial.println(mass); //вывод значения массы в COM порт break; case 7: mass = 0.43; //Если значение massset=7, то задаем массу 0.43 гр. lcd.begin(16, 2); lcd.print("Mass = "); lcd.print(mass); //вывод значения массы на дисплей lcd.setCursor(0, 1); lcd.print("<-0.40 0.20->"); //Выводим предыдущее и следующее значение массы Serial.println("Mass = "); Serial.println(mass); //вывод значения массы в COM порт break; } //*************************************** Задание массы через COM порт ****************************************************** if (Serial.available() > 0) //если есть что на вход с порта { massstring = Serial.readStringUntil('\n'); //присвоить massstring всё что было послано в порт flagmassset = 1; //поднять флажок } if (flagmassset == 1) { //если флажок поднят (приняли значение в порт) Serial.println(massstring); //написать введённое значение Serial.println(" "); massstring.toCharArray(masschar, sizeof(masschar)); //перевод значения в float (десятичная дробь) mass = atof(masschar); //всё ещё перевод flagmass = 0; //опустить все флажки flagmassset = 0; initial = 0; flagbut = 0; set = 0; //показать приветственную надпись } } //********************* режим замера скорости *************************************** if (gap1 != 0 && gap2 != 0 && gap2 > gap1 && set == 0) { //если пуля прошла оба датчика в 0 режиме velocity = (1000000 * (dist) / (gap2 - gap1)); //вычисление скорости как расстояние/время energy = velocity * velocity * mass / 2000; //вычисление энергии velocity2 = sqrt(energy * 2000 / 0.2); digitalWrite(13, HIGH); // зажигаем светодиод delay(100); // ждем секунду digitalWrite(13, LOW); // выключаем светодиод Serial.print("Shot №"); Serial.println(n); //вывод номера выстрела Serial.print("Speed "); Serial.print(mass); Serial.print(" :"); Serial.println(velocity); //вывод скорости в COM Serial.print("Energy "); Serial.print(mass); Serial.print(" : "); Serial.println(energy); //вывод энергии в COM Serial.print("Speed 0.2: "); Serial.println(velocity2); //вывод скорости в COM Serial.println(" "); lcd.begin(16, 2); lcd.print("#"); lcd.print(n); lcd.print(" "); lcd.print("V"); lcd.print(mass); lcd.print("="); lcd.print(velocity); lcd.setCursor(0, 1); lcd.print("E="); lcd.print(energy); lcd.print(" V2="); lcd.print(velocity2); gap1 = 0; //сброс значений gap2 = 0; n++; //номер выстрела +1 } if (micros() - gap1 > 1000000 && gap1 != 0 && set != 1) { // (если пуля прошла первый датчик) И (прошла уже 1 секунда, а второй датчик не тронут) Serial.println("FAIL"); //выдаёт FAIL через 1 секунду, если пуля прошла через первый датчик, а через второй нет lcd.print("FAIL"); gap1 = 0; gap2 = 0; } //********************* режим скорострельности *************************************** if (set == 3) { if (rapidflag == 0) { Serial.println("Welcome to the fire rate test!"); Serial.println(""); lcd.begin(16, 2); lcd.print("Fire rate test"); rapidflag = 1; //показать надпись один раз } if (gap1 != 0) { //если пролетели через первый датчик rapidtime = 60 / ((float)(gap1 - lastshot) / 1000000); //расчет скорострельности выстр/мин lastshot = gap1; //запомнить время между выстрелами Serial.println("Fire rate (shot/min): "); //вывод digitalWrite(13, HIGH); // зажигаем светодиод delay(100); // ждем секунду digitalWrite(13, LOW); // выключаем светодиод Serial.println(rapidtime); Serial.println(" "); lcd.begin(16, 2); lcd.print("Shot/min): "); lcd.print(rapidtime); gap1 = 0; } } delay(200); //задержка для стабильности }Это скетч для прибора который измеряет скорость полета пули.
Хотелось бы:
Сделать энергонезависимую память EEPROM выстрелов на 60-100 с просмотром и сброса оной
Или хотя б что б хранилась память до выключения прибора.
Извеняюсь за не полный скетч.
ссылку на скетч надо?
Да, будьте добры дайте ссылку на скетч . Заранее премного благодарен .
Полностью рабочий скетч с памятью на 100 замеров
Измеряет скорость в мс и дж
https://yadi.sk/d/S3_Av1yB3F9LCQ
Только вес пуль надо подкорректировать в скетче на нужный.
Спасибо огромадное. Завтра залью испытаю :-). Удачи вам.
Вопросы будут пишите.
Попрошу вас выложить схему разводки
https://yadi.sk/i/lzQFKIor3HQK3X
Спасибо Большое )))
Кнопки подключаются 10 11 12
Опишити функцию светодиода № 13
это светодиод на ардуино находится.
Тебе его подключать не надо.
действие происходит он мигает.