Ετικέτες
- A ΓΥΜΝΑΣΙΟΥ
- Arduino
- Moon Camp Challenge- ESA
- PROJECT
- PYTHON
- PYTHON B ΕΠΑΛ
- ΑΕΠΠ
- Β ΓΥΜΝΑΣΙΟΥ
- ΒΑΣΙΚΑ ΘΕΜΑΤΑ ΠΛΗΡΟΦΟΡΙΚΗΣ
- Γ ΓΥΜΝΑΣΙΟΥ
- ΕΚΠΑΙΔΕΥΤΙΚΗ ΡΟΜΠΟΤΙΚΗ
- ΕΦΑΡΜΟΓΕΣ ΠΛΗΡΟΦΟΡΙΚΗΣ Α
- Εγκατάσταση
- Νέα της Τεχνολογίας
- ΠΟΛΥΜΕΣΑ - ΔΚΤΥΑ Γ
- Πληροφοριακά Συστήματα σε Επιχειρήσεις και Οργανισμούς
- ΣΥΣΤ. ΔΙΑΧ. ΒΑΣΕΩΝ ΔΕΔΟΜΕΝΩΝ
- ΣΧ. ΚΑΙ ΑΝ. ΙΣΤΟΤΟΠΩΝ
- ΣΧ. ΚΑΙ ΑΝ. ΙΣΤΟΤΟΠΩΝ Γ ΕΠΑΛ
- Τεχνητή Νοημοσύνη στην Εκπαίδευση
- Υλικο και Δίκτυα Η/Υ Β ΕΠΑΛ
- διαχ. και συντήρηση Υ.Σ.
Παρασκευή 30 Οκτωβρίου 2026
Τρίτη 27 Οκτωβρίου 2026
Παρασκευή 8 Σεπτεμβρίου 2023
ΑΥΤΟΜΑΤΟΣ ΕΛΕΓΧΟΣ ΔΙΑΡΡΟΗΣ ΝΕΡΟΥ
Σήμερα, με δεδομένη την κλιματική κρίση, το νερό γίνεται όλο και πιο πολύτιμο αγαθό. Αυτό το καλοκαίρι η Ευρώπη κατέγραψε τρομακτική μείωση της στάθμης των ποταμών της, εξαιτίας της ανομβρίας. Συνεπώς, οι όποιες διαρροές στο σύστημα ύδρευσης των οικιών, των βιομηχανιών ή των συστημάτων ποτίσματος των χωραφιών κλπ, είναι αναγκαίο να εντοπίζονται και να εξουδετερώνονται άμεσα. Διαφορετικά, γίνεται σπατάλη νερού σε μία περίοδο κρίσιμη σε ό,τι αφορά τα υδάτινα αποθέματα. Επιπλέον, αν η διαρροή δεν γίνει έγκαιρα αντιληπτή, ο λογαριασμός ύδρευσης θα επιβαρυνθεί με μεγάλα ποσά, συνεπώς θα υπάρξει και οικονομική επιβάρυνση του ιδιοκτήτη. Τέλος, διαρροές μέσα στο οίκημα, συνεπάγονται σοβαρές ζημιές (π.χ. δάπεδα, ταβάνι, τοίχοι κλπ).
Η λύση που προτείνεται είναι η συνεχής παρακολούθηση της τιμής της ροής του ύδατος εντός μιας εγκατάστασης (π.χ. σωληνώσεις οικίας), χρησιμοποιώντας μετρητή ροής νερού για Arduino, τοποθετημένο αμέσως μετά το υδρόμετρο. O Έλεγχος θα γίνεται από το Arduino. Κάθε φορά που θα υπάρχει ροή, ένας μετρητής θα μετράει κάθε δευτερόλεπτο την διάρκειά της. Αν η ροή μηδενιστεί, ο μετρητής θα μηδενίζεται . Ωστόσο, αν η ροή καταγράφεται συνεχώς για ένα χρονικό διάστημα που ορίζει ο χρήστης χωρίς να μηδενίζεται, σημαίνει ότι υπάρχει διαρροή, οπότε θα δίνεται εντολή σε μία βαλβίδα και θα σταματά η παροχή νερού αμέσως μετά το υδρόμετρο, ειδοποιώντας τον ιδιοκτήτη με διάφορους τρόπους. Ο χρήστης, πατώντας ένα κουμπί, κάνει reset οπότε η βαλβίδα ανοίγει και ο μετρητής ξεκινά να μετράει τη διάρκεια της ροής όπως πριν.
Παρακάτω δίνεται ο κώδικας για Arduino:
volatile int flow_frequency; // Measures flow sensor pulses
unsigned char flowsensor = 2; // Sensor Input
unsigned long currentTime;
unsigned long cloopTime;
int flow_counter=0;
int valve_close=9;
const int resetbuttonPin = 7;
const int resetPin = 5;
int resetbuttonState = 0;
void flow () // Interrupt function
{
flow_frequency++;
}
void setup() {
// put your setup code here, to run once:
pinMode(valve_close, OUTPUT);
pinMode(flowsensor, INPUT);
pinMode(resetbuttonPin, INPUT);
pinMode(resetPin, OUTPUT);
digitalWrite(flowsensor, HIGH);
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(flowsensor), flow, RISING); // Setup Interrupt
currentTime = millis();
cloopTime = currentTime;
}
void loop() {
resetbuttonState = digitalRead(resetbuttonPin);
digitalWrite(valve_close, HIGH);// THE VALVE RELAY HAS NEGATIVE LOGIC
digitalWrite(resetPin, LOW);
// check if the pushbutton is pressed. If it is, the buttonState is HIGH:
if (resetbuttonState == HIGH) {
// open the valve:
digitalWrite(resetPin, HIGH);
digitalWrite(valve_close, HIGH);// THE VALVE RELAY HAS NEGATIVE LOGIC
delay(6000) ;
digitalWrite(resetPin, LOW); }
currentTime = millis();
// Every second, calculate and print litres/hour
if(currentTime >= (cloopTime + 1000))
{
cloopTime = currentTime; // Updates cloopTime
if(flow_frequency != 0){
flow_counter++; //increase counter every second
flow_frequency = 0;
Serial.print(flow_counter);
if (flow_counter > 20){
Serial.print("Water Leakage");
digitalWrite(valve_close, LOW );// THE VALVE RELAY HAS NEGATIVE LOGIC
digitalWrite(resetPin, LOW);
delay(6000) ;
digitalWrite(valve_close, LOW);
}
}
else {
flow_counter = 0; // Reset Counter
digitalWrite(valve_close, LOW);
Serial.print(flow_counter);
Serial.print(valve_close);
}
}
}
Δευτέρα 6 Μαρτίου 2023
Φωτοαντίσταση - Arduino
H τιμή μιας φωτοαντίστασης μεταβάλλεται με το φως. Δηλαδή όσο πέφτει φως πάνω της ελευθερώνονται ηλεκτρόνια, συνεπώς γίνεται πιο αγώγιμη, επομένως η τιμή της (σε Ω)μειώνεται. Αυτό σημαίνει, φυσικά, ότι η τιμή του ρεύματος που την διαρρέει αυξάνει (Ι=V/R). Προφανώς η πτώση τάσης V στην φωτοαντίσταση μειώνεται. Η πτώση τάσης στην κανονική αντίσταση, όμως, αυξάνεται, αφού η αντίσταση διαρρέεται από περισσότερο ρεύμα.
Στο παρακάτω πρόβλημα στόχος είναι να δίνεται εντολή από το Arduino να ανάψει μία LED, όταν η τιμή του ρεύματος πέσει κάτω από μία τιμή.
Στο κύκλωμα ελέγχου βάζουμε μία φωτοαντίσταση και μία αντίσταση 10KΩ σε σειρά.
- Το άκρο της φωτοαντίστασης συνδέεται με τα 5V του Arduino.
- Το κοινό άκρο αντίστασης και φωτοαντίστασης συνδέεται στην αναλογική είσοδο A0 του Arduino.
- Το άκρο της αντίστασης συνδέεται με την γείωση.
Ο παρακάτω κώδικας δίνει εντολή να ανάψει η LED (συνδέστε κύκλωμα LED στο pin 3) όταν η τιμή που διαβάζει η αναλογική είσοδος A0 (αντιστοίχιση τάσης 0-5V σε αριθμό από 0 ως 1024) είναι μικρότερη από 200 (περίπου 0,97V). Μετράμε την πτώση τάσης στην κανονική αντίσταση.
Η τιμή 200 μπορεί να αλλάξει, αναλόγως τη φωτεινότητα που θέλουμε, παρακολουθώντας τις τιμές της σειριακής.
int presistor = A0; // Photoresistor at Arduino analog pin A0
int ledPin=3; // Led pin at Arduino pin 9
//Variables
int value; // Store value from photoresistor (0-1023)
void setup(){
pinMode(ledPin, OUTPUT); // Set lepPin - 9 pin as an output
pinMode(presistor, INPUT);// Set pResistor - A0 pin as an input (optional)
Serial.begin(9600);
}
void loop(){
value = analogRead(presistor);
Serial.print(value);
Serial.println();
//You can change value "25"
if (value > 200
){
digitalWrite(ledPin, LOW); //Turn led off
}
else{
digitalWrite(ledPin, HIGH); //Turn led on
}
}
Σάββατο 18 Φεβρουαρίου 2023
Αισθητήρας ροής νερού (Gravity: Water Flow Sensor (1/2") For Arduino)
O αισθητήρας ροής διαθέτει μία φτερωτή που παρεμβάλλεται στην ροή του νερού μέσα στον σωλήνα ύδρευσης. Όταν γυρίζει η φτερωτή παράγει ηλεκτρικούς παλμούς, χάρη στο φαινόμενο Χολ(Hall).
Από την συχνότητα αυτών των παλμών μπορούμε να έχουμε εικόνα σχετικά με την ποσότητα του νερού που περνάει μέσα από τον σωλήνα στη μονάδα του χρόνου.
Από την άλλη, αν δεν υπάρχει ροή, δεν δημιουργούνται παλμοί.
Στο παρακάτω πρόγραμμα, αν υπάρχουν παλμοί (δηλαδή ροή νερού) αυξάνουμε ένα μετρητή κάθε δευτερόλεπτο. Αν δεν υπάρχουν, ο μετρητής μηδενίζεται. Στόχος είναι να καταγραφεί η διάρκεια ροής, ώστε αν αυτή ξεπερνάει κάποιο χρονικό διάστημα, να δίνεται η πληροφορία διαρροής από κάποιο σημείο του δικτύου.
Το κύκλωμα φαίνεται παρακάτω:
- Το κόκκινο καλώδιο συνδέεται με τάση 5V
- Το μαύρο με την γείωση
- Το πράσινο σε ένα pin (στο συγκεκριμένο το 2) του Arduino που έχει οριστεί ως είσοδος.
Το πρόγραμμα φαίνεται παρακάτω:
volatile int flow_frequency; // Measures flow sensor pulses
// Calculated litres/hour
unsigned char flowsensor = 2; // Sensor Input
unsigned long currentTime;
unsigned long cloopTime;
int flow_counter=0;
int valve=5;
void flow () // Interrupt function
{
flow_frequency++;
}
void setup() {
// put your setup code here, to run once:
pinMode(flowsensor, INPUT);
pinMode(valve, OUTPUT);
digitalWrite(flowsensor, HIGH);
digitalWrite(valve, LOW);
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(flowsensor), flow, RISING); // Setup Interrupt
currentTime = millis();
cloopTime = currentTime;
}
Πέμπτη 12 Μαΐου 2022
Τετάρτη 11 Μαΐου 2022
Environmental effects of a forest fire and mitigation measures.
H συμμετοχή του Γυμνασίου Δροσιάς στον διαγωνισμό "Climate Detectives" της ESA:
Environmental effects of a forest fire and mitigation measures. - YouTube
Σάββατο 23 Απριλίου 2022
Environmental effects of a forest fire and mitigation measures - Climate Detectives- ESA
Please find the presentation of Drosoulites team here
Τετάρτη 29 Δεκεμβρίου 2021
Η έννοια της καταγραφής ενός γεγονότος (σημαία - flag)
Στο προηγούμενο παράδειγμα με το κουμπί, όσο πατάμε το κουμπί, ανάβει η LED.
Συνήθως, θέλουμε να πατάμε ένα κουμπί ΟΝ μία φορά και να λειτουργεί συνέχεια μια συσκευή.
Για να γίνει αυτό, χρησιμοποιείται μια μεταβλητή (π.χ. flag) που αρχικά έχει μία συγκεκριμένη τιμή (π.χ. 0) και όταν συμβεί ένα γεγονός, παίρνει μιαν άλλη τιμή (π.χ. 1).
Είναι σαν τον επόπτη γραμμών που σηκώνει την σημαία όταν η μπάλα έχει βγει εκτός γραμμής.
Προφανώς, το πάτημα του κουμπιού είναι στιγμιαίο, αλλά η τιμή της μεταβλητής μόνιμη.
Άρα, μπορούμε να πούμε ότι το flag θα παίρνει την τιμή 1 όταν πατηθεί το κουμπί. Αν πούμε ότι η LED θα ανάβει όσο η μεταβλητή flag έχει τιμή 1, τότε πετυχαίνουμε αυτή να ανάβει μόνιμα.
Ο κώδικας για να γίνει το παραπάνω σενάριο, δίνεται ακολούθως:
const int buttonPin = 2; // the number of the pushbutton pin
const int ledPin = 3; // the number of the LED pin
int buttonState = 0;
int flag=0;
void setup() {
// put your setup code here, to run once:
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
}
void loop() {
// put your main code here, to run repeatedly:
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);
// check if the pushbutton is pressed. If it is, the buttonState is HIGH:
if (buttonState == HIGH) {
// turn LED on:
flag=1;
while (flag ==1) {
digitalWrite(ledPin, HIGH);
}}
else {
digitalWrite(ledPin, LOW);
}
}
Το αποτέλεσμα φαίνεται εδώ:
Για να σβήνει η LED, πρέπει να προσθέσουμε νέο κουμπί OFF που, όταν πατηθεί, η τιμή του flag θα γίνεται 0. Αυτό, προφανώς, θα συμβαίνει μέσα στο while.
Τρίτη 28 Δεκεμβρίου 2021
Κουμπί (button) του Arduino
Είναι φορές που ο έλεγχος πρέπει να γίνεται χειροκίνητα.
Π.χ. όταν πατάει ένα κουμπί ο χρήστης να ξεκινάει ένας κινητήρας, ή αντίθετα να σταματάει.
Το κουμπί του arduino είναι κανονικά ανοικτός διακόπτης μόνο στα διαγώνια ποδαράκια!
Στα ποδαράκια που βρίσκονται στην ίδια πλευρά είναι κλειστός διακόπτης
Άσκηση
Να γίνεται έλεγχος LED με χρήση κουμπιού του Arduino. Να ανάβει όταν πατιέται το κουμπί και να σβήνει όταν δεν πατιέται.
Συνδέουμε τα 5V του arduino σε ένα ποδαράκι του κουμπιού και το διαγώνιο ποδαράκι το ενώνουμε με μία ψηφιακή είσοδο του arduino (π.χ. την 2). Στο τελευταίο αυτό ποδαράκι συνδέουμε και μία αντίσταση 10 ΚΩ, το άλλο άκρο της οποίας καταλήγει στην γείωση (αν δεν υπήρχε η αντίσταση, πάντα η τάση της γείωσης 0V θα κατέληγε στην είσοδο 3, ενώ με κλειστό διακόπτη θα γινόταν βραχυκύκλωμα.)
Σε μία ψηφιακή έξοδο του Arduino (π.χ. την 3 ) συνδέουμε όπως έχουμε ήδη διδαχθεί στο πρώτο μάθημα (βλ. παλιότερες αναρτήσεις) μία LED.
Το κύκλωμα για τη σύνδεση του κουμπιού φαίνεται παρακάτω:
Σάββατο 4 Δεκεμβρίου 2021
Έλεγχος κυκλωμάτων ισχύος με Arduio
Υπάρχουν περιπτώσεις όπου είναι αναγκαίο να ελεγχθούν κυκλώματα μεγαλύτερης ισχύος από όση μπορεί να παρέχει ένα Arduino.
Αφενός το ρεύμα και η τάση που παράγει το Arduino είναι ανεπαρκή για να ελέγξουν τέτοια κυκλώματα, αφετέρου αν το ισχυρό ρεύμα ή η τάση τέτοιων κυκλωμάτων έρθουν σε επαφή με το Arduino, θα το καταστρέψουν.
Για το λόγο αυτό, υπάρχει ο ηλεκτρονόμος (relay - ρελέ) που ανοιγοκλείνει ένα διακόπτη, αναλόγως τις εντολές που λαμβάνει από το arduino (5V), αλλά αυτός ο διακόπτης ελέγχει ένα άλλο κύκλωμα ισχύος, που είναι εντελώς ανεξάρτητο από το Arduino.
Κυριακή 21 Νοεμβρίου 2021
Σάββατο 20 Νοεμβρίου 2021
Μέτρηση στάθμης νερού
Ο αισθητήρας μέτρησης στάθμης νερού παρουσιάζεται στην παρακάτω φωτογραφία:
Παρατηρήστε ότι έχει τρία pin.
Το ένα έχει σύμβολο - και συνδέεται με τη γείωση του Arduino.
Το μεσαίο έχει σύμβολο + και συνδέεται με τα 5V του Arduino.
To τρίτο έχει σύμβολο S και συνδέεται με μία αναλογική είσοδο (π.χ. A5) του Arduino.
O κώδικας για ανάγνωση του αισθητήρα στάθμης νερού δίνεται παρακάτω:
int water=A5;// Arduino pin for water level sensor
int wl=0; // variable that holds the water level value
void setup() {
// put your setup code here, to run once
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
wl=analogRead(water);
Serial.print ("Water Level: ");
Serial.println(wl);
delay(1000);
}
Αρχικά ορίζεται η μεταβλητή water που κρατάει την τιμή της αναλογικής εισόδου (Α5) που διαβάζουμε.
Η ακέραια μεταβλητή wl θα δεχθεί την τιμή της στάθμης του νερού.
Ακολούθως διαβάζουμε την σειριακή με ρυθμό 9600 bits/sec
Οι τιμές παρουσιάζονται στην οθόνη επιλέγοντας Εργαλεία-Παρακολούθηση Σειριακής.
Παρακολουθήστε τις τιμές και αποφασίστε από πιο σημείο και κάτω θα θεωρείτε ότι η δεξαμενή θα είναι γεμάτη και πότε θα τη θεωρείτε άδεια.
Ασκήσεις
1. Να κάνετε ένα σύστημα το οποίο όταν θα ξεπερνάει το νερό μια συγκεκριμένη στάθμη να ανάβει ένα LED
2. Χρησιμοποιήστε και έναν αισθητήρα θερμότητας LM35 και όταν η στάθμη είναι πάνω από μία τιμή και η θερμοκρασία πάνω από μια συγκεκριμένη τιμή, τότε να ανάβει ένα LED
Πέμπτη 14 Μαΐου 2020
Έλεγχος φωτεινών σηματοδοτώνκαι προστασία σε περίπτωση δασικής πυρκαγιάς
Η λύση που προτείνουμε στοχεύει στον έλεγχο λειτουργίας των φωτεινών σηματοδοτών σε περίπτωση δασικής πυρκαγιάς, ώστε να απεγκλωβιστούν όσοι είναι σε οδό που διέρχεται από δάσος (οδός 1) και καταλήγει σε αστικό ιστό (οδός 2). Στη διασταύρωση όπου καταλήγει η οδός που διέρχεται από δάσος υπάρχουν φανάρια. Προτεραιότητα έχουν όσοι κινούνται στην οδό που είναι σε αστικό ιστό.
Ο κρουνός , αν έχει ενεργοποιηθεί, θα σταματάει μόνο χειροκίνητα. Αυτό διότι αν καούν οι αισθητήρες, δε θα δίνουν ένδειξη, οπότε το σύστημα ελέγχου θα θεωρεί ότι η φωτιά έσβησε .
Υπάρχει και ανεξάρτητος διακόπτης ενεργοποίησης του κρουνού, σε περίπτωση αποτυχίας του συστήματος αυτομάτου ελέγχου.
Το πρόγραμμα δίνεται παρακάτω:
//trsffic lights
int citygreen = 7;
int cityyellow = 2;
int cityred = 3;
int forestgreen = 4;
int forestyellow = 5;
int forestred = 6;
int flamepin = 8;
int flameval;
int carcount = 0;
//ultrasonic
int trig = 9;
int echo = 10;
long duration;
int distance;
int dist;
int distold;
//temperature
int val;
int temp = 1; //Analog input 1
float mv;
float c;
float celcius;
//fire
int fireflag = 0;
//water
int water = 11;
//reset button
int button = 12;
int buttonval = 0;
// manual button
int manual=13;
int manualval=0;
void setup() {
// initialisation of I/Os
pinMode(citygreen, OUTPUT);
pinMode(cityyellow, OUTPUT);
pinMode(cityred, OUTPUT);
pinMode(forestgreen, OUTPUT);
pinMode(forestyellow, OUTPUT);
pinMode(forestred, OUTPUT);
pinMode(trig, OUTPUT);
pinMode (echo, INPUT);
pinMode (flamepin, INPUT);
pinMode(water, OUTPUT);
pinMode (button, INPUT);
pinMode (manual, INPUT);
Serial.begin(9600);
}
void loop() {
// initialisation of the traffic ligts
digitalWrite (citygreen, HIGH);
digitalWrite (cityyellow, LOW);
digitalWrite (cityred, LOW);
digitalWrite (forestgreen, LOW);
digitalWrite (forestyellow, LOW);
digitalWrite (forestred, HIGH);
carcount = 0;
Serial.print ("Distance: ");
Serial.println(dist);
Serial.print ("carcount: ");
Serial.println(carcount);
Serial.print ("buttonval: ");
Serial.println(buttonval);
manualval = digitalRead(manual);
if (manualval == HIGH) {
fireflag = 1;
}
//checking the temperature sensor
celcius = temp_sensor();
if (celcius > 30) {
delay(2000);
celcius = temp_sensor();
if (celcius > 30) {
fireflag = 1;
}
manualval = digitalRead(manual);
if (manualval == HIGH) {
fireflag = 1;
}
}
//checking the flame sensor
flameval = digitalRead(flamepin); //checking for fire indication
if (flameval == HIGH) {
delay (3000);
flameval = digitalRead(flamepin); //doublechecking for fire
if (flameval == HIGH) {
fireflag = 1;
}
manualval = digitalRead(manual);
if (manualval == HIGH) {
fireflag = 1;
}
}
Serial.println(fireflag);
if (fireflag == 1) {
digitalWrite (water, HIGH); // start throwing water, if fire alarm is on
}
else
{
digitalWrite (water, LOW);
}
//check if reset button is pressed.
buttonval = digitalRead(button);
if (buttonval == HIGH) {
fireflag = 0;
}
// checking the existance of the car under the sensor
dist = ultrasonic();
if (dist < 10 && fireflag == 0) {
delay (3000);
// double checking the exestance of the car under the sensor to avoid wrong entry
dist = ultrasonic();
manualval = digitalRead(manual);
if (manualval == HIGH) {
fireflag = 1;
}
if (dist < 10 && fireflag == 0) {
delay (4000);
digitalWrite (citygreen, LOW);
digitalWrite (cityyellow, HIGH);
delay (2000);
digitalWrite (cityyellow, LOW);
digitalWrite (cityred, HIGH);
delay (1000);
digitalWrite (forestgreen, HIGH);
digitalWrite (forestred, LOW);
delay (3000);
digitalWrite (forestyellow, HIGH);
digitalWrite (forestgreen, LOW);
delay(2000);
digitalWrite (forestyellow, LOW);
digitalWrite (forestred, HIGH);
delay (1000);
}
}
manualval = digitalRead(manual);
if (manualval == HIGH) {
fireflag = 1;
}
// checking the existance of car under the sensor with fire alarm on.
if (dist < 10 && fireflag != 0) {
digitalWrite (citygreen, LOW);
digitalWrite (cityyellow, HIGH);
delay (2000);
digitalWrite (cityyellow, LOW);
digitalWrite (cityred, HIGH);
delay (1000);
digitalWrite (forestgreen, HIGH);
digitalWrite (forestred, LOW);
delay (3000);
dist = ultrasonic();
buttonval = digitalRead(button);
if (buttonval == HIGH) {
fireflag = 0;
}
while ( dist < 10 && carcount <= 3 && fireflag != 0) {
delay (4000);
carcount++;
buttonval = digitalRead(button);
if (buttonval == HIGH) {
fireflag = 0;
}
dist = ultrasonic();
Serial.print ("carcount: ");
Serial.println(carcount);
//check if reset button is pressed.
buttonval = digitalRead(button);
}
if (carcount <= 3) {
digitalWrite (forestgreen, LOW);
digitalWrite (forestyellow, HIGH);
delay (2000);
}
}
//after adequate time, the city road cars must be released
//and the drivers must drive without traffic lights, with the
//drivers of the forest road giving way.
if (carcount > 3) {
while (fireflag != 0 ) {
digitalWrite (citygreen, LOW);
digitalWrite (cityyellow, LOW);
digitalWrite (cityred, LOW);
digitalWrite (forestgreen, LOW);
digitalWrite (forestred, LOW);
digitalWrite (forestyellow, HIGH);
delay (2000);
digitalWrite (forestyellow, LOW);
delay (2000);
flameval = digitalRead(flamepin); //checking for fire indication
Serial.println(flameval);
celcius = temp_sensor();
//check if reset button is pressed.
buttonval = digitalRead(button);
if (buttonval == 1) {
fireflag = 0;
}
}
}
} //end of program
//function ultrasonic()
int ultrasonic() // function declaration
{
digitalWrite(trig, LOW);
delayMicroseconds (2);
digitalWrite(trig, HIGH);
delayMicroseconds (10);
digitalWrite(trig, LOW);
duration = pulseIn(echo, HIGH);
distance = duration * 0.034 / 2;
Serial.print ("Distance: ");
Serial.println(distance);
return distance;
}
// function temp_sensor
float temp_sensor()
{
val = analogRead (temp);
float mv = (val / 1024.0) * 5000; //conversion to Celcius Degrees
float c = mv / 10; //conversion to Celcius Degrees
Serial.print("Temperature= ");
Serial.print(c);
Serial.print("oC");
Serial.println();
return c;
}
Δευτέρα 4 Νοεμβρίου 2019
Αισθητήρας Φλόγας
Ο αισθητήρας φλόγας διαθέτει τέσσερις ακροδέκτες. Ένας συνδέεται με τη γείωση, ένας με την πηγή 5V και ένας συνδέεται σε μία ψηφιακή είσοδο του Arduino.
Αν θέλουμε να έχουμε και σειριακή μέτρηση για περισσότερη ακρίβεια, μπορούμε να συνδέσουμε τον αντίστοιχο ακροδέκτη με μία αναλογική είσοδο του Arduino (π.χ. A0)
Στο παρακάτω παράδειγμα, χρησιμοποιείται μόνο η ψηφιακή είσοδος (η 13)
στην έξοδο 3 συνδέεται μία αντίσταση 220Ω και μία LED. Το παρακάτω πρόγραμμα, θα ανάψει τη LED μόνο όταν η ψηφιακή είσοδος 13 έχει λογικό 1(High), δηλαδή έχει ανιχνευτεί φλόγα.:
int led = 13; // define the LED pin
int DPin = 3; // KY-026 digital interface
int DVal1; // digital readings
void setup() {
// put your setup code here, to run once:
pinMode(led, OUTPUT);
pinMode(DPin, INPUT);
}
void loop() {
// put your main code here, to run repeatedly:
DVal1 = digitalRead(DPin);
if(DVal1 == HIGH) // if flame is detected
{
digitalWrite(led, HIGH); // turn ON Arduino's LED
}
else
{
digitalWrite(led, LOW); // turn OFF Arduino's LED
}
}
Ασκήσεις
Κυριακή 20 Οκτωβρίου 2019
Αισθητήρας Υπερήχων
Είναι κύματα αέρα που τρέχουν με την ταχύτητα του ήχου (340 m/sec)
O αισθητήρας υπερήχων στέλνει υπερήχους που ανακλώνται σε ένα αντικείμενο και επιστρέφουν.
Μετρώντας το χρόνο που απαιτείται για να επιστρέψουν, βρίσκουμε την απόσταση του αντικειμένου πάνω στο οποίο ανακλάστηκε το κύμα των υπερήχων.
Αν t είναι ο απαιτούμενος χρόνος ώσπου να επιστρέψει το σήμα,πρέπει να ληφθεί υπόψη ότι ο υπέρηχος πήγε ως το αντικείμενο και επέστρεψε! Συνεπώς είναι διπλάσιος από το χρόνο που έκανε να φτάσει στο αντικείμενο. Άρα ο χρόνος μέχρι το αντικείμενο είναι t/2.
με γνωστή την ταχύτητα του ήχου (340 m/sec), βρίσκουμε την απόσταση S:
int trig=3;
int echo=5;
long duration;
int distance;
void setup() {
// put your setup code here, to run once:
pinMode(trig, OUTPUT);
pinMode (echo, INPUT);
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(trig,LOW);
delayMicroseconds (2);
digitalWrite(trig,HIGH);
delayMicroseconds (10);
digitalWrite(trig,LOW);
duration=pulseIn(echo,HIGH);
distance=duration*0.034/2;
Serial.print ("Distance: ");
Serial.println(distance);
delay(1000);
}
Ασκήσεις
Κυριακή 13 Οκτωβρίου 2019
Μέτρηση θερμοκρασίας με arduino
Τον τοποθετούμε έτσι ώστε να βλέπουμε το επίπεδο μέρος του.
Το αριστερό ποδαράκι συνδέεται με τα 5 V
Το δεξί ποδαράκι συνδέεται με τη γείωση (GND)
To κεντρικό ποδαράκι συνδέεται με την αναλογική είσοδο μέτρησης Α1 .
Ο παρακάτω κώδικας δίνει το πως θα διαβάζουμε την ένδειξη του αισθητήρα από την είσοδο 3 του Arduino UNO και πως η μέτρηση μετατρέπεται σε βαθμούς Κελσίου.
int val; //integer variable that will accept the value of temperature
int temp=1; // Number of port for temperature sensor reading
void setup() {
// put your setup code here, to run once:
Serial.begin (9600); // speed 9600 bits per sec
}
void loop() {
// put your main code here, to run repeatedly:
val= analogRead (temp);
float mv= (val/1024.0)*5000; //conversion to Celcius Degrees
float c=mv/10; //conversion to Celcius Degrees
Serial.print("Temperature= ");
Serial.print(c);
Serial.print("oC");
Serial.println();
delay (1000);
}
Αρχικά ορίζουμε μία ακέραιη μεταβλητή (val) που θα δεχθεί τη μέτρηση.
Ορίζουμε μία ακέραια μεταβλητή για τη θύρα εισόδοου (temp).
Δηλώνουμε ότι θέλουμε ταχύτητα εισόδου 9600 baud (bits per sec).
Διαβάζουμε τη θύρα τρία και τοποθετούμε την τιμή στη μεταβλητή val.
Κάνουμε μαθηματικούς υπολογισμούς για μετατροπή της τιμής σε βαθμούς Κελσίου.
Εμφανίζουμε την ένδειξη στην οθόνη ( Serial.print(c);)
Για να δούμε την τιμή πρέπει να πάμε Εργαλέια → Παρακολούθηση σειριακής.
Ο παρακάτω κώδικας επιδιώκει μόλις η θερμοκρασία ξεπεράσει τους 20 βαθμούς Κελσίου, να ανάβει ένα κόκκινο LED και να χτυπάει ένας buzzer.
if (c> 20.0){ digitalWrite(ledPin, .....); //Turn led on } else{ digitalWrite(ledPin, ....); //Turn led off }
Με βάση τις γνώσεις σας από την πρώτη άσκηση, κατασκευάστε το κύκλωμα και συμπληρώστε τον κώδικα σωστά.
Ερευνήστε στο διαδίκτυο και βρείτε τις εντολές ενεργοποίησης του buzzer (π.χ. για σήμα 1KHz ¨¨:
tone(buzzer, 1000);).
Προσοχή! Το κοντό ποδαράκι του Buzzer, πηγαίνει στη γείωση και το μακρύ σε μία ψηφιακή έξοδο του Arduino. Μεταξύ της ψηφιακής εξόδου παρεμβάλλεται αντίστασή 220 Ω.
Κυριακή 6 Οκτωβρίου 2019
Led που αναβοσβήνει
To Κύκλωμα περιλαμβάνει μία αντίσταση 330Ω συνδεδεμένη με την έξοδο 3 του Arduinο σε σειρά με μία LED.
(To μακρύ ποδαράκι της LED αντιστοιχεί στο +)
Το παρακάτω πρόγραμμα αναβοσβήνει μία LED κάθε 3 sec .Η Led συνδέεται με την ψηφιακή έξοδο 3 του Arduino.
int led =3;
void setup() {
// initialisation
pinMode(led, OUTPUT);
}
void loop() {
// send 5V to output 3
digitalWrite (led, HIGH);
//Wait for 3 secs
delay (3000);
// send 0V to output 3
digitalWrite (led, LOW);
delay (3000);
}
Δηλώνουμε μία ακέραια μεταβλητή led και της δίνουμε αρχική τιμή 3
Κατόπιν, βάζουμε αρχική κατάσταση της εξόδου 3 να είναι 5V.
Εισάγουμε 3 sec καθυστέρηση
Τέλος, βάζουμε την έξοδο 3 σε κατάσταση LOW (0V)
Εισάγουμε 3 sec καθυστέρηση .
H διαδικασία επαναλαμβάνεται επ' συνεχώς.





