zkousim svuj novy projekt, impulzem pro zacatek s Arduinem bylo prakticke vyuziti.
Zadani:
Potrebuji pustit tlacitkem ss motorek, ktery bude otacek navijeci civku. Civka na sobe ma 4 odrazky ke snimani otacek. jako snimac mam IR cidlo. po 16 otackach, chci aby se motorek vypnul a tim skoncil program.
moje potiz je, ze mi program funguje zatim tak ze bud roztocim motor a nenacitam pulsy, nebo nacitam pulsy , ale nejlze v ten moment pusti motorek.
Sanzil jsem se docilit funkcnosti pomoci attachinterrupt, pouzil jsem pin2 pro vstup z IR cidla, ale stejne mi funce interrupt nefunguje a IR cidlo nefunguje jako preruseni a nenacitaji se mi pulzy
EDIT:
asi spatne vkladam program, kdyz ho mam jen jako prilohu tak zkusim takto
Kód: Vybrat vše
#include <TM1637Display.h>
#define CLK 2
#define DIO 3
TM1637Display display(CLK, DIO);
int led = 13; // interni dioda - blika podle signalu IR prijimace
int IR = 2; // cteni IR preruseni,snimac pulsu
int tlacitko = A2; //pin s tlačítkem na start programu
int motorpin = 6; // DC motorek pripojen na pin 6
int numb=0; //display
int pres=0; //display
const int pocetder=4 //pocet der po obvode
const int pocetotacek = 37.5
const int pocetmetru = 10
int ledPin = 7; // pin, ke kterému je připojena LED ktera se rozviti po 4 impulzech (znaci jeden obeh)
int IRInterrupt = 0; // počítadlo impulzu
int buttonState = 0; // současný stav tlačítka
int lastButtonState = 0; // předchozí stav tlačítka
void setup() {
pinMode(ledPin, OUTPUT); // ukazatel dokoncene otacky
pinMode(tlacitko, INPUT_PULLUP); //start tlacitko
pinMode(led, OUTPUT); // internal LED ukazuje ze IR cidlo bylo preruseno
pinMode(IR, INPUT_PULLUP);// IR pin jako vstup.
display.setBrightness(9);
attachInterrupt(0, CteniPulzu, CHANGE);
}
void loop() {
zmackniTlacitko();
motorstart();
motorstop();
}
void CteniPulzu() {
{
buttonState = digitalRead(IR);
// porovnejte buttonState (stav tlačítka) s předchozím stavem
if (buttonState != lastButtonState) {
if (buttonState == LOW) {
IRInterrupt++;
}
}
lastButtonState = buttonState;
// zapne LED po každých čtyřech impulzech
if (IRInterrupt % pocetder == 0) {
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}
//
}
// zobrazeni poctu sepnuti IR na display
if(digitalRead(IR)==HIGH){
digitalWrite(led, HIGH); // turn the LED on to indicate impulse
while(1){
if(digitalRead(IR)==LOW){
digitalWrite(led, LOW); // turn the LED off
break; //End of the while loop,Back to the main loop
}}
}
{
display.setBrightness(0x0f);
display.showNumberDec(numb,false);
if(digitalRead(IRInterrupt % interval)==1)
{
if(pres==0)
{
numb++;
pres=1;
}
}
else
{
pres=0;
}
}
}
// --------------
void zmackniTlacitko() {
if(digitalRead(tlacitko) == LOW)
// --------------
void motorstart() {
// fade in from min to max in increments of 5 points:
//zapnuti motoru na tlacitko
for (int fadeValue = 20 ; fadeValue <= 255; fadeValue += 1) {
// sets the value (range from 0 to 255):
analogWrite(motorpin, fadeValue);
// wait for 100 milliseconds to see the dimming effect
delay(50);
}
}
// --------------
void motorstop() {
// zpomaleni a vypnuti motoru
// fade out from max to min in increments of 5 points:
for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 5) {
// sets the value (range from 0 to 255):
analogWrite(motorpin, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(30);
}
}