Neuveriteľné pokusy o záchranu vesmíru pomocou Arduina
1. úloha
Krátky popis:
Príklad programu, ktorý vypisuje informácie na sériovú linku, takže si jeho výpisy môžeme pozrieť v Serial Monitore.
a načo vlastne je tento program?
pomocou Seterovej vysielačky program vysiela čísla do zariadenia v Serene(hviezde) čim riadime výbuchy na Serene a tým udržujeme pravidelne počasia na neďalekej planéte a tým pomáhame prežiť ešte nevyvinutej civilizácii (sú zrýchlení)
Program:
void setup()
{
Serial.begin(57600); // nastavit komunikacnu rychlost seriovej linky (kolko bitov za sekundu sa prenesie)
}
int i = 0;
int j = 1;
void loop() {
if (i == 100)
{
j = -1;
}
if (i == 0)
{
j = 1;
}
Serial.print("Hello "); // tímto vipiseme hello
Serial.println(i); // tímto vipisujeme hodnotu premenej i
i = i + j;
delay(70);
}
Čo program robí? program po jednom mení čísla smerom nahor a keď čísla dosiahnu 100, mení čísla smerom nadol a keď dosiahne 0, začne od začiatku. Čísla vypisuje do sériovej linky.
Ako funguje? V každom opakovaní cyklu mení premennú i o hodnotu j, ktorá je buď 1 alebo -1 - podľa toho, či majú práve čísla rásť alebo klesať. Keď počítadlo - premenná i - dosiahne okrajovú hodnotu 100 alebo 0, tak sa zmení hodnota j.
2. úloha
Krátky popis: program ukazuje, ako sa dajú riadiť výstupy - napríklad svietiť diodou. Na výstup pošleme logickú 1 - vtedy tam bude 5V, alebo logickú 0 - vtedy tam bude 0V.
Program:
#define LED 4
void setup() {
pinMode(LED, OUTPUT);
}
void loop() {
digitalWrite(LED, HIGH);
delay(500);
digitalWrite(LED, LOW);
delay(300);
digitalWrite(LED, HIGH);
delay(500);
digitalWrite(LED, LOW);
delay(300);
digitalWrite(LED, HIGH);
delay(500);
digitalWrite(LED, LOW);
delay(700);
digitalWrite(LED, HIGH);
delay(1000);
digitalWrite(LED, LOW);
delay(300);
digitalWrite(LED, HIGH);
delay(1000);
digitalWrite(LED, LOW);
delay(300);
digitalWrite(LED, HIGH);
delay(1000);
digitalWrite(LED, LOW);
delay(700);
digitalWrite(LED, HIGH);
delay(500);
digitalWrite(LED, LOW);
delay(300);
digitalWrite(LED, HIGH);
delay(500);
digitalWrite(LED, LOW);
delay(300);
digitalWrite(LED, HIGH);
delay(500);
digitalWrite(LED, LOW);
delay(3000);
}
Kratšie riešenie:
#define LED 4
void setup()
{
pinMode(LED, OUTPUT);
}
void pismenoS()
{
for (int i = 0; i < 3; i++)
{
digitalWrite(LED, HIGH);
delay(500);
digitalWrite(LED, LOW);
delay(300);
}
delay(400);
}
void pismenoO()
{
for (int i = 0; i < 3; i++)
{
digitalWrite(LED, HIGH);
delay(1000);
digitalWrite(LED, LOW);
delay(300);
}
delay(400);
}
void loop()
{
pismenoS();
pismenoO();
pismenoS();
delay(600);
}
Čo program robí? (čo pán učitel chce počuť) vysiela signál sos
(realita) zahrieva reaktor ktorý posiela fotky z planéty Erisan (poloha sústava Arius) a vďaka tomu vieme čo sa deje kebyže toto dôležité zariadenie vypneme tak reaktor zamrzne (poloha: Mars)
Ako funguje? (čo pán učitel chce počuť) bliká LEDka raz blikne na dlho a raz na krátko a to sa vždy opakuje 3x (realita) funguje na princípe rediačného systému ktorý pochádza z planéty Avaspaj
Ako sme program zjednodušili? (čo pán učitel chce počuť) opakujúce sa časti sme nahradili cyklom a vytvorili sme nové funkcie pre odvysielanie písmena S aj O (realita) napojili sme ho na princípe rediačného
3. úloha
Krátky popis:
Program - doplniť!:
Čo program robí?
Ako funguje?
4. úloha
Krátky popis:
Program:
#define LED 13
#define IRSENSOR 10
void setup() {
Serial.begin(9600);
pinMode(IRSENSOR, INPUT);
pinMode(LED, OUTPUT);
}
void loop() {
int sensor = digitalRead(IRSENSOR);
if (sensor == 1)
{
Serial.println("click");
while (sensor == 1)
{
sensor = digitalRead(IRSENSOR);
}
digitalWrite(LED, HIGH);
delay(500);
digitalWrite(LED, LOW);
}
}
Čo program robí?
Ako funguje?
4. úloha - druhá časť
Krátky popis:
Program - nedokončený!:
#define IRSENSOR 10
#define LED 13
void setup() {
Serial.begin(9600);
pinMode(IRSENSOR, INPUT);
}
/* premenne:
kedy_sa_kliklo_prvy_raz
ci_sa_uz_raz_kliklo = 0
precitaj senzor
1. pripad: este sa nekliklo
ak sa prave kliklo
zapamataj cas do kedy_sa_kliklo_prvy_raz
nastav ci_sa_uz_kliklo na 1
pockaj, kym clovek nepusti
2. pripad: uz sa raz kliklo
ak vyprsal cas na 2. kliknutie (stopky - kedy_sa_kliklo_prvy_raz > MAX_MEDZERA_DOUBLE_CLICK)
vypis click
nastav ci_sa_uz_raz_kliklo = 0
inak ak sa kliklo znova
vypis double-click
pockaj, kym clovek nepusti
nastav ci_sa_uz_raz_kliklo = 0
*/
unsigned long kedy_sa_kliklo_prvy_raz;
int ci_sa_uz_raz_kliklo = 0;
void loop() {
int sensor = digitalRead(IRSENSOR);
if (ci_sa_uz_raz_kliklo == 0)
{
if (sensor == 1)
{
kedy_sa_kliklo_prvy_raz = millis();
ci_sa_uz_raz_kliklo = 1;
while (sensor == 1)
sensor = digitalRead(IRSENSOR);
}
}
else
{
}
if (sensor == 1)
{
Serial.println("click");
while (sensor == 1)
sensor = digitalRead(IRSENSOR);
digitalWrite(LED, HIGH);
delay(500);
digitalWrite(LED, LOW);
}
delay(300);
}
Čo program robí?
Ako funguje?
5. úloha
Krátky popis:
Program - doplniť:
Čo program robí?
Ako funguje?
6. úloha
Krátky popis: V nasom programe sme pouzili JOYstick ktorym riadime servo motor LED a bzuciak
Program:
#define JOY_X 0 // this represents pin A0
#define JOY_Y 1 // this represents pin A1
#define JOY_SW 5 // this represents pin D5
#define JOY_D4 // this represents pin D4
#include <Servo.h>
Servo s;
void setup() {
pinMode(JOY_SW, INPUT);
digitalWrite(JOY_SW, HIGH); // this turns on internal pull-up, because the switch
// has two modes: disconnected or grounded, so we have
// to make sure we read logical 1 when it is disconnected
Serial.begin(9600);
// na zaciatku zapipame
tone(3, 880, 500);
// zasvietime LED postupne slabne svetlo
for (int i = 255; i >= 0; i--)
{
analogWrite(6, i);
delay(5);
}
// pripojime servo na pin D7
s.attach(7);
// pohneme servo do krajnych poloh
s.write(1);
delay(1000);
s.write(178);
delay(1000);
// a potom do stredu
s.write(90);
delay(1000);
}
int pipa=0; // ked je pipa == 1 riadime bzuciak, servo, aj LED
void loop()
{
int x = analogRead(JOY_X);
int y = analogRead(JOY_Y);
int sw = digitalRead(JOY_SW);
if (sw==0) // ak stlacil joystick
{
// prepneme riadenie on/off
pipa = 1 - pipa;
while (sw==0) // pockame kym pusti kliknutie
{
sw = digitalRead(JOY_SW);
}
delay(50);
}
if (pipa == 1) // ak riadime
{
analogWrite(6, x / 4); // LED
tone(3, x*2, 50); // bzuciak
s.write(1+x*32/183); // servo
}
// vypiseme polohy pacok serva
Serial.print(x);
Serial.print(" ");
Serial.print(y);
Serial.print(" ");
Serial.println(sw);
delay(300);
}
Čo program robí?
Ako funguje?
Alarm:
#define MICROPHONE 1
int position;
void setup() {
Serial.begin(9600);
}
int measure_amplitude()
{
int min = 1023;
int max = 0;
for (int i = 0; i < 5000; i++)
{
int val = analogRead(MICROPHONE);
if (val > max) max = val;
if (val < min) min = val;
}
return (max - min) / 2;
}
void loop()
{
int loudness = measure_amplitude();
Serial.println(loudness);
delay(100);
if (loudness > 200)
{
for (int i = 0; i < 4; i++)
{
tone(16, 880, 500);
delay(505);
tone(16, 1760, 800);
delay(500);
}
}
}
Záznam rytmu:
#define MICROPHONE 1
int position;
void setup() {
Serial.begin(9600);
}
int measure_amplitude()
{
int min = 1023;
int max = 0;
for (int i = 0; i < 100; i++)
{
int val = analogRead(MICROPHONE);
if (val > max) max = val;
if (val < min) min = val;
}
return (max - min) / 2;
}
unsigned long kedy_tleskol = 0;
int pozicia = 0;
int rytmus[100];
void loop()
{
int loudness = measure_amplitude();
//Serial.println(loudness);
//delay(100);
if (loudness > 200)
{
if (kedy_tleskol != 0)
{
Serial.println(millis() - kedy_tleskol);
rytmus[pozicia] = millis() - kedy_tleskol;
pozicia++;
}
kedy_tleskol = millis();
delay(250);
}
else if (kedy_tleskol != 0)
{
if (millis() - kedy_tleskol > 5000)
{
Serial.println("koniec rytmu");
kedy_tleskol = 0;
for (int i = 0; i < pozicia; i++)
{
tone(16, 880, 100);
delay(rytmus[i]);
}
tone(16, 880, 100);
pozicia = 0;
}
}
}