Ви не увійшли.
Добрый день.Пытаюсь написать скетч для счётчика оборотов при помощи моторчика от CD.Вывод информации идёт на ТМ1637.Моторчик подключен к А1 и А0.На ТМ1637 вывел " 0000 ".Это всё, что получилось.Затем стал пытатся подключить моторчик, но не могу правильно написать скеч.Счёт оборотов в обе стороны.При достижении 9999 переход в 0000 и при отнимании до 0000, переход в 9999 и дальше в минус.Отдельно нужна кнопка сброса на 0000.
Чи зможете це допомогти? І скільки це буде коштувати?
Неактивний
Хотів написати іскрометний комент , але стримався
Як ви собі уявляєте відповідь, коли в запитанні ні рядку кода ні малюнка одна жалоба на життя?
Хотів написати іскрометний комент , але стримався
Як ви собі уявляєте відповідь, коли в запитанні ні рядку кода ні малюнка одна жалоба на життя?
Це те, що я зміг написати. Але зробив багато помилок, які сам знайти не можу
#include "TM1637.h"
int8_t DispMSG[] = {1, 2, 3, 4};
#define CLK 3
#define DIO 2
TM1637 tm1637(CLK, DIO);
int i=0;
int t[4]={0,0,0,0};
void num(unsigned int value){
t[3]=((value/1000)%10);
t[2]=((value/100)%10);
t[1]=((value/10)%10);
t[0]=((value/1)%10);
}
void setup()
{
tm1637.init();
pinMode(AN0,OUTPUT);
pinMode(AN1,OUTPUT);
pinMode(A0,INPUT)
tm1637.set(2);
tm1637.point(false);
tm1637.display(DispMSG);
delay(1000);
}
void loop()
{
if (digitalRead(MINUS)==LOW) ctr=0;
pinMode(A1,OUTPUT);
digitalWrite(A1,LOW);
a=analogRead(A0);
if (a>0) ctr+=1+a/9;
pinMode(A0,OUTPUT);
digitalWrite(A0,LOW);
a=analogRead(A1);
if (a>0) ctr-=1+a/9;
updateDisplay(1);
decimal(ctr/10);
num (i);
tm1637.display(0,t[3]);
tm1637.display(1,t[2]);
tm1637.display(2,t[1]);
tm1637.display(3,t[0]);
delay(1000);
i++;
if(i>=9999);{
i=0;
}
delay(1000);
}
jokeer пише:Хотів написати іскрометний комент , але стримався
Як ви собі уявляєте відповідь, коли в запитанні ні рядку кода ні малюнка одна жалоба на життя?Це те, що я зміг написати. Але зробив багато помилок, які сам знайти не можу
#include "TM1637.h"
int8_t DispMSG[] = {1, 2, 3, 4};
#define CLK 3
#define DIO 2
TM1637 tm1637(CLK, DIO);
int i=0;
int t[4]={0,0,0,0};
void num(unsigned int value){
t[3]=((value/1000)%10);
t[2]=((value/100)%10);
t[1]=((value/10)%10);
t[0]=((value/1)%10);
}
void setup()
{
tm1637.init();
pinMode(AN0,OUTPUT);
pinMode(AN1,OUTPUT);
pinMode(A0,INPUT)tm1637.set(2);
tm1637.point(false);
tm1637.display(DispMSG);
delay(1000);
}
void loop()
{
if (digitalRead(MINUS)==LOW) ctr=0;pinMode(A1,OUTPUT);
digitalWrite(A1,LOW);
a=analogRead(A0);
if (a>0) ctr+=1+a/9;pinMode(A0,OUTPUT);
digitalWrite(A0,LOW);
a=analogRead(A1);
if (a>0) ctr-=1+a/9;updateDisplay(1);
decimal(ctr/10);num (i);
tm1637.display(0,t[3]);
tm1637.display(1,t[2]);
tm1637.display(2,t[1]);
tm1637.display(3,t[0]);
delay(1000);
i++;
if(i>=9999);{
i=0;
}
delay(1000);
}
Ось такий Траур.Готую гроші.
#include "TM1637.h"
Перш за все давайте посилання на бібліотеки, які використовуєте.
pinMode(AN0,OUTPUT); pinMode(AN1,OUTPUT);
Що за AN0 і AN1? Яка у вас платформа взагалі?
void setup() { ... delay(1000); }
Ну от навіщо в setup() ця затримка в одну секунду?
if (digitalRead(MINUS)==LOW) ctr=0; ... updateDisplay(1); ... decimal(ctr/10); ... num (i);
Де обʼявлені ці ctr, updateDisplay, decimal, num? Цей код взагалі не має компілюватись.
Неактивний
Ще б хто пояснив, що за моторчик і звідки в ньому лічильник обертів. І цей кусок коду.. Ви прикалуєтесь, ага?
АлександрК пише:#include "TM1637.h"
Перш за все давайте посилання на бібліотеки, які використовуєте.
librariesGrove_4-Digit_DisplayTM1637.h
АлександрК пише:pinMode(AN0,OUTPUT); pinMode(AN1,OUTPUT);
Що за AN0 і AN1? Яка у вас платформа взагалі?
Моя помилка, має бути А0 та А1
АлександрК пише:void setup() { ... delay(1000); }
Ну от навіщо в setup() ця затримка в одну секунду?
Навіть не знаю навіщо. Так запропонували написати. Прибрати зовсім, щоб не заважала.
АлександрК пише:if (digitalRead(MINUS)==LOW) ctr=0; ... updateDisplay(1); ... decimal(ctr/10); ... num (i);
Де обʼявлені ці ctr, updateDisplay, decimal, num? Цей код взагалі не має компілюватись.
я розумію, що написав нісенітницю. Хочу зробити правильно, але не знаю як.
Почніть з постановки задачі. Ви хочете запустити мотор в режимі лічильника обертів? Чи крутити мотор і рахувати оберти?
Якщо це щось за мотивами чогось існуючого, непогано б показати. Якщо це авторська задумка - тим більше треба її роз'яснити.
Почніть з постановки задачі. Ви хочете запустити мотор в режимі лічильника обертів? Чи крутити мотор і рахувати оберти?
Якщо це щось за мотивами чогось існуючого, непогано б показати. Якщо це авторська задумка - тим більше треба її роз'яснити.
Необхідно вважати обороти при різній швидкості обертання як в одну сторону, так і в іншу. Використовуючи моторчик, як генератор. Не можу виставити фото, пробував, не вийшло.
Ну, припустимо. чому не взяти готовий датчик, оптичний чи магнітний? Чи вам цікаво саме свій моторчик задіяти?
Якщо є референс - показуйте, якщо це авторська задумка - ви самі зможете пояснити, за рахунок чого і як воно працює. Бо я здогадуюсь, але в мене є сумніви.
Ви так і не написали, що у вас за платформа. AN0/AN1 схоже на PIC.
Необхідно вважати обороти при різній швидкості обертання як в одну сторону, так і в іншу. Використовуючи моторчик, як генератор.
Який у вас моторчик? Той, що крутить диск? Там зазвичай BLDC моторчик з двома проводами. Теоретично, в певному діапазоні швидкостей можна виділяти пульсації за допомогою алгоритмів DSP і дуже приблизно рахувати кількість обертів. Ви ж розумієте, що при повільному обертанні напруга з нього мізерна, може бути нижче рівня чутливості, а при досить великій швидкості напруга може перевищувати допустиму для ADC? До того ж, щоб працювало в обидві сторони, потрібно або додавати позитивне зміщення ззовні, або двополярний ADC.
Схоже на якесь збочення. Чому не застосувати який-небудь оптичний енкодер?
Не можу виставити фото, пробував, не вийшло.
Внизу вікна редагування є "Завантаження".
Неактивний
Без пояснень автора незрозуміло. Може, похибка його влаштовує. Може в нього аналогова частина все рішає
Я б приклеїв на вал 2 магніти і розмістив поруч 2 датчика Холла. А мотор використав в роль мотора.
Ну, припустимо. чому не взяти готовий датчик, оптичний чи магнітний? Чи вам цікаво саме свій моторчик задіяти?
Якщо є референс - показуйте, якщо це авторська задумка - ви самі зможете пояснити, за рахунок чого і як воно працює. Бо я здогадуюсь, але в мене є сумніви.
Оптичний або магнітний датчик вважає в один бік, а мені потрібно в обидві. По годинниковій плюс, а проти мінус. Коліщатко від мишки на швидкості моторчика не витримає.
>> Оптичний або магнітний датчик вважає в один бік, а мені потрібно в обидві
2 датчика, під кутом.
Мотор на малих обертах даватиме малу ерс, на великих ви можете не встигнете оцифрувати. Або потрібна нормальна аналогова частина, або більш детальне пояснення.
Ви так і не написали, що у вас за платформа. AN0/AN1 схоже на PIC.
АлександрК пише:Необхідно вважати обороти при різній швидкості обертання як в одну сторону, так і в іншу. Використовуючи моторчик, як генератор.
Який у вас моторчик? Той, що крутить диск? Там зазвичай BLDC моторчик з двома проводами. Теоретично, в певному діапазоні швидкостей можна виділяти пульсації за допомогою алгоритмів DSP і дуже приблизно рахувати кількість обертів. Ви ж розумієте, що при повільному обертанні напруга з нього мізерна, може бути нижче рівня чутливості, а при досить великій швидкості напруга може перевищувати допустиму для ADC? До того ж, щоб працювало в обидві сторони, потрібно або додавати позитивне зміщення ззовні, або двополярний ADC.
Схоже на якесь збочення. Чому не застосувати який-небудь оптичний енкодер?
Можливо, ви маєте рацію і мені потрібно переглянути ідею. Я робив виміри на обертання. При мінімальному моторчику дає 0,7 V, при махімальному близько 5 V.
Якщо знайти оптику, яка працює в обидві сторони, то це, звичайно, краще.АлександрК пише:Не можу виставити фото, пробував, не вийшло.
Внизу вікна редагування є "Завантаження".
Без пояснень автора незрозуміло. Може, похибка його влаштовує. Може в нього аналогова частина все рішає
Я б приклеїв на вал 2 магніти і розмістив поруч 2 датчика Холла. А мотор використав в роль мотора.
А як визначити обертання? За годинниковою чи проти?
Оптичний або магнітний датчик вважає в один бік, а мені потрібно в обидві.
Квадратурний покаже в обидві сторони.
Коліщатко від мишки на швидкості моторчика не витримає.
Тобто задача зводиться до вибору підходящого енкодера з необхідними механічними параметрами.
Неактивний
>> Оптичний або магнітний датчик вважає в один бік, а мені потрібно в обидві
2 датчика, під кутом.
Мотор на малих обертах даватиме малу ерс, на великих ви можете не встигнете оцифрувати. Або потрібна нормальна аналогова частина, або більш детальне пояснення.
Потрібно спробувати.
Але все одно скетч писати треба, а в мене по скетчу знань із Гулькін
за фазою імпульсів.
Звичайно, якщо крутити вал хитрим способом, то такий г***о-датчик можна обманути. Якщо це критично, треба йти до токаря, хай робить нормальний багатополюсний датчик.
>> Але все одно скетч писати треба, а в мене по скетчу знань із Гулькін
Якщо це хоббі - проект, то нормально. Заодно і вивчите.
Якщо бізнес.. Ідея датчиків з г***на і сірників мені не подобається. Нормально проектуйте, нормально робіть.
>> Але все одно скетч писати треба, а в мене по скетчу знань із Гулькін
Якщо це хоббі - проект, то нормально. Заодно і вивчите.
Якщо бізнес.. Ідея датчиків з г***на і сірників мені не подобається. Нормально проектуйте, нормально робіть.
Проект хобі, але з гівна не хочеться. На двох опто датчиках швидше за все робитиму. Залежно від рішення буде працювати один датчик.
Тоді це буде скетч для дисплея і потрібно додати два входи для оптодатчиків та один для скидання на 0
#include "TM1637.h"
int8_t DispMSG[] = {1, 2, 3, 4};
#define CLK 3
#define DIO 2
TM1637 tm1637(CLK, DIO);
int i=0;
int t[4]={0,0,0,0};
void num(unsigned int value){
t[3]=((value/1000)%10);
t[2]=((value/100)%10);
t[1]=((value/10)%10);
t[0]=((value/1)%10);
}
void setup()
{
tm1637.init();
tm1637.set(2);
tm1637.point(false);
tm1637.display(DispMSG);
}
void loop()
{
num (i);
tm1637.display(0,t[3]);
tm1637.display(1,t[2]);
tm1637.display(2,t[1]);
tm1637.display(3,t[0]);
delay(1000);
i++;
if(i>=9999);{
i=0;
}
Тоді це буде скетч для дисплея і потрібно додати два входи для оптодатчиків та один для скидання на 0
Ось ця бібліотека використовується?
uint8_t DispMSG[] = {1, 2, 3, 4};
display() приймає масив uint8_t. int8_t тут теж працюватиме, але краще одразу писати правильно.
int t[4]={0,0,0,0};
Навіщо ще один масив, тим більше int? Можна ж
void num(unsigned int value)
{
DispMSG[0]=((value/1000)%10);
DispMSG[1]=((value/100)%10);
DispMSG[2]=((value/10)%10);
DispMSG[3]=((value/1)%10);
}
Або краще так:
void num(unsigned int value)
{
for (int8_t i = 3; i>=0; i--) {
DispMSG[i] = value % 10;
value /= 10;
}
}
І замість цього
tm1637.display(0,t[3]); tm1637.display(1,t[2]); tm1637.display(2,t[1]); tm1637.display(3,t[0]);
просто
tm1637.display(DispMSG);
Хоча я б взагалі зберігав лічильник в BCD, там його ж і модифікував, наприклад так:
void inc()
{
for (int8_t i = 3; i>=0; i--) {
if (DispMSG[i] == 9) {
DispMSG[i] = 0;
} else {
DispMSG[i]++;
break;
}
}
}
void dec()
{
for (int8_t i = 3; i>=0; i--) {
if (DispMSG[i] == 0) {
DispMSG[i] = 9;
} else {
DispMSG[i]--;
break;
}
}
}
За потреби значення в unsigned int береться з нього елементарно.
Остання редакція dimich (2025-04-13 15:16:57)
Неактивний
Ок. Це демка до індикатора. Тепер зробіть щоб функції delay () там не було А також змінну з лічильником назвіть якось осмислено. Глобальна змінна І це лютий крінж.
А взагалі беріть олівець, малюйте схему, які сигнали в який момент звідки беруться і як їх потрібно обробляти. Спочатку складіть алгоритм, а закодити його нескладно. Якщо спочатку писати код, а потім намагатись зрозуміти що там не так - нічого толкового не вийде.