Аналогтық-сандық түрлендіргіш
Arduino пайдаланылатын Atmega микроконтроллерінің құрамында алты
арналы аналогтық-сандық түрлендіргіш (АСТ) бар. Түрлендіргіштің кеңейтілуі
10 битті құрайды, ол шығыста 0 ден 1023-ке дейінгі мәндерді алуға мүмкіндік
береді. Arduino-ның кӛпшілік платформалары аналогтық кірістерінің негізі
қызметі аналогтық тетіктерді оқу болып табылады, сонымен қатар, олар
енгізу/шығарудың кең ауқымды қызметіне ие (GPIO) (0-13 кіріс/шығыс сандық
порттары сияқты).
Осылайша, енгізу/шығарудың қосымша порттарын пайдалану қажеттілігі
кезінде, пайдаланылмайтын аналогтық кірістерді конфигурациялауға болады.
Аналогтық кірістерге сәйкес келетін Arduino-ның шығыстары А0 бастап
А5 дейін нӛмірленген.
Толықтырулар және ескертулер
Бұрын сандық порт ретінде жұмыс істеген шығарушылар үшін
analogRead командасы қате жұмыс істейді. Мұндай жағдайда оны аналогтық
кіріс ретінде конфигурациялау қажет. Егер шығарушы HIGH мәні бар сандық
порты ретінде жұмыс істесе, онда кіріске кері орнату тартушы кедергіні
қосады.
Atmega микроконтроллерінің нұсқаулығы аналогтық кірістердің
арасында, оларды оқу үшін, тез ауысуды жүзеге асыруға кеңес бермейді. Бұл
дабылдардың қабаттасуына және аналогтық жүйелердің бұрмалануына әкеп
соғуы мүмкін. Бірақ сандық режимде жұмыс жасаған аналогтық кірістерден
кейін analogRead() функциясы мен басқа кірістердің арасында үзілісті
баптаудың қажеттілігі туындауы мүмкін.
Айнымалылар
Айнымалы – ол деректерді сақтау орны. Оның аты, мәні және түрі бар.
Мысалы, осы хабарландыру (декларация деп аталады):
int pin = 13;
19
pin атымен, 13 мәнімен және int түрімен айнымалыны құрады. Одан кейін
бағдарламада оның мәнімен жұмыс істеу мақсатында аты арқылы осы
айнымалыға сүйенуге мүмкіндік болады. Мысалы:
pinMode(pin, OUTPUT);
pinMode() функциясына берілетін 13-ші шығыс мәні бар. Бұл жағдайда
функцияны пайдалану қажеттілігі жоқ. Бекіту мынадай түрде де жұмыс істей
алады:
pinMode(13, OUTPUT);
Функцияның артықшылығы ол шығарудың мәнін бір рет анықтап, сосын
оны бірнеше рет пайдалануға болады. Осының салдарынан, 13-ші шығысты 12-
ге ӛзгерту кезінде бағдарлама кодында тек бір жолды ғана ауыстыру жеткілікті
болады. Сонымен қатар, айнымалының мәніне кӛңіл бӛлу үшін арнайы аттарды
пайдалануға болады (мысалы, RGB жарықдиодын басқаратын бағдарламада
мынадай айнымалылар болуы мұмкін: redPin, greenPin және bluePin).
Айнымалылардың сан түріндегі мәндерінің артықшылықтары басқа.
Меншіктеуді пайдалана отырып, айнымалының мәнін ӛзгерту мүмкіндігі бар.
Мысалы:
pin = 12;
Айнымалының мәнін 12 санына ӛзгертеді. Бұл мысалда айнымалының
типі анықталмайды, себебі ол меншіктеу операциясымен ауыспайды.
Айнымалының аты үнемі типімен байланысты, тек мәні ӛзгереді. Мән беру
алдында айнымалыны декларациялау керек. Айнымалыны декларацияламай
мән берілсе, келесі хабарлама келеді: error: pin was not declared in this scope".
Бір айнымалыны екіншіге беру кезінде бірінші айнымалының мәні
екіншісіне кӛшіріледі. Бір айнымалының мәнін ӛзгерту екіншіге әсер етпейді.
Мысалы:
int pin = 13;
int pin2 = pin;
pin = 12;
тек pin-нің мәні 12 болады, ал pin2 = 13-ке тең.
Егер бағдарламалық кодтың басында декларациялау жүргізілсе, онда
айнымалыны барлық бағларламада пайдалану мүмкіндігі болады. Мұндай
айнымалылар ғаламдық деп аталады. Мысалы:
int pin = 13;
void setup()
{
pinMode(pin, OUTPUT);
}
void loop()
{
digitalWrite(pin, HIGH);
}
Pin-нің setup() және loop() екі функцияда да пайдаланылатыны мысалдан
кӛрініп тұр. Екі функция да бір айнымалыға сілтеме жасайды, осылайша, бір
айнымалының мәнін ауыстыру екіншісінің де мәніне әсер етеді:
int pin = 13;
void setup()
20
{
pin = 12;
pinMode(pin, OUTPUT);
}
void loop()
{
digitalWrite(pin, HIGH);
}
Loop() функциясынан шақырылатын digitalWrite() функциясына 12 мәні
беріледі, себебі setup() функциясында ол айнымалыға тағайындалған.
Егер айнымалы функциядада бір ғана рет пайдаланылса, онда оны
функцияның жақшаларымен шектелетін бағдарламалық кодтың осы бӛлігінде
декларациялайды. Мысалы:
void setup()
{
int pin = 13;
pinMode(pin, OUTPUT);
digitalWrite(pin, HIGH);
}
Бұл
мысалда
айнымалы
setup()
функциясының
ішінде
ғана
пайдаланылады. Осы кодты сипаттау кезінде:
void loop()
{
digitalWrite(pin, LOW); // wrong: pin is not in scope here.
}
«error: 'pin' was not declared in this scope» хабарламасы шығатын болады.
Бұл хабарлама сіз айнымалыны бағдарламада бір жерде декларациялаған
болсаңыз, бірақ оны кӛрерлік жерден тыс пайдалансаңыз осы хабарлама шыға
береді.
Барлық айнымалыларды неге ғаламдық етіп істемеске? Айнымалы қай
жерде пайдаланылатыны әлі белгісіз болса, онда оны неліктен бір функциямен
шектеу керек? Айнымалы шектелген кезде оның ӛзгеру кӛзін табу оңай. Егер
айнымалы ғаламдық болса, онда оның мәні бағдарламалық кодтың кез келген
орнында ӛзгеруі мүмкін, ол барлық бағдарлама бойынша оны қадағалау
керектігін білдіреді. Мысалы, айнымалының бірнеше қате мәні болғанда, ал
кӛрініс жері шектеулі болса себебін табу әлдеқайда жеңіл.
Python сияқты кейбір бағдарламалау тілдерінде типтер айнымалылардың
аттарымен емес, ал олардың мәндерімен байланыстырылады. Осылайша,
айнымалының мәніне кез келген тип беруге болады. Бұл динамикалық
типтендіру деп аталады.
Функциялар
Функциялардың кодты сегменттерге бӛлуі белгілі бір тапсырмаларды
орындайдын кодтың бӛліктерін құруға мүмкіндік береді. Орындалғаннан кейін
21
функциялар шақырылған орнынан қайта ӛз орнына түседі. Функцияларды құру
себебі – бірдей әрекеттерді бірнеше рет орындау қажеттілігі болып табылады.
Кодты функцияларға бӛлудің бірқатар артықшылықтары бар:
Функциялар
бағдарламаны
ұйымдастыруға
мүмкіндік
береді.
Бағдарламаның тұжырымдамасын алдын ала құруға ӛте жиі кӛмектеседі.
Функциялар бағдарламаның бір жерінде бір әрекетті кодтайды. Кейін тек
функцияның кодын ретке келтіру керек.
Функциялар кодты ӛзгерту қажет болған кезде қателіктің шығу
мүмкіндігін қысқартады.
Функциялар скетчтердің мәтінін қысқартады және оны жинақы етеді,
себебі кейбір секциялар бірнеше рет пайдаланылады.
Функциялар кодты модульдік ете отырып, басқа бағдарламаларда оның
кодын пайдалануды жеңілдетеді. Бұл жағдайда функциялар бағдарламаның
кодын оқу үшін жеңіл ете отырып, тағы да бір шағын артықшылыққа ие
болады.
Тәжірибелік сабақ №2. Функциялармен жұмыс жасау.
Arduino скетчтерінде setup() және loop() екі міндетті функциялар бар.
Басқа функциялар осы функциялардың жақшасынан кейін құрылуы керек.
Екі санның кӛбейтіндісін есептейтін функцияны тӛмендегідей болады:
int myMultiplyFunction(int x, int y){
int result;
result = x * y;
return result;
Мұндағы: int – функция типін шақыратын оператор; myMultiplyFunction- функия аты;t x, y-
функцияға жіберілетін параметрлер; result-нәтіжені меншіктеу операторы
Толық скетч:
void setup(){
Serial.begin(9600);
}
// Кӛбейту функциясын шақыру үшін оған деректер параметрлері беріледі:
void loop(){
int i = 2;
int j = 3;
int k;
k = myMultiplyFunction(i, j); // k 6 болады
Serial.println(k);
delay(500);
}
int myMultiplyFunction(int x, int y){
int result;
result = x * y;
return result;
}
22
Өз бетінше орындауға арналған тапсырма:
1. Екі
санның квадраттарының қосындысын табатын функция
құрыңыздар.
Достарыңызбен бөлісу: |