This is an old revision of the document!


Arduino Examples

Näide 1 Digital I/O

Näide 1.1 Push down button to light up LED

/*
Nimetus: Näide #1.1 Digitaalsed sisend-väljundid
Kirjeldus: Programm demonstreerib nupu ja LED-i kasutamist
Autor: Raivo Sell
Kuupäev: 15.01.2013
*/
// Constants
const int nupp = A0; // Viik kuhu on ühendatud nupp
const int LED = 13; // Viik kuhu on ühendatud nupp roheline LED 
// Global variables
int NupuOlek = 0; // Button state 
 
void setup() { 
  pinMode(LED, OUTPUT); // define LED pin as output
  pinMode(nupp, INPUT); // define button pin as input
  digitalWrite(nupp, HIGH); // turn on internal pull-up resistor on button pin
}
 
void loop(){
  NupuOlek = digitalRead(nupp); // read current button state to variable
  if (NupuOlek == HIGH) { // if button state is high (+5 V) 
    digitalWrite(LED, LOW); // turn LED off
  } 
  else { // if button state is not high (GND) 
    digitalWrite(LED, HIGH); // turn led on
  }
}

Näide 1.2 On button push LED turns of for 1 second

// First part of code copy from example #1.1
void loop(){
  if (digitalRead(nupp) == LOW) { // if button state is high (+5V)
    digitalWrite(LED, HIGH); // turn on LED 
    delay(1000); // wait 1 second (1000 milliseconds)
  } 
  digitalWrite(LED, LOW); // turn LED off
}

Näide 1.3 LED turns on on button release

// First part of code copy from example #1.1
void loop(){
  if (digitalRead(nupp) == LOW) { // if button pressed 
    while (digitalRead(nupp) == LOW){} // wait for button release
    digitalWrite(LED, HIGH); // turn on LED
  } 
}

Task #1.1

Modify example program so that LED blinks three times.

Task #1.2

Modify example program so that on button press LED starts to blink with 1 second intervals. On second button press led stops blinking.

Näide #2 Analog inputs

Näide #2.1 When exceeding potentiometer threshold value the LED turns on

/*
Nimetus: Näide #2.1 Analoog inputs
Kirjeldus: Programm demonstreerib analoogsisendi kasutamist
Autor: Raivo Sell
*/
 
// Set threshold value at which the LED turns on
const int nivoo = 512; 
 
int pote_sisend = A1; // set potentiometer input pin
int led = 13; // set LED pin
int pote = 0; // integer variable to hold potentiometer value
 
void setup() {
  pinMode(led, OUTPUT); // set LED pin to output
}
 
void loop() {
  pote = analogRead(pote_sisend); // read Analog input value
  // if value is greater than threshold then turn on LED
  if (pote>nivoo) digitalWrite(led, HIGH);
  else digitalWrite(led, LOW); // other cases turn LED off
}

Näide #2.2 LED blinking speed depends on potentiometer value

/*
Nimetus: Näide #2.2 Analoog sisendi teisendamine ajaks
Kirjeldus: Programm demonstreerib analoogsisendi kasutamist
Autor: David Cuartielles
Täiendused: Tom Igoe
Kohandused: Raivo Sell
OriginaalURL: http://arduino.cc/en/Tutorial/AnalogInput
*/
 
int pote_sisend = A1; // set potentiometer pin
int led = 13; // set LED pin
int pote = 0; // integer variable to hold potentiometer value
 
void setup() {
  pinMode(led, OUTPUT); // define LED pin as output
}
void loop() {
  pote = analogRead(pote_sisend); // read potentiometer value and write into variable
  digitalWrite(led, HIGH); // turn off LED
  delay(pote); // generate delay <sensorValue> milliseconds 
  digitalWrite(led, LOW); // turn on LED
  delay(pote); // generate delay <sensorValue> milliseconds
}

Harjutus #2

Modify example program so that its possible to change LED brifgtness with potentiometer. Use delay functions.

Näide #3 LCD

Näide #3.1 LCD using

/*
Nimetus: Näide #3.1 LCD kasutamine
Kirjeldus:Kasutab LiquidCrystal.h teeki ja ITEAD Studio 2x16 teksti laiendusplaati
Autor: Tom Igoe 
Modifikatsioon: Raivo Sell
Kuupäev: 4.06.2014
Versioon: 1.0
*/
 
#include <LiquidCrystal.h> // include needed libraries
 
// Initialize LCD
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
 
void setup() {
  lcd.begin(16, 2); // set LCD cursor column and row
  lcd.print("Tere Tallinn!"); // Print text on LCD
}
 
void loop() {
 
  lcd.setCursor(0, 1); //set cursor position to first row and column 0 (1. rida on indeksiga 0)
 
  lcd.print(millis()/1000); // Print sensor value to LCD
 
}

Näide #3.2 LCD and analog inputs

/*
Nimetus: Näide #3.2 LCD kasutamine analoogsisendiga
Kirjeldus: 
          Kasutab LiquidCrystal.h teeki ja ITEAD Studio 2x16 teksti laiendusplaati
Autor: Tom Igoe 
Modifikatsioon: Raivo Sell
Kuupäev: 4.06.2014
Versioon: 1.0
*/
 
#include <LiquidCrystal.h> // include needed library
 
// Initialize LCD
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int pote_sisend = A1; // set potentiometer pin
 
void setup() {
  lcd.begin(16, 2); // set LCD column and row
  lcd.print("Potentsiomeeter"); // Print out sensor name on LCD
}
 
void loop() {
 
  lcd.setCursor(0, 1); //set cursor position first row and column 0 (1. rida on indeksiga 0)
  lcd.print(analogRead(pote_sisend)); //Print out potentiometer value to LCD
  lcd.print("    "); //Print out empty spaces 
  delay (100);  
}

Harjutus #3.1

Make a program that on button press changes LCD row. Potentiometer value has to be printed only on the new row.

Näide 4 Andurid ja LCD

Näide #4.1 Temperatuuri andur koos matemaatika teegiga

/*
Nimetus: Näide #4.1 Temperatuuri andur koos matemaatika teegiga
 
 
Kirjeldus: 
          Kasutab Steinhart-Hart termistori valemit:
          temperatuur kelvinites = 1 / {A + B[ln(R)] + C[ln(R)]^3}
          kus A = 0.001129148, B = 0.000234125 ja C = 8.76741E-08
Autor: Milan Malesevic and Zoran Stupic 
Modifikatsioon: Raivo Sell
Kuupäev: 15.01.2013/4.06.2014
Versioon: 1.1
*/
 
// Kaasame vajalikud teegid
#include <math.h>
#include <LiquidCrystal.h>
 
// Initsialiseerime LCD koos vastavate viikude ühendamisega
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int andur = A4; // määrame potentsiomeetri sisendviigu
 
void setup() {
  lcd.begin(16, 2); //Määrame LCD read ja veerud
  lcd.print("Temperatuur"); // Trükime tervitusteksti
  delay (1000);
}
 
void loop() {
 Termistor(analogRead(andur)); // Käivitame funktsooni
 delay(1000); // Ootame 1 sek.
 lcd.clear(); // Puhastame ekraani vanadest andmetest
}
 
void Termistor(int RawADC) {
   double Temp;
   long Takistus;
  // Valem: Takistus = (1024 * JaguriTakisti/ADC) - JaguriTakisti 
  Takistus=((10240000/RawADC) - 10000);    
 
  //Esimene rida
  lcd.setCursor(0, 0);
  lcd.print("AD=");
  lcd.print(RawADC); //Trükime analoogsisendi väärtuse
 
  lcd.setCursor(8, 0);
  lcd.print("U=");
  lcd.print(((RawADC*5.0)/1024.0),3);  //Trükime pinge väärtuse
 
 
  //Teine rida
  lcd.setCursor(0, 1);
  lcd.print("R=");
  lcd.print(Takistus); //Trükime takistuse väärtuse
 
  Temp = log(((10240000/RawADC) - 10000));
  Temp = 1/(0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp))* Temp);
  Temp = Temp - 273.15; // Konverteeri Kelvinid Celciustesse
 
  lcd.setCursor(8, 8);
  lcd.print("T=");
  lcd.print(Temp); //Trükime temperatuuri väärtuse
 
}

Näide #4.2 Kaugusandurid

// Reading analog and digital sensors
void setup() 
{ 
  // For visualization we can use serial monitor
  Serial.begin(9600);
} 
 
void loop() 
{ 
  // Read the input on analog pin 0 and digital pin 10:
  int AnalogSensorValue = analogRead(A0);
  int DigitalSensorValue = digitalRead(10);
 
  Serial.println(AnalogSensorValue); // Print out the analog value
  Serial.println(DigitalSensorValue); // Print out the digital value
 
  delay(500); // Delay in between readings for readability
}

Harjutus #4.1

Modifitseerida programmi nii, et potentsiomeetriga määratakse temperatuuri nivoo, mis salvestatakse nupuga programmi mällu ja selle nivoo hilisemal ületamisel käivitatakse täiturmehhanism (milleks on LED).

Harjutus #4.2

Kombineerida LED-i heleduse programm ja eelnev temperatuuri juhtimise programm, kus LED-i heledus sõltub sellest, kui palju nivootemperatuuri ületati (1 kraad: heledus 25 %, 2 kraadi: heledus 50 %, 3 kraadi: heledus 75 % ja 5 kraadi: heledus 10

Näide #5 Mootor

Näide #5.1 Servomootor

#include <Servo.h> 
 
Servo right_motor,left_motor;  // create servo object to control a servo 
 
void setup() 
{ 
  right_motor.attach(11);  // attaches the servo on pin 11
  left_motor.attach(12);  // attaches the servo on pin 12
} 
 
void loop() 
{ 
    // Control servo with value 0-180. 90 means that servo stands still
    right_motor.write(0);  // 0 - Servo with maximum speed backward
    left_motor.write(180); // 180 - Servo with maximum speed forward
}

Näide #5.2 Potentsiomeetriga juhitav servomootor

#include <Servo.h> 
Servo right_motor,left_motor;  // create servo object to control a servo 
 
void setup() 
{ 
  while (digitalRead(10)==1){}; // Question - What this row does?
  right_motor.attach(11);  // Attaches the servo on pin 11 
  left_motor.attach(12);  // Attaches the servo on pin 12
} 
 
void loop() 
{ 
  int AnalogSensorValue = analogRead(A0); // Read front sensor value
  // Compare it with reference
  if (AnalogSensorValue>500) { // If TRUE
     left_motor.write(0);  // Reverse one motor
     delay(750); // Wait until turn is enough
   }
    right_motor.write(0);    // Drive forward
    left_motor.write(180);   // Drive forward
 
}

Harjutus #5.1

Luua programm, mis võimaldab servomootori positsiooni muuta vastavalt nuppudega seadistatud suurusele.

Harjutus #5.2

Luua programm, mis servomootori baasil ehitatud radariga ja fotoanduriga leiaks ruumist kõige eredama punkti.

Näide 6 Kommunikatsioon

Näide #6.1 Jadaliides

/*
Nimetus: Näide #6.1 Jadaliides
*/
#include <math.h>
int NTC_sisend = A2; // määrame temperatuurianduri sisendviigu
void setup() {
 Serial.begin(9600);
}
 
void loop() {
 Termistor(analogRead(NTC_sisend)); // Käivita funktsoon
 Serial.println(""); // Tekita reavahetus
 delay(1000); // Oota 1 sek.
}
 
double Termistor(int RawADC) {
   double Temp;
   long Takistus;
  // Valem: Takistus = (1024 * JaguriTakisti/ADC) - JaguriTakisti 
  Takistus=((10240000/RawADC) - 10000);    
 
  Serial.print("ADC: "); 
  Serial.print(RawADC); 
  Serial.print("/1024"); // Prindi ADC tulemus
  Serial.print(", Pinge: "); 
  Serial.print(((RawADC*5.0)/1024.0),3); 
  Serial.print(" volti"); // Prindi pinge
  Serial.print(", Takistus: "); 
  Serial.print(Takistus); 
  Serial.print(" oomi");
 
  Temp = log(((10240000/RawADC) - 10000));
  Temp = 1/(0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp))* Temp);
  Temp = Temp - 273.15; // Konverteeri Kelvinid Celciustesse
  Serial.print(", Temperatuur: "); 
  Serial.print(Temp); 
  Serial.print(" kraadi C");
  return Temp;
}

Harjutus #6

Luua programm, mis jadaliidesest saadetud teksti kirjutaks LCD ekraanile. Märk „+“ vahetab rida ning märk „-“ kustutab kogu ekraani.

Praktiline projekt #1

Luua programm, mis temperatuurinivoo ületamisel muudab õhuklapi asendit (servo mootor). Temperatuurinivoo määratakse potentsiomeetriga. Õhuklapi asend sõltub temperatuuri erinevusest. Iga temperatuuri kraad, mis ületab nivood lisab klapi nurga 25%. Lüliti katkestab igal ajahetkel süsteemi töö (hädastop) ja viib klapi algasendisse tagasi, jättes punase LED-i vilkuma. Edasijõudnud võivad kasutada katkestust.

Praktiline projekt #2

Ventilaatori juhtimine XRF kaudu. Luua programm, mis suudab XRF raadiomooduliga lugeda kaugmoodulilt temperatuuri ning kui temperatur ületab kohalikul kontrolleril seatud nivoo käivitatakse kaugmoodulil asetsev ventilaator. Suhtkuseks kaugmooduliga tuleb kasutada allolevat protokolli:

  • xTEMP – tagastab kümnekordse temperatuuri Celsiuse kraadides (24,5C puhul saadetakse 245)
  • vastus: xNNN
  • xFANn – FAN1 käivitab ventilaatori, FAN0 peatab ventilaatori
  • vastus xFANn

Protokollis tähistab „x“ kohaliku seadme numbrit, mille annab juhendaja igale tiimile erineva.

en/arduino.1449752945.txt.gz · Last modified: 2020/07/20 09:00 (external edit)
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0