Короче, благодарю всех неравнодушных, а отдельно- камрада EVGTA, за помощь и терпеливое объяснение. Дальше уже более простой допилинг. Буду язык осваивать, а то бейсик тут не особо помогает.
Ну и ладно. Это не баг это фича. Хотя, в строке 31 надо написать Если микрос меньше двух миллионов тогда ааа равно нулю.
Эта строка дает задержку перед обнулением счетчика, как я понял. Игрался со значениями- менялась задержка. Я про 30. 31 вписал- появилась 2 сек. задержка перед началом отсчета, 1973 уже нет.
нужно наверное затирание "старых" цифр сделать или строку 37 раскоментировать
Насчет затирания- может быть, а строку раскомментировать точно не нужно- тут очистка экрана работает с дикой задержкой ака delay(500) или даже побольше.
А вообще с этим дисплеем не работал и не знаю что ему надо,
Но и вывод данных на дисплей в каждом цикле это неправильно, надо выводить данные только тогда когда они (данные) изменились по сравнению с предыдущими
В принципе через функцию это делается элементарно.
Сначала создаём функцию например "disp"
Переносим в нее из цикла строки связанные с дисплеем.
Вместо строк дисплея в цикле ставим вызов функции.
Проверяем работу.
Выкладываем скетч сюда.
Ознакомиться с функциями можно тут http://arduino.ru/Reference
Тогда начинаем удалять лишнее. Ааа делаем ансигнед инт И печать просто много пробелов не решает проблему ? В строке 36 убрать умножить на 2 А в строке 32 поставить 60000000 Вместо инт xxx, поставить булеан xxx Строчку 34 пока заккоментить А в строке 33 написать если микрос минус vr1 больше 500000 или микрос минус vr2 больше 500000 тогда ааа равно нулю В строке 27,28 стереть bbb=vr1 Кстати в библиотеке дисплея нет команды печати в новой строке? Типа println?
#include <DigisparkOLED.h> // Подключил библиотеку OLED- дисплея
#include <Wire.h>
const int dath= 1;
boolean xxx=0;
unsigned long vr1;
unsigned long vr2;
unsigned long TpperUP;
unsigned long TpperDOWN;
unsigned long Tpper;
unsigned int aaa = 0;
unsigned long bbb;
unsigned long prev=0;
void setup() {
pinMode(dath, INPUT); // задал пин сенсора как вход
oled.begin(); // Работаю с дисплеем
oled.clear();
oled.setFont(FONT8X16);
oled.setCursor(38, 0);
oled.print("DIGITAL");
oled.setCursor(25, 2);
oled.print("TACHYMETER");
}
void loop() {
if (digitalRead(dath)==HIGH &&xxx ==0){vr1=micros();xxx=1;}
if (digitalRead(dath)==LOW &&xxx ==1){vr2=micros();xxx=0;}
if (xxx==1){TpperUP=vr1-vr2;}
if (xxx==0){TpperDOWN=vr2-vr1;}
Tpper=(TpperUP+TpperDOWN);
aaa=60000000/Tpper;
if (micros() - vr1>500000) {aaa = 0;}if (micros() - vr2>500000) {aaa = 0;}
//if (micros() <5000000) {aaa = 0;}// !!!
oled.setCursor(60, 6);
oled.print((aaa));
if (aaa<100) {oled.print(" ");}
if (aaa>=100&&aaa<1000) {oled.print(" ");}
if (aaa>=1000&&aaa<10000) {oled.print(" ");}
}
Зависает через секунд 10 на одном значении.
println не работает. oled.setCursor(60, 6) задает точку начала печати. 60 пикселей слева и 6 строка сверху. Кол-во строк зависит от величины шрифта.
А вот выводит только тогда когда изменились данные, но если они меняются чаще чем 20 раз в секунду один фиг не увидишь поэтому не чаще 50000 микросекунд
наверное должно работать
#include <DigisparkOLED.h> // Подключил библиотеку OLED- дисплея
#include <Wire.h>
const int dath= 1;
boolean xxx=0;
unsigned long vr1;
unsigned long vr2;
unsigned long TpperUP;
unsigned long TpperDOWN;
unsigned long Tpper;
unsigned int aaa = 0;
unsigned int ccc = 0;
unsigned long ddd=0;
void setup() {
pinMode(dath, INPUT); // задал пин сенсора как вход
oled.begin(); // Работаю с дисплеем
oled.clear();
oled.setFont(FONT8X16);
oled.setCursor(38, 0);
oled.print("DIGITAL");
oled.setCursor(25, 2);
oled.print("TACHYMETER");
}
void loop() {
if (digitalRead(dath)==HIGH &&xxx ==0){vr1=micros();xxx=1;TpperUP=vr1-vr2;}
if (digitalRead(dath)==LOW &&xxx ==1){vr2=micros();xxx=0;TpperDOWN=vr2-vr1;}
Tpper=(TpperUP+TpperDOWN);
aaa=60000000/Tpper;
if (micros() - vr1>500000 || micros() - vr2>500000) {aaa = 0;}
//if (micros() <5000000) {aaa = 0;}// !!!
if (aaa != ccc) {if (micros()-ddd>50000){disp();}}
}
void disp(){
oled.setCursor(60, 6);
oled.print((aaa));
if (aaa<100) {oled.print(" ");}
if (aaa>=100&&aaa<1000) {oled.print(" ");}
if (aaa>=1000&&aaa<10000) {oled.print(" ");}
ccc=aaa;
ddd = micros();
}
Исправил, изменений нет.
Исправил, изменений нет.
А в 27 и 28 где bbb=vr1 и vr2 ?
И скетч снова выложить
Так?
Сейчас при старте 1, что явно лучше 1972))
Еще допилил.
Сейчас думки насчет сброса при отсутствии импульсов более 5 секунд.
Не так. Строчку с микрос обратно верни.
И не vb1=bbb a bbb=vb1
А не одно ли и то же это равенство?
И какую именно строчку?
Сменил- отсчет встал.
В 27 и 28 ты стёр vb1=micros(). Не надо это стирать.
А есть ли разница у Васи пять яблок или Вася у пяти яблок?
Прикольная аллегория)) Сейчас верну.
Вернул vb1=micros(), стало 1973 при старте.
Прикольная аллегория)) Сейчас верну.
Да
Где Вася и где яблоки? Когда местами поменяешь?
29 строка лишняя
Меняю- при старте вместо 1 вижу 1973.
29 точно лишняя.
Скетч покажи
При старте на секунду вываливается 1973 (что не критично), потом нормальный отсчет, при отсутствии импульсов более 0.5 сек отсчет становится на 0.
По-моему, все заработало.
Ну и ладно. Это не баг это фича.
Хотя, в строке 31 надо написать
Если микрос меньше двух миллионов тогда ааа равно нулю.
Короче, благодарю всех неравнодушных, а отдельно- камрада EVGTA, за помощь и терпеливое объяснение. Дальше уже более простой допилинг. Буду язык осваивать, а то бейсик тут не особо помогает.
Эта строка дает задержку перед обнулением счетчика, как я понял. Игрался со значениями- менялась задержка. Я про 30. 31 вписал- появилась 2 сек. задержка перед началом отсчета, 1973 уже нет.
Нет , эта строка с момента старта микроконтроллера две секунды принудительно выводит на дисплей ноль.
Сути это не меняет. Главное- работает. Надо на дигиспарке еще обкатать, т.к. для него все это и планировалось.
Честно говоря тут не Бейсик не помогает, а проблемы с арифметикой и алгоритмизацией, наверное так правильней.
Это, наверное, возрастное))
Загнал скетч в дигиспарк- работает, но не обнуляет при отсутствии импульсов. Точнее, обнуляет только тысячи, не трогая остальные разряды...
а зачем вы
вынесли в отдельную строку? так не будет работать
эм не успел)
нужно наверное затирание "старых" цифр сделать или строку 37 раскоментировать
нужно наверное затирание "старых" цифр сделать или строку 37 раскоментировать
Насчет затирания- может быть, а строку раскомментировать точно не нужно- тут очистка экрана работает с дикой задержкой ака delay(500) или даже побольше.
Попробовать ааа объявить ансигнед Лонг?
А вообще с этим дисплеем не работал и не знаю что ему надо,
Но и вывод данных на дисплей в каждом цикле это неправильно, надо выводить данные только тогда когда они (данные) изменились по сравнению с предыдущими
В принципе через функцию это делается элементарно.
И как же это сделать?
да можно просто раз в 10 мс например. Достаточно будет
Я с калькулятора писать немогу.
Сначала создаём функцию например "disp"
Переносим в нее из цикла строки связанные с дисплеем.
Вместо строк дисплея в цикле ставим вызов функции.
Проверяем работу.
Выкладываем скетч сюда.
Ознакомиться с функциями можно тут
http://arduino.ru/Reference
MaksVV, Ваш вариант не катит- счет уходит в отрицательное значение.
Что-то мне подсказывает, что при добавлении еще одной функции скатч не влезет в 6 кб памяти (сейчас 5.25 кб).
Подтянул вход к земле и немного подпилил код- вроде все заработало. Точность пока не проверял, но при первом приближении- пойдет.
Память тиньки забита почти под завязку))
Тогда начинаем удалять лишнее.
Ааа делаем ансигнед инт
И печать просто много пробелов не решает проблему ?
В строке 36 убрать умножить на 2
А в строке 32 поставить 60000000
Вместо инт xxx, поставить булеан xxx
Строчку 34 пока заккоментить
А в строке 33 написать если микрос минус vr1 больше 500000 или микрос минус vr2 больше 500000 тогда ааа равно нулю
В строке 27,28 стереть bbb=vr1
Кстати в библиотеке дисплея нет команды печати в новой строке? Типа println?
Зависает через секунд 10 на одном значении.
println не работает. oled.setCursor(60, 6) задает точку начала печати. 60 пикселей слева и 6 строка сверху. Кол-во строк зависит от величины шрифта.
оператор ИЛИ есть http://arduino.ru/Reference
33 строка if
(micros() - vr1>500000
||micros() - vr2>500000) {aaa = 0;}
вот выводит данные только тогла когда они изменились
Заменил. Так же зависает...
А вот выводит только тогда когда изменились данные, но если они меняются чаще чем 20 раз в секунду один фиг не увидишь поэтому не чаще 50000 микросекунд
наверное должно работать
Так и виснет.
Что занчит зависает? мк неумеет зависать, что при этом горит? если только питание плохое
Последнее значение. Имхуется мне, что где-то переполнение происходит.
в протеусе на нано норм работает.
замени ааа и ссс на ансигнет лонг
может проблема в выводе на экран? там затуп?
пепеполниться ничего неможет, при переполнении просто с нуля отсчет ведется
Заменил. Эффекта не дало. Заметил реакцию на дребезг контактов- появляются заоблачные значения оборотов, после этого виснет.
в 38 строку попробовать поиграться , тк постоянный вывод на дисплей мог роль делей играть
delayMicroseconds(50);
потому что раисование антидребезга может память сожрать
еще кондер 0,1-1 мкф на ногу датчика попробовать повесить