Stránka 1 z 1

Změna - z tlačítka na nepřetržité vysílání

Napsal: 20 bře 2020, 08:23
od qdj
Zdravím,

níže přikládám program a mám k němu dotaz. Program funguje tak, že po stisknutí příslušného tlačítka vyvolá akci. Chtěl bych to změnit tak, aby tuto akci (např. na pinu 5 - "reanimation") prováděl automaticky ve smyčce každé 2 sekundy. Tlačítka zůstanou, ale mají sloužit pro změnu vysílaného signálu - zmáčknu tlačítko "5" a každé dvě sekundy se vysílá signál "reanimation" do nekonečna, zmáčknu "11" a každé dvě sekundy se vysílá signál "explode" do nekonečna.

Navíc to bylo zamýšleno pro fungování na akumulátor, takže je tam funkce "sleep" - ta tam již samozřejmě není zapotřebí (odstranit, nebo netřeba řešit?).

Děkuji za pomoc

#include <avr/sleep.h>
#include <SPI.h>

unsigned int i;
volatile boolean zakazInterupt;

void Probud()
{
if (!zakazInterupt)
{
zakazInterupt = true;
//Serial.println("Vstavam!");
delayMicroseconds(5000);
//nastavím je na 1 a budu je tlačítkem přerušovat, pokud by někdo stisknul více najednou provede se to s nejnižším číslem
if (digitalRead(5) == 0){ REANIMATION(); }
else if (digitalRead(11) == 0){ EXPLODE(); }
else {}
//Prikaz();
//Paticka();
//pro případ neustále drženého tlačítka je zde delay
}
}

void Uspi()
{
Serial.println("Jdu haji!");
delay(100);
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
zakazInterupt = false;
sleep_mode(); // here the device is actually put to sleep!!
// THE PROGRAM CONTINUES FROM HERE AFTER WAKING UP
sleep_disable(); // first thing after waking from sleep:
}

void Hlavicka()
{
i = 0;
while (i != 135)
{
asm("sbi 0x05,4"); //portb bit 0
//asm("sbi 0x0B,2");
delayMicroseconds(10);
asm("cbi 0x05,4");
//asm("cbi 0x0B,2");
delayMicroseconds(10);
i++;
}

delayMicroseconds(600);
}

void N()
{
i = 0;
while (i != 34)
{
asm("sbi 0x05,4"); //portb bit 0
//asm("sbi 0x0B,2");
delayMicroseconds(10);
asm("cbi 0x05,4");
//asm("cbi 0x0B,2");
delayMicroseconds(10);
i++;
}

delayMicroseconds(600);
}

void J()
{
i = 0;
while (i != 67)
{
asm("sbi 0x05,4"); //portb bit 0
//asm("sbi 0x0B,2");
delayMicroseconds(10);
asm("cbi 0x05,4");
//asm("cbi 0x0B,2");
delayMicroseconds(10);
i++;
}

delayMicroseconds(600);
}

/*void Paticka()
{ N();N();N();J();N();J();J();J(); }
//{ J();J();J();N();J();N();N();N(); }

void Prikaz()
{ J();J();N();N();N();N();N();J(); }
//{ J();N();N();N();N();N();J();J(); }*/

void REANIMATION(){ Hlavicka();J();N();N();N();N();N();J();J();N();N();N();N();N();J();N();N();J();J();J();N();J();N();N();N(); }
void EXPLODE(){ Hlavicka();J();N();N();N();N();N();J();J();N();N();N();N();J();N();J();J();J();J();J();N();J();N();N();N(); }


void setup()
{
//Initialize serial and wait for port to open:
Serial.begin(9600);
SPI.end();

attachInterrupt(digitalPinToInterrupt(2), Probud, FALLING);

pinMode(12, OUTPUT);
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
pinMode(4, INPUT_PULLUP);
pinMode(5, INPUT_PULLUP);
pinMode(6, INPUT_PULLUP);
pinMode(7, INPUT_PULLUP);
pinMode(8, INPUT_PULLUP);
pinMode(9, INPUT_PULLUP);
pinMode(10, INPUT_PULLUP);
pinMode(11, INPUT_PULLUP);
pinMode(13, INPUT_PULLUP);

i = 0;
zakazInterupt = true;
Serial.println("START loop");
}

void loop()
{
delay(200);
Uspi();
}