H1TEj

        Mis on sportlik huvi?: kas 100000 jooksurajal ja üks võidab?
        Vale vastus. Ühe võit on kogu maakonna võit.

Mikroprotsessorid ja kontrollerid
---------------------------------

Automaatik loob automaate, ning automaate (üldjuhul) programmeeritakse. Riistvara, mida tuleb programmeerida on:

  + Siemens'i kontrollerid (aastast 1958, keeled IL, LAD, FBD)
  
  + Arduino*0 (aastast 2006, keeled C, C++) või Atmel-AVR*1 mikrokontrollerid 
  
  + Intel Euclides*2 või Raspberry Pi*3 (midagi uuemat, näiteks Python)
  
Roboti ehitamisega alustada võiks siiski "kivisajandi" tehnoloogiate abil -- Atmel AVR chips (alates 1991, https://www.youtube.com/watch?v=qvaSIGFdtNA), põhjusi on päris mitu.

  1. Teha parimat robotit tähendab näidata enda oskusi, kuid mitte rahakotti. Viimasel juhul soovitan osta mõnda "Boston Dynamics"i robotit, Honda Asimo't jne..
  
  2. Ressursside vaesus tähendab paremat kontrolli kogu projekti üle.
  
  3. nn. reaalaja töötlemine tähendab, et juhtimisprogrammi ja riistvara vahel pole mingit operatsioonsüstemi*5 (nagu näiteks Linux või IoT MS Windows)
  
Lihtsamal kujul, arvuti on protsessor + mälu + sisendid/väljundid (IO)

Hetkeseis on selline, et mälud on arvutis erinevad: muutmälu, püsimälu, säilmälu (ning hävimälu) jne. Mis on mis võib vaadata vallaste.ee'st. Tulevikus (~2020a, Hewlet-Packard) loodetakse luua suuremahulist (320TB*0) kiiret muutmälu, millel on ka säilmälu omadusi (andmed säilivad ka pärast toite väljalülitamist).

Protsessor loeb koodi (detailse retsepti, mida tuleb andmetega teha) mälust ning täidab operatsioone andmetega. Suure tahtmise puhul võivad nii sisendid/väljundid, muutmälu pesad (elemendid) kui ka eraldi operatsioonide eest vastutavad protsessori osad omada erinevaid aadresse -- numbreid, mille järgi pesaga jutule saab. Siis protsessori kood (programm) muutub eriti lihtsaks ning koosneb ainult kahest käsust:

Näide. (aadressid laest võetud)

  loe sisend 42
  kirjuta seitsmendasse summaatorisse (sisend a, aadress 123)
  loe sisend 34
  kirjuta seitsmendasse summaatorisse (sisend b, aadress 124)
  loe seitsmenda summaatori väljundist (aadress 15)  
  kirjuta väljundisse 12
  
Jääb ainult: 

  1. kodeerida käsud (näiteks 0 -- loe, 1 -- kirjuta). 
  2. aadressid esitada kahendkoodis.

ning programm (mis liidab numbreid sisenditel 42 ja 34) ongi valmis:

  0-0101010 1-1111011 0-0100010 1-1111100 0-0001111 1-0001100

Sidekriipsu pole vaja, kuid nii on käsu struktuur nähtavam (käsukood-aadress)

Mugavam oleks, kui andmed oleksid peidetud mitte numbriliste aadresside vaid nimede taha. Siis saaks kirjutada näiteks nii:

  CTAC + AHHA = ARMASTUS
  
Kus sõnad CTAC, AHHA, ARMASTUS on muutujad (vabu aadresse nende jaoks arvuti otsib ise ühe teise programmi abil (kompilaator, interpretaator)).
  
Edasi vaatame kuidas programmeerida vooskeemide (flowcharts) abil. Katsetame programmi nimega Flowgorithm (õpiku, näiteid ja muud leiate flowgorithm.org'ilt), kuna selle abil võib automaatselt luua koodi 13'ne erineva programmeerimiskeele jaoks:

   1. C#  
   2. C++  
   3. Java  
   4. JavaScript  
   5. Lua  
   6. Perl  
   7. Python  
   8. QBasic  
   9. Ruby  
  10. Swift-2  
  11. VBA  
  12. Visual Basic.NET 
  13. Gaddis Pseudocode

Tuleb edasi liikuda mööda spiraali, näiteks nii:

   1. Tutvumine Flowchart'iga
   2. Massiivid + tsüklid
   3. automaatne tõlge Flowgorithm -> C++
   4. Tutvumine C++-ga 
   ...

  Näiteks:

  Esimene tiir

    comment

    declare 
      boolean, true, false
      integer, NaN, -2147483647, 2147483647
      real,
      string

    assign
      = 
      + - * / 
      & 
      && || ! 
      < <= == >= >

    call function argument return

    if while do-while

  Teine tiir

    declare array

    for

  Kolmandas ringis

     Struktuurid, Klassid
     Bitiväljad
     Bitioperatsioonid
     Argumentide edasipääs väärtuse või viite järgi
     Töö failidega
     foreach

  .. ringis

     Rohkem programmeerimiskeeli
     Keerulisemad mõisted
   
Soovitan tutvuda teemaga Programmeerimise online õpiku (http://programmeerimine.cs.ut.ee/) alusel, sest edasi hakkame vaatama thonny.org keskkonda. 

-------------

Praktiline osa

Flowgorithm'i projekte soovitan alustada sellest, mis on hetkeks juba olemas. See tähendab tuleb installida Flowgorithm'i viimast versiooni, ning enda projekti aluseks tuleb võtta lib.fprg šablooni. 

  nelus.tpt.edu.ee --> Downloads

Kõik vajalikud andmed konkreetse ülesande täitmiseks sisestatakse ühes reas. Kuna teaduslikus formaadis sisestatavaid reaalarve tavaliselt valideeritakse regulaaravaldiste abil, mida Flowgorithm ei mõista, siis hetkel keelame ära reaalarvu esitamist 1.23E+8 kujul (praegu siis 123000000.0). Tuleme selle teema juurde tagasi C või Pythoni tiirul.

Flowgoritm’i vooskeeme on lihtne eksportida näiteks Arduino'sse:

  Tools -> Source Code Viewer
    Language: C++
      [ Save ]
      
Kasutame arduino.fprg prototüüp-vooskeemi (nelus.tpt.edu.ee -> downloads)

Kasulik on ka jätta meelde (fail Arduino.h)

  C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino

  #define HIGH 0x1
  #define LOW  0x0
  
  #define CHANGE 1
  #define FALLING 2
  #define RISING 3

  #define INPUT 0x0
  #define OUTPUT 0x1
  #define INPUT_PULLUP 0x2

  typedef bool boolean;
  typedef uint8_t byte;

  void pinMode(uint8_t, uint8_t);
  void digitalWrite(uint8_t, uint8_t);
  int digitalRead(uint8_t);
  int analogRead(uint8_t);
  
Loeme ühe asjaliku jutu:

  http://stackoverflow.com/questions/31096116
       /flowgorithm-importing-variables-and-modifying-their-values

| > My professor likes work to be turned in Flowgorithm.
| > I can't figure out how to take the variable X=0 from the 
| > main method to the displayLoop method and then allow 
| > the displayLoop method to modify the stored value so it can be
| > used as a countdown (or countup in this case).
|        
| Flowgorithm, like Java, uses pass-by-value for types 
| like Integer, Real, etc.. To return one less, you can create 
| a function and return the decremented value. 
| So, maybe try something like this:
|
|   count = displayLoop( count)
| 
| The assignment sounds a tad strange. Is this a recursion assignment?

Harjutused
----------

1. Kui sisestad täisarvu vahemikus 1..7 vastuseks saad nädalapäeva.
   Edasi programm jälle pakub sisestada midagi. 
   Kui sisestad 0 programm teatab "Bye!" ning lõpetab tööd.
   Kui sisestad midagi muud näiteks "Aitab" või "9",
   vastab programm "¡¿ valed andmed ?!"

2. Kui sisestad täisarvu vahemikus 1..12 vastuseks saad kuu nimetuse.
   Edasi programm jälle pakub sisestada midagi. 
   Kui sisestad 0 programm teatab "Bye!" ning lõpetab tööd.
   Kui sisestad midagi muud näiteks "Aitab" või "13",
   vastab programm "¡¿ valed andmed ?!"

3. Sisestada täisarv vahemikus 1..255-ni. Programm peaks trükkima
   ekraanile sisestatud arvu kahendkoodi koos lahendusega. Näide
   
   ? 67  
   
      :2
   67    1
   33    1
   16    0
    8    0
    4    0
    2    0
    1    1
    
   67 = 1000011

4. Sisestada kuni 8-bitise pikkusega kahendkood. Vastata, mis arv on see
   kümnendsüsteemis. Näide
   
   ? 10101
   10101 = 1*2^4+0*2^3+1*2^2+0*2^1+1*2^0=16+4+1=21
   
5. Sisestada arv vahemikus 1..65536. Tagastada Karnaugh Kaart Logisim
   layout'ga, tõesustabel, lihtsustatud loogikaavaldis. Näide.
   
           MSB v              v LSB
      43555 -> 1010101000100011
      
      0000   1 LSB
      0001   1                    x1
      0010   0          00  01  11  10
      0011   0         ..........=====..
                    00 : 1 : 1 : 0 : 0 :
      0100   0         :...............:
      0101   1      01 : 0 : 1 : 0 : 0 ||
      0110   0         :...............||x2
      0111   0      11|| 0 : 1 : 1 : 0 ||
                  x3  ||...............:
      1000   0      10|| 0 : 1 : 1 : 0 :
      1001   1         ......=====......
      1010   0                x0
      1011   1    
                      - - -  -
      1100   0    z = x3x2x1+x1x0+x3x0
      1101   1
      1110   0
      1111   1 MSB
      
Katkestused
-----------

           -- Miks kõikidele meeldib ehitada roboteid?
           -- Sest siin pole vaja "nuppe" programmeerida,
              robot ise teab, mida teeb..
              
UnoArduSim, extINT:
-------------------
        +---------------------------------+
        | USER PROGRAM EXEC ERROR:        |
        | Interrupt number only be 0 or 1 |
        | (corresponds to pin 2 or pin 3) |
        | Value = 2                       |
        +---------------------------------+
  
Blink on push button on 2

  const byte ledPin = 13;
  const byte interruptPin = 2;

  volatile byte state = LOW;

  void blink() {
    state = !state;
  }

  void setup() {
    pinMode(ledPin, OUTPUT);
    pinMode(interruptPin, INPUT_PULLUP);
    attachInterrupt( interruptPin, blink, CHANGE);
  }

  void loop() {
    digitalWrite(ledPin, state);
  }

UnoArduSim, Taimer:
-------------------

UnoArduSim simulaator ei toeta mikrokontrolleri registrite programmeerimist. Kasutage "Virtronics'i" simulaatorit (~20$, alates versioonist 0.99D rev2). Tasub proovida kombinatsiooni Arduino.cc tarkvara koos SimulIDE 0.0.3.

Lihtsama koodi leiab nii

  https://arduino-info.wikispaces.com/Timers-Arduino
    http://letsmakerobots.com/files/Arduino101-Timers.zip
      timer1compaDemo -> timer1compaDemo.pde

Lisa A. Andmed harjutuste jaoks
-------------------------------

Phonetic Alphabet (NATO)

Alpha AL-FAH       | Kilo KEY-LOH        | Uniform OONEEFORM | 0 ZERO  |
Bravo BRAH-VOH     | Lima LEE-MAH        | Victor VIK-TAH    | 1 WUN   |
Charlie CHAR-LEE   | Mike MIKE           | Whiskey WISS-KEY  | 2 TOO   |
Delta DELL-TAH     | November NO-VEM-BER | Xray EKS-RAY      | 3 TREE  |
Echo ECK-OH        | Oscar OSS-CAH       | Yankee YANG-KEY   | 4 FOWER |
Foxtrot FOKS-TROT  | Papa PAH-PAH        | Zulu ZOO-LOO      | 5 FIFE  |
Golf GOLF          | Quebec KEH-BECK     |                   | 6 SIX   |
Hotel HOH-TEL      | Romeo ROW-ME-OH     |                   | 7 SEVEN |
India IN-DEE-AH    | Sierra SEE-AIR-RAH  | . Stop            | 8 AIT   |
Juliet JEW-LEE-ETT | Tango TANG-GO       |                   | 9 NINER |

Morse kood
..........

  Tähe- | Kood  | Tähe- | Kood  | Tähe- | Kood  | Tähe- | Kood  | 
  märk  |       | märk  |       | märk  |       | märk  |       |
  ------+-------+-------+-------+-------+-------+-------+-------+  
  A     | ·-    | J     | ·---  | S     | ···   | 1     | ·---- | 
  B     | -···  | K     | -·-   | T     | -     | 2     | ··--- | 
  C     | -.-·  | L     | ·-··  | U     | ··-   | 3     | ···-- | 
  D     | -··   | M     | --    | V     | ···-  | 4     | ····- | 
  E     | ·     | N     | -·    | W     | ·--   | 5     | ····· | 
  F     | ··-·  | O     | ---   | X     | -··-  | 6     | -···· | 
  G     | --·   | P     | ·--·  | Y     | -·--  | 7     | --··· | 
  H     | ····  | Q     | --·-  | Z     | --··  | 8     | ---·· | 
  I     | · ·   | R     | ·-·   | 0     | ----- | 9     | ----· | 
  Ä     | ·-·-  | Ö     | ---·  | Ü     | ··--  | Õ     | -.--  |


  Tähemärk          | Kood   | Tähemärk         | Kood
                    |        |                  |
  Punkt [.]         | ·-·-·- | Koolon [:]       | ---···
  Koma [,]          | --··-- | Semikoolon [;]   | -·-·-·
  Küsimärk [?]      | ··--·· | Võrdusmärk [=]   | -···-
  Ülakoma [']       | ·----· | Plussmärk [+]    | ·-·-·
  Hüüumärk [!]      | -·-·-- | Miinus [-]       | -····-
  Kaldkriips [/]    | -··-·  | Alljoon [_]      | ··--·-
  Sulgude algus [(] | -·--·  | Jutumärk ["]     | ·-··-·
  Sulgude lõpp [)]  | -·--·- | Dollarimärk [$]  | ···-··-
  Ampersand [&]     | ·-···  | Ätt [@]          | ·--·-·

Азбука Морзе

  а  .-    к  -.-   ф  ..-.   ю  ..--
  б  -...  л  .-..  х  ....   я  .-.-
  в  .--   м  --    ц  -.-.
  г  --.   н  -.    ч  ---.
  д  -..   о  ---   ш  ----
  е  .     п  .--.  щ  --.-
  ж  ...-  р  .-.   ъ  --.--
  з  --..  с  ...   ы  -.--
  и  ..    т  -     ь  -..-
  й  .---  у  ..-   э  ..-..

Arvud erinevates keeltes
........................

ENG: zero one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty thirty forty fifty sixty seventy eighty ninety hundred thousand

EST: null üks kaks kolm neli viis kuus seitse kaheksa üheksa kümme üksteist kaksteist kolmteist neliteist viisteist kuusteist seitseteist kaheksateist üheksateist kakskümmend kolmkümmend nelikümmend viiskümmend kuuskümmend seitsekümmend kaheksakümmend üheksakümmend sada tuhat

GER: null eins zwei drei vier fünf sechs sieben acht neun zehn elf zwölf dreizehn vierzehn fünfzehn sechzehn siebzehn achtzehn neunzehn zwanzig dreißig vierzig fünfzig sechzig achtzig neunzig hundert tausend

ITA: zero uno due tre quattro cinque sei sette otto nove dieci undici dodici tredici quattordici quindici sedici diciassette diciotto diciannove venti trenta quaranta cinquanta sessanta settanta ottanta novanta centomila mille

LAT: nulla, unus, duo, tres, quattuor, quinque, sex, septem, octo, novem, decem, undecim, duodecim, tredecim, quatuordecim, quindecim, decem et septem, decem et octo, undeviginti, viginti, triginta, quadraginta, quinquaginta, sexaginta, septuaginta, octoginta, nonaginta, centum, milia

FRA: zéro un deux trois quatre cinq six sept huit neuf dix onze douze treize quatorze quinze seize dix-sept dix-huit dix-neuf vingt trente quarante cinquante soixante soixante-dix quatre-vingt quatre-vingt-dix cent mille

ESP: cero uno dos tres cuatro cinco seis siete ocho nueve diez once doce trece catorce quince dieciséis diecisiete dieciocho diecinueve veinte treinta cuarenta cincuenta sesenta setenta ochenta noventa cien mil

SWE: noll en två tre fyra fem sex sju åtta nio tio elva tolv tretton fjorton femton sexton sjutton arton nitton tjugo trettio fyrtio femtio sextio sjuttio åttio nittio hundra tusen

RUS: ноль один два три четыре пять шесть семь восемь девять десять одиннадцать двенадцать тринадцать четырнадцать пятнадцать шестнадцать семнадцать восемнадцать девятнадцать двадцать тридцать сорок пятьдесят шестьдесят семьдесят восемьдесят девяноста сто тысяча

GRE: μηδέν ένα δύο τρία τέσσερα πέντε έξι επτά οκτώ εννέα δέκα έντεκα δώδεκα δεκατρία δεκατέσσερα δεκαπέντε δεκαέξι δεκαεπτά δεκαοκτώ δεκαεννιά είκοσι τριάντα σαράντα πενήντα εξήντα εβδομήντα ογδόντα ενενήντα εκατό χιλιάδες

-------------

Nädala päevad: 

ENG: Sunday Monday Tuesday Wensday Thursday Friday Saturday

EST: Pühapäev Esmaspäev Teisipäev Kolmapäev Neljapäev Reede Laupäev

GER: Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag

ITA: Domenica Lunedì Martedì Mercoledì Giovedì Venerdì Sabato

LAT: ???, ???, ???, ???, Die Mercurii, Feria, ???

FRA: Dimanche Lundi Mardi Mercredi Jeudi Vendredi Samedi

ESP: Domingo Lunes Martes Miércoles Jueves Viernes Sábado

SWE: Söndag Måndag Tisdag Onsdag Torsdag Fredag Lördag

RUS: Воскресенье Понедельник Вторник Среда Четверг Пятница Суббота

GRE: Κυριακή Δευτέρα Τρίτη Τετάρτη Πέμπτη Παρασκευή Σάββατο

------------

Kuud:

ENG: January February March April May June July August September October November December

EST: Jaanuar Veebruar Märts Aprill Mai Juuni Juuli August September Oktoober November Detsember

GER: Januar Februar März April Mai Juni Juli August September Oktober November Dezember

ITA: Gennaio Febbraio Marzo Aprile Maggio Giugno Luglio Agosto Settembre Ottobre Novembre Dicembre

LAT: Ianuarius Februarius Martius Aprilis Maius Iunius Iulius Augustus September October November December

FRA: Janvier Février Mars Avril Mai Juin Juillet Août Septembre Octobre Novembre Décembre

ESP: Enero Febrero Marzo Abril Mayo Junio Julio Agosto Septiembre Octubre Noviembre Diciembre

SWE: Januari Februari Mars April Maj Juni Juli Augusti September Oktober November December

RUS: Январь Февраль Март Апрель Май Июнь Июль Август Сентябрь Октябрь Ноябрь Декабрь

GRE: Ιανουάριος Φεβρουάριος Μάρτιος Απρίλιος Μάιος Ιούνιος Ιούλιος Αύγουστος Σεπτέμβριος Οκτώβριος Νοέμβριος Δεκέμβριος

---------------

Seismesegmendiline indikaator

      a             MSB      LSB
      ---             76543210
    |     | b         hgfedcba
  f |  g  |           
      ---
    |     | c
  e |     |
      ---  o h
        d

       00   '0'   3f            20   'K'   76
       01   '1'   06            21   'L'   38
       02   '2'   5b            22   'M'   36
       03   '3'   4f            23   'N'   54
       04   '4'   66            24   'O'   5c
       05   '5'   6d            25   'P'   73
       06   '6'   7d            26   'Q'   67
       07   '7'   07            27   'R'   50
       08   '8'   7f            28   'S'   6c
       09   '9'   6f            29   'T'   78
       10   'A'   77            30   'U'   3e
       11   'B'   7c            31   'V'   1c
       12   'C'   39            32   'W'   7e
       13   'D'   5e            33   'X'   14
       14   'E'   79            34   'Y'   6e
       15   'F'   71            35   'Z'   49
       16   'G'   3d            36   '='   48
       17   'H'   74            37   '_'   08
       18   'I'   19            38   '~'   40
       19   'J'   0d            39   ' '   00

   00     --     22     33     --     55     66     77
  0  0   |  1   |  2   |  3   4  4   5  |   6  |   |  7
   --     --     22     33     44     55     66     --
  0  0   |  1   2  |   |  3   |  4   |  5   6  6   |  7
   00     --     22     33     --     55     66     --

   88     99     AA     --     CC     --     EE     FF
  8  8   9  9   A  A   B  |   C  |   |  D   E  |   F  |
   88     99     AA     BB     --     DD     EE     FF
  8  8   |  9   A  A   B  B   C  |   D  D   E  |   F  |
   88     99     --     BB     CC     DD     EE     --

   GG     --     II     JJ     --     --     --     --
  G  |   H  |   |  |   |  |   K  K   L  |   M  M   |  |
   --     HH     --     --     KK     --     --     NN
  G  G   H  H   I  |   |  J   K  K   L  |   M  M   N  N
   GG     --     II     JJ     --     LL     --     --

   --     PP     QQ     --     --     --     --     --
  |  |   P  P   Q  Q   |  |   S  |   T  |   U  U   |  |
   OO     PP     QQ     RR     SS     TT     --     --
  O  O   P  |   |  Q   R  |   |  S   T  |   U  U   V  V
   OO     --     --     --     SS     TT     UU     VV

   --     --     --     ZZ     --     --     --     --
  W  W   |  |   Y  Y   |  |   |  |   |  |   |  |   |  |
   WW     --     YY     ZZ     ==     --     ~~     --
  W  W   X  X   |  Y   |  |   |  |   |  |   |  |   |  |
   WW     --     YY     ZZ     ==     __     --     --

Algkood (C):

#include <stdio.h>

int font[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 
               0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 
               0x3d, 0x74, 0x19, 0x0d, 0x76, 0x38, 0x36, 0x54, 
               0x5c, 0x73, 0x67, 0x50, 0x6c, 0x78, 0x3e, 0x1c, 
               0x7e, 0x14, 0x6e, 0x49, 0x48, 0x08, 0x40, 0x00,  };
               
char* s    = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ=_~ ";               
               
int main() {
    int m, n, i;
    
    for (n=0; n<20; n++) {
        printf("       %02d   '%c'   %02x", n, s[n], font[n]);
        printf("            %02d   '%c'   %02x\n", n+20, s[n+20], font[n+20]);
    }
    printf("\n");

    for (m=0; m<5; m++) {
        for (n=0; n<8; n++) 
            printf("   %c%c  ",
            font[m*8+n]&0x01?s[m*8+n]:'-',
            font[m*8+n]&0x01?s[m*8+n]:'-'); 
        printf("\n");
        for (n=0; n<8; n++) 
            printf("  %c  %c ",
            font[m*8+n]&0x20?s[m*8+n]:'|',
            font[m*8+n]&0x02?s[m*8+n]:'|'); 
        printf("\n");
        for (n=0; n<8; n++) 
            printf("   %c%c  ",
            font[m*8+n]&0x40?s[m*8+n]:'-',
            font[m*8+n]&0x40?s[m*8+n]:'-'); 
        printf("\n");
        for (n=0; n<8; n++) 
            printf("  %c  %c ",
            font[m*8+n]&0x10?s[m*8+n]:'|',
            font[m*8+n]&0x04?s[m*8+n]:'|'); 
        printf("\n");
        for (n=0; n<8; n++) 
            printf("   %c%c  ",
            font[m*8+n]&0x08?s[m*8+n]:'-',
            font[m*8+n]&0x08?s[m*8+n]:'-'); 
        printf("\n");
        printf("\n");
    }
    
    return 0; 
}

---------------

Lisa C. Arduino kala Flowgoritm --> C
-------------------------------------

Kood mida kopeeritakse Arduino.cc projekti algab "|" (vertikaal kriipsuga).

#include <iostream>
#include <sstream>
#include <string>
#include <cstdlib>
#include <cmath>

using namespace std;

// Headers
string toString (double);
int toInt (string);
double toDouble (string);

int analogRead(int);
void Arduino();
void delay(int);
int digitalRead(int);
void digitalWrite(int, int);
int loop(int);
void pinMode(int, int);
void setup();

int main() {
    Arduino();
}

int analogRead(int aPin) {
    string vs;
    
    cout << "VALUE ON PIN " << toString(aPin) << " ?" << endl;
    cin >> vs;
    int v;
    
    v = toInt(vs);
    
    return v;
}

void Arduino() {
|   int globalMemory;
    
|   globalMemory = 0;
|   setup();
    while (true) {
|       globalMemory = loop(globalMemory);
                       ^^^^
    }
}

| void setup() {
|   pinMode(13, 1);
| }

// Remove this on real Arduino
         vvvvvvvvvvvvvvvv
| int loop(int globalMemory) {
|     int vGM;
|     
|     if (globalMemory == 0) {
|         globalMemory = 1;
|     } else {
|         globalMemory = 0;
|     }
|     digitalWrite(13, globalMemory);
|     delay(1000);
|     vGM = globalMemory;
|     
|     return vGM;
| }

void delay(int ams) {
    int n;
    
    for (n = 0 ; n <= ams * 50 ; n += 1) {
    }
    cout << "Delay is set to " << toString(ams) << endl;
}

int digitalRead(int aPin) {
    string vs;
    
    cout << "VALUE ON PIN " << toString(aPin) << "0 OR 1 ?" << endl;
    cin >> vs;
    int v;
    
    v = toInt(vs);
    if (v == 0) {
        cout << toString(aPin) << " is LOW" << endl;
    } else {
        if (v == 1) {
            cout << toString(aPin) << " is HIGH" << endl;
        } else {
            cout << toString(aPin) << " is ILLEGAL" << endl;
        }
    }
    
    return v;
}

void digitalWrite(int aPin, int aValue) {
    cout << toString(aValue) << " on PIN " << toString(aPin) << endl;
}

void pinMode(int aPin, int aMode) {
    string state;
    
    state = string("UNKNOWN");
    if (aMode == 0) {
        state = string("INPUT");
    } else {
        if (aMode == 1) {
            state = string("OUTPUT");
        } else {
            if (aMode == 2) {
                state = string("INPUT_PULLUP");
            }
        }
    }
    cout << "PIN " << toString(aPin) << " is " << state << " now" << endl;
}

// The following implements type conversion functions.

string toString (double value) { //int also
    stringstream temp;
    temp << value;
    return temp.str();
}

int toInt (string text) {
    return atoi(text.c_str());
}

double toDouble (string text) {
    return atof(text.c_str());
}

Viited

*0) https://www.arduino.cc/
    https://et.wikipedia.org/wiki/Arduino

*1) https://et.wikipedia.org/wiki/Atmel
    http://www.atmel.com/

*2) https://newsroom.intel.com/chip-shots
      /intel-announces-tools-realsense-technology-development/
      
*3) https://www.raspberrypi.org/
     
*4) https://www.extremetech.com/extreme
      /207897-hp-kills-the-machine-repurposes-design-around-
      conventional-technologies

*5) https://www.youtube.com/watch?v=w2itwFJCgFQ
    https://geektimes.ru/post/255090/

Loe lisaks

1. http://www.pld.ttu.ee/~hln/itk/kaug/digi1kaug.pdf
2. ..
