+++
title = 'Πώς φτιάχνεται ένας γκαϊφές'
date = '1998-01-01T00:00:00Z'
description = ''
author = 'Γεωργάτος Φώτης gef@ceid.upatras.gr(mailto:gef@ceid.upatras.gr?subject=COFFEE-HOWTO)'
issue = ['Magaz 01']
issue_weight = 4
+++

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

*Μία από τις πιο ενοχλητικές ερωτήσεις που έχω ακούσει για λογισμικό είναι εάν φτιάχνει καφέ. Ε, ναι λοιπόν, φτιάχνει. Και καλό καφέ.*

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

Επί μακρόν την ανθρωπότητα την εβασάνιζε το πώς θα ημπορούσε να χρησιμοποιήσει τον υπολογιστή, ώστε να παράγει καφέ. Τον καφέ τον χρειαζόμαστε για καθόμαστε
στον υπολογιστή με τις ώρες χωρίς να νυστάζουμε, διότι ως γνωστόν την νύχτα γράφεται ο καλύτερος κώδικας.

Το κυριότερο πρόβλημα είναι να συνδέσουμε την καφετιέρα με τον υπολογιστή και να την ελέγχουμε μέσω λογισμικού. Αυτό συνήθως ανάγεται σε ένα κύκλωμα διακόπτη
ON/OFF, που ελέγχει την τροφοδοσία της καφετιέρας.

**1. Είδη καφέ**
-----------------------------------------------

-   [1.1 Ελληνικός](#ss1.1)
-   [1.2 Γαλλικός](#ss1.2)
-   [1.3 Nescaffe](#ss1.3)
-   [1.4 frappe](#ss1.4)
-   [1.5 freddo](#ss1.5)
-   [1.6 cappuccino](#ss1.6)
-   [1.7 espresso](#ss1.7)

**2. Κυκλώματα σύνδεσης της καφετιέρας**
-----------------------------------------------------------------------

-   [2.1 Οδήγηση με 0-5V από τον υπολογιστή](#ss2.1)
-   [2.2 \'Ελεγχος με Relay](#ss2.2)
-   [2.3 \'Ελεγχος με TRIAC \#1](#ss2.3)
-   [2.4 \'Ελεγχος με TRIAC \#2](#ss2.4)

**3. Λογισμικό**
-----------------------------------------------

-   [3.1 Πρόγραμμα σε C](#ss3.1)
-   [3.2 Σαν device driver](#ss3.2)
-   [3.3 Διασύνδεση με Internet](#ss3.3)

**4. Συμπτώματα υπερδοσολογίας**
---------------------------------------------------------------

**5. Επεκτάσεις**
------------------------------------------------

**6. Αναφορές**
----------------------------------------------


### [1. Είδη καφέ]{#s1}

### [1.1 Ελληνικός]{#ss1.1}

Είναι επίσης γνωστός και ως τούρκικος, αλλά είναι παραλλαγή του. Παλιά είχαν για σηματάκι τον παπαγάλο, αλλά τώρα χρησιμοποιούν τον πιγκουίνο. Χαρακτηριστικό
του καφέ αυτού είναι το κατακάθι στον πάτο του ποτηριού, που μπορεί να χρησιμεύσει για να μαντέψετε την ατυχία σας.

Αναμιγνύουμε καφέ και ζάχαρη στη σωστή αναλογία, με ποσότητα νερού αντιστοίχου του φλιτζανίου. Παραδοσιακά παρασκευάζεται σε ζεσεοδοχείο (μπρίκι) με γκαζιέρα,
αλλά απουσία φτηνών εξαρτημάτων για τον έλεγχο του αερίου, θα χρησιμοποιήσουμε ένα απλό μάτι. (εεε! της κουζίνας)

Οι κατηγορίες του ελληνικού καφέ είναι: (κουταλιές)

-   Γλυκός: 1 καφέ, 2 ζάχαρη
-   Βαρύ γλυκός: 2 καφέ, 3 ζάχαρη
-   Γλυκύβραστος: 1/2 καφέ, 1 ζάχαρη
-   Μέτριος: 1 καφέ, 1 ζάχαρη
-   Σκέτος (Πικρός): 1 καφέ
-   Πολλά βαρύς και όχι: 2 καφέ, συνοδεύεται με ναργιλέ

Ανακατεύουμε συνεχώς μέχρι το μίγμα να αρχίσει να ξεχειλίζει, οπότε με γρήγορες κινήσεις το παίρνουμε από τη φωτιά. Αργείς-χάνεις, απλή λογική. Το βήμα αυτό
συζητείται να υλοποιηθεί με robot.

### [1.2 Γαλλικός]{#ss1.2}

Δημοφιλής καφές για προγραμματιστές μιας και δεν χρειάζεται προσοχή. Η ανάρπαστη γεύση του έχει εμπνεύσει χιλιάδες προγραμματιστών σε έργα λογισμικού αμύθητης
τελειότητας, υλοποιημένα άγρια χαράματα. Τα Windows για παράδειγμα είναι γραμμένα 5:00 το πρωί, με τα νεύρα ΝΑ. Εγγυημένο αποτέλεσμα.

### [1.3 Nescaffe]{#ss1.3}

Το κουνάς πριν

### [1.4 frappe]{#ss1.4}

Το κουνάς μετά

### [1.5 freddo]{#ss1.5}

Δύσκολος καφές.

Μην τον ζητήσετε από τον τύπο στο Πάρκο της Ειρήνης/Πανεπιστήμιο Πάτρας

### [1.6 cappuccino]{#ss1.6}

### [1.7 espresso]{#ss1.7}


### [2. Κυκλώματα σύνδεσης της καφετιέρας]{#s2}

Το σχηματικό είναι κάπως έτσι:

**ΣΗΜΕΙΩΣΗ: \'Εχει παρατηρηθεί ότι μερικά σχήματα δεν φαίνονται σωστά. Σε τέτοια περίπτωση, δείτε τα με \"View-\>Document source\".**

>     --------- 0-5V  --------- ~220V  -----------
>     |  Η/Υ  |===>===|Ελεγχος|========|Καφετιέρα|
>     ---------       ---------        -----------

Η γενική ιδέα είναι ότι παίρνουμε μία τάση ελέγχου από τον υπολογιστή, ο οποία οδηγεί ένα κύκλωμα με απομόνωση (OPTOTRIAC ή RELAY).

Εάν η καφετιέρα είναι μεγάλη (πχ περισσότερο από 200W), χρησιμοποιείστε οπωσδήποτε RELAY, αλλιώς μπορείτε να βάλετε TRIAC. Εάν δεν κάνετε ακριβώς αυτό, απλά θα
πετάξετε τα λεφτά σας με τον ή με τον άλλο τρόπο.

Σημειώστε ότι τα κυκλώματα που έχουμε παρακάτω, είναι όλα τουλάχιστον μια φορά δοκιμασμένα, αλλά η διασύνδεση με τον υπολογιστή γίνεται με ΔΙΚΗ ΣΑΣ ΕΥΘΥΝΗ. Εάν
δεν έχετε εμπειρία με ηλεκτρονικά, καλόν θα είναι να μην την αποκτήσετε με αυτά τα κυκλώματα, γιατί θα είναι κακή μάλλον\...

Να είστε πολύ προσεχτικοί στους πειραματισμούς με τα 220V, και δεν θα είναι πολυτέλεια να χρησιμοποιήσετε ασφάλεια ανάλογη του φορτίου σας\...

### [2.1 Οδήγηση με 0-5V από τον υπολογιστή]{#ss2.1}

Εδώ είναι ένα απλό παράδειγμα για το πώς θα πάρετε μια απλή τάση 0-5V από τον υπολογιστή, μέσω της παράλληλης θύρας.

>          Back View          -----    Pin 10 - ACK
>           Male DB-25         |   |    Pin  9 - D7
>           Connector          |   |                           Pin 2 - D0
>                              v   v                           v   Pin 1 -
>     ~Strobe
>            ____________________________________________________________
>           /                                                            \
>           \     13  12  11  10   9   8   7   6   5   4   3   2   1     /
>            \                                                          /
>             \     25  24  23  22  21  20  19  18  17  16  15  14     /
>              \______________________________________________________/

Ο ακροδέκτης 1 είναι το Strobe( αρνητικής λογικής)

Οι ακροδέκτες 2-9 είναι τα σήματα του DATA BUS, όπως αυτά διαμορφώνονται, έπειτα από μία εντολή τύπου OUT στην παράλληλη θύρα.

Ο ακροδέκτης 10 είναι το ACK, δηλαδή τον ελέγχετε εσείς, παράγοντας interrupt.

Τα 18-25 είναι βραχυκυκλωμένα και είναι η γείωση.

Πιο αναλυτικά:

>     <= in   DB25    Cent    Name of         Reg
>     => out  pin     pin     Signal          Bit     Function Notes
>     ------  ----    ----    --------        ---     -----------------------------
>     =>       1       1      -Strobe         C0-     Set Low pulse >0.5 us to send
>     =>       2       2      Data 0          D0      Set to least significant data
>     =>       3       3      Data 1          D1      ...
>     =>       4       4      Data 2          D2      ...
>     =>       5       5      Data 3          D3      ...
>     =>       6       6      Data 4          D4      ...
>     =>       7       7      Data 5          D5      ...
>     =>       8       8      Data 6          D6      ...
>     =>       9       9      Data 7          D7      Set to most significant data
>     <=      10      10      -Ack            S6+ IRQ Low Pulse ~ 5 uS, after accept
>     <=      11      11      +Busy           S7-     High for Busy/Offline/Error
>     <=      12      12      +PaperEnd       S5+     High for out of paper
>     <=      13      13      +SelectIn       S4+     High for printer selected
>     =>      14      14      -AutoFd         C1-     Set Low to autofeed one line
>     <=      15      32      -Error          S3+     Low for Error/Offline/PaperEnd
>     =>      16      31      -Init           C2+     Set Low pulse > 50uS to init
>     =>      17      36      -Select         C3-     Set Low to select printer
>     ==      18-25   19-30,  Ground

### [2.2 \'Ελεγχος με Relay]{#ss2.2}

Το πιο απλό κύκλωμα που μπορεί να φτιάξει κανείς είναι το εξής:

>                                 Vcc
>                                   |
>                                   +------+
>                                   |    __|__
>                                 Relay   /^\  Diode 1N4002
>                                  Coil  /---\
>                                   |      |
>                                   +------+
>                                   |
>                                | / 
>                      4.7K    B |/  C
>     parallel port >-\/\/\/\/---|        NPN Transistor: BC547A or 2N2222A
>     data pi                    |\  E
>                                | V
>                                  |
>     parallel port >--------------+
>     ground pin                   |
>                               Ground

Συνδέστε το Vcc με τάση αντίστοιχη με τον τύπο του relay που έχετε βρει (5 ή 12V). Προφανώς το relay πρέπει να διαλέξετε να είναι επαρκές για την καφετιέρα σας.
Αυτό ίσως εξηγεί τους κακούς καφέδες: Οι barmen συχνά κάνουν το λάθος να βάζουν το relay αντί στον συλλέκτη (C), στον εκπομπό (E) του τρανζίστορ, πολώνοντάς το
έτσι με λάθος τρόπο. Η δίοδος 1N4002 είναι για να προστατεύει το τρανζίστορ από τα ανάστροφα ρεύματα του Relay, όταν το ρεύμα σε αυτό αλλάζει. Εάν δεν την
βάλετε, λογικά το τρανζίστορ θα γίνει πιο μαύρο και θα μυρίζει.

### [2.3 \'Ελεγχος με TRIAC \#1]{#ss2.3}

Εάν θέλετε ένα απλό κύκλωμα μπορείτε να χρησιμοποιήσετε ένα Motorola MOC301\[012\] (οδηγός για TRIAC), μαζί με ένα γενικής χρήσης TRIAC όπως το SC141D. Το
πλεονέκτημα αυτού του κυκλώματος είναι ότι δεν χρειάζεται τάση τροφοδοσίας.

Για μη επαγωγικό φορτίο το κύκλωμα είναι ως εξής:

>            270     1 +-------+ 6    180
>       +5v -VAVAVA-----+       +----VAVAVA-----+-------------- Line Hot
>                     2 |  MOC  |               |
>       TTL in ---------+ 3012  +nc            VA  SC141D
>                       |       | 4           / |
>                     nc+       +------------/  |
>                       +-------+               +----\/\/\/---- Line Neutral
>                                                     LOAD

Εάν πρόκειται να δουλέψετε με 220V, προτιμήστε ένα 3021. Εάν έχετε επαγωγικό φορτίο ενδείκνυται να βάλετε bypass πυκνωτές, δείτε σχετικά Motorola Application
Note AN-780. Οι καφετιέρες είναι κυρίως ωμικά φορτία (το θερμαντικό νήμα) και όχι επαγωγικά (όπως είναι πχ ένα μοτέρ) αλλά επειδή ποιος ξέρει τι καφετιέρα
έχετε\...

### [2.4 \'Ελεγχος με TRIAC \#2]{#ss2.4}

>     +5VDC
>     |    180                      180            2.2k
>     +---/\/\/\----+-----+   +----/\/\/-+--/\/\/\---+-------> 120V
>                   |    1|   |6         |           |         Hot
>                   |    +=====+         |           | MT1
>                   |    | MC  | TRIAC   |          +-+
>                   |    | 3032| Driver  |        G | | TRIAC
>                   |    +=====+         |         /| |
>                   \    2|   |4         |        / +-+
>            2N3904  |----+   |          |        |  | MT2
>                   /     |   +--------- | -------+  |
>                  V      \              |        |  |
>                  |      /              |        \  |
>                  |      \ 43    .01u  ---   10k /  |
>                  |      /       500V  ---       \  |
>                  |      |              |        /  |
>                  +------+              |        |  |            Neutral
>                  |                     +--------+--+---o    o--> 120V
>                  /                                      load
>      >-/\/\--|  2N3904
>                  \
>                   V
>                   |
>                  ---
>                 ///
>     You should change resistors accordingly for 220V.

Περιγραφή κυκλώματος:

Το MC3032 είναι ένας οπτοαπομονωτής, κατάλληλος για οδήγηση TRIAC. Η αντίσταση των 180Ω ρυθμίξει το ρεύμα για τον εκπέμπον LED του οπτοαπομονωτή. Εάν
χρειάζεται, αλλάξτε την τιμή της αντίστασης για να πάρετε μία λογική τιμή ρεύματος (πχ 15 mA).

Δώστε σημασία στην ένδειξη 500V για τον πυκνωτή των .01μF. Σημειώσατε ότι δεν μπορείτε να ελέγξετε αυτό το κύκλωμα δίχως φορτίο. Το TRIAC δεν θα αλλάξει
αγωγιμότητα παρά μόνον εάν συνδεθεί με την πηγή παροχής εναλλασόμενου ρεύματος (δίκτυο) και με το φορτίο. Προσέξτε το φορτίο να μην είστε ΕΣΕΙΣ.


### [3. Λογισμικό]{#s3}

\'Εφτασεεεε\...

### [3.1 Πρόγραμμα σε C]{#ss3.1}

Φτιάξτε ένα εκτελέσιμο, που θα κάνει χοντρικά τα εξής:

-   Θα παίρνει τα κατάλληλα δικαιώματα για την διεύθυνση I/O, με αίτηση στον πυρήνα, μέσω της ioperm: πχ ioperm( BASE, range ,1);
-   θα εκτελεί το κατάλληλο out request, για να επιβάλει την σωστή τάση στην παράλληλη θύρα. πχ outb( 1, BASE );
-   Θα περιμένει κατάλληλο χρονικό διάστημα για να ψηθεί ο καφές, ( καλόν θα είναι αυτό να το διαβάζει από την γραμμή εντολών )
-   στην συνέχεια θα κλείνει την καφετιέρα. outb( 0 , BASE );
-   Προαιρετικά, θα δίνει πίσω την θύρα με ioperm( BASE, range, 0);

Όπου BASE = 0x3bc για /dev/lp0, 0x378 για /dev/lp1, και 0x278 για /dev/lp2, range=8.

Καλόν θα είναι να το κάνετε setuid, για να μπορεί όλος ο κόσμος να φτιάχνει καφέ.

### [3.2 Σαν device driver]{#ss3.2}

Δεν έχετε παρά να διαβάσετε το kernel hacker\'s guide, να υλοποιήσετε έναν device driver (μπορεί να είναι και user space). Πλιιζ, κάνετέ το module, να μην
κάνουμε compile όλη την ώρα. Μετά θα γράφετε:

    echo baryglykos >/dev/coffee

Και θα έχετε ζεστό καφέ σε 1 λεπτό. Θυμηθείτε να δώσετε τα σωστά permission στο /dev/coffee, ανάλογα με το εάν θέλετε να φτιάχνει καφέ μόνο ο root ή όχι.

Το πλεονέκτημα αυτής της μεθόδου είναι ότι επιτρέπει να χρησιμοποιηθεί το ACK της παράλληλης θύρας, ώστε οι \"έξυπνες\" καφετιέρες να μπορούν να παράγουν
interrupt.

Αφήνεται σαν άσκηση.

### [3.3 Διασύνδεση με Internet]{#ss3.3}

Αφού έχετε υλοποιήσει το πρόγραμμα σε C (βλέπε παραπάνω), δεν έχετε παρά να φτιάξετε ένα cgi τσι σειράς (ας είναι και β\' διαλογής), που θα καλεί το
προγραμματάκι για να φτιάξει τον καφέ. Τι web server? apache φυσικά\...


### [4. Συμπτώματα υπερδοσολογίας]{#s4}

-   ευεξία
-   νευρικότητα
-   ταχυκαρδία ή καρδιακή αρυθμία
-   τέντωμα μυών
-   δυσκοιλιότητα :-(


### [5. Επεκτάσεις]{#s5}

Αυτές είναι μερικές ιδέες που είχαμε:

-   Με λίγη προσπάθεια η ηλεκτρονική καφετιέρα μπορεί να επεκταθεί ώστε να υποστηρίζει τοστ, παστίτσιο, κουραμπιέδες κλπ.
-   Cluster με 8 καφετιέρες. Αυτό θα επιτρέπει να έχετε καφέ ακόμη και όταν \"πέφτει\" η μία καφετιέρα, με αντίστοιχη μείωση της απόδοσης. Η παράλληλη
    ανυσματική καφετιέρα είναι στα υπ\' όψιν.
-   Εάν θέλουμε πλήρη αυτοματοποίηση χρειαζόμαστε επιπρόσθετα κυκλώματα και αισθητήρες, ώστε να ελέγχουμε την ροή του νερού, την θερμοκρασία του, την ποσότητα
    του καφέ κλπ.
-   Στο μέλλον σκεφτόμαστε να υλοποιήσουμε και SNMP. Α μα πια, αυτές οι καφετιέρες να μην έχουν έθερνετ ιντερφέις\...
-   Σειριακή καφετιέρα στα 115Kbps.


### [6. Αναφορές]{#s6}

-   [Χριστόφορος Κολόμβος](http://sunsite.unc.edu/expo/1492.exhibit/c-Columbus/columbus.html). Το πραγματικό του όνομα είναι Cristobal Colon. \'Εφερε πρώτος τον
    καφέ από την Αμερική, την οποία πρώτος (από τους Ευρωπαίους) ανακάλυψε το 1492.
-   <http://daisy.uwaterloo.ca/~alopez-o/caffaq.html> Το απόλυτο κείμενο σχετικά με τον καφέ. Βασικά, είναι το coffee-FAQ από το Internet.
-   <http://lonestar.texas.net/~andrew/f_pc_.htm> Πολλά κυκλώματα σε ASCII, ανάμεσά τους και με έλεγχο από παράλληλη
-   <http://shell.rmi.net/~hisys/parport.html> \'Οτι θέλατε να μάθετε για την παράλληλη θύρα και δεν τολμούσατε να ρωτήσετε.
-   <http://sunsite.unc.edu/LDP/HOWTO/mini/IO-Port-Programming> Προγραμματισμός I/O θυρών σε Linux.
-   <http://www.redhat.com:8080/HyperNews/get/khg.html> Πώς να γράψετε τους δικούς device drivers. Εμπρός λοιπόν, τι κάθεστε;
-   <http://www.hut.fi/Misc/Electronics/circuits/parallel_output.html> Ας το θέσουμε έτσι: εάν ασχολείστε με ηλεκτρονικά, οι σελίδες του Tomi Engdahl είναι
    must.
-   <http://www.yahoo.com/Computers_and_Internet/Internet/Entertainment/Interesting_Devices_Connected_to_the_Net/Coffee_Machines/> Καφετιέρες on-line. Δυστυχώς,
    δεν έχει συγκριτικά test.
-   <http://www.cs.su.oz.au/~bob/coffee.html> Η εν λόγω συσκευή προσφέρει μόνο cappuccino. \'Αντε αναβαθμίστε το, ρε παιδιά.
-   <http://einstein.et.tudelft.nl/~janssen/> Ζεστός ολλανδικός καφές
-   http://circe.chinalake.navy.mil/cgi-bin/spion/snapit.cgi
-   http://www.cl.cam.ac.uk/coffee/coffee.html
-   http://www.menet.umn.edu/coffeecam/

