Σάββατο 20 Φεβρουαρίου 2021

Αισθητήρας βροχόπτωσης σε ψηφιακή λειτουργία: βαθμονόμηση (καθορισμός τιμής κατωφλίου)

 Περιγραφή

Ο αισθητήρας βροχόπτωσης μπορεί να ανιχνεύει σταγόνες νερού επειδή η παρουσία των σταγόνων νερού στην επιφάνειά του έχει σαν αποτέλεσμα την μεταβολή της αντίστασής του. Συγκεκριμένα:

  • Περισσότερο νερό στην επιφάνεια σημαίνει καλύτερη αγωγιμότητα και έτσι μικρότερη αντίσταση.
  • Λιγότερο νερό στην επιφάνεια σημαίνει χειρότερη αγωγιμότητα και, έτσι, μεγαλύτερη αντίσταση

Λειτουργεί με δύο τρόπους, αναλογικό ή ψηφιακό, και διαθέτει δύο εξόδους σήματος, Α0 και D0 αντίστοιχα. Εδώ ο αισθητήρας λειτουργεί με ψηφιακό τρόπο.

Για να δίνει ακριβείς μετρήσεις ο αισθητήρας, συνιστάται να έχει βαθμονομηθεί. Η μονάδα (module) διαθέτει ενσωματωμένο ποτενσιόμετρο για τη βαθμονόμηση της ψηφιακής εξόδου (D0) και ένα LED. Περιστρέφοντας το κουμπί του ποτενσιόμετρου, ορίζεται ένα κατώφλι. Έτσι, όταν η ποσότητα νερού υπερβαίνει την τιμή κατωφλίου, η λυχνία LED ανάβει και η ψηφιακή έξοδος (D0) δίνει την τιμή LOW.

Για τη βαθμονόμηση του αισθητήρα, συνδέουμε με την πλακέτα Arduino ώστε να τροφοδοτείται, ψεκάζουμε με την ποσότητα νερού που θέλουμε να ανιχνεύουμε, περιστρέφουμε το ποτενσιόμετρο δεξιόστροφα, έτσι ώστε το LED να ανάψει και, στη συνέχεια, ρυθμίζουμε το ποτενσιόμετρο αριστερόστροφα, προς τα πίσω μέχρι μόλις να σβήσει το LED.




Αισθητήρας βροχόπτωσης σε αναλογική λειτουργία: εκτύπωση τιμών στην σειριακή οθόνη

Περιγραφή

Ο αισθητήρας βροχόπτωσης μπορεί να ανιχνεύει σταγόνες νερού επειδή η παρουσία των σταγόνων νερού στην επιφάνειά του έχει σαν αποτέλεσμα την μεταβολή της αντίστασής του. Συγκεκριμένα:

  • Περισσότερο νερό στην επιφάνεια σημαίνει καλύτερη αγωγιμότητα και έτσι μικρότερη αντίσταση.
  • Λιγότερο νερό στην επιφάνεια σημαίνει χειρότερη αγωγιμότητα και, έτσι, μεγαλύτεραη αντίσταση.

Ο αισθητήρας παράγει τάση εξόδου ανάλογη της αντίστασης, και έτσι, μπορούμε να προσδιορίσουμε εάν βρέχει ή όχι. Λειτουργεί με δύο τρόπους, αναλογικό ή ψηφιακό, και διαθέτει δύο εξόδους σήματος, Α0 και D0 αντίστοιχα. Εδώ ο αισθητήρας λειτουργεί με αναλογικό τρόπο.

Στην σειριακή οθόνη εκτυπώνονται οι αναλογικές τιμές τάσης όταν η επιφάνεια είναι στεγνή και όταν έχουμε ψεκάσει με σταγόνες νερού. Αυτές οι τιμές πρέπει να είναι γνωστές όταν θέλουμε να δημιουργήσουμε αυτοματισμούς που βασίζονται στον αισθητήρα βροχόπτωσης όπως για παράδειγμα όταν βρέχει ένας λαμπτήρας LED ανάβει ή ένα buzzer ηχεί. Στις περιπτώσεις αυτές, μπορούμε να χρησιμοποιούμε τις τιμές 0-1023, ωστόσο η λειτουργία του αισθητήρα δεν είναι τόσο αποδοτική.

Εξαρτήματα και συνδέσεις


Η έξοδος του αισθητήρα συνδέεται στην αναλογική Α0.

Κώδικας

void setup() {
pinMode(A0,INPUT);
Serial.begin(9600); 
}

void loop() {
Serial.println(analogRead(A0));  
delay(2000);
}




Δευτέρα 15 Φεβρουαρίου 2021

Καρδιακοί παλμοί με αισθητήρα και την πλακέτα Arduino

Περιγραφή

Μετράμε τους καρδιακούς παλμούς με αισθητήρα. Οι τιμές τυπώνονται σε LCD I2C οθόνη και ελέγχεται η αξιοπιστία συγκρίνοντας με αντίστοιχο αισθητήρα smartwatch.


Εξαρτήματα και συνδέσεις 

Περισσότερα για τον αισθητήρα, σε προηγούμενη ανάρτηση εδώ, όπου οι τιμές τυπώνονται στην σειριακή οθόνη. 


Κώδικας


#define USE_ARDUINO_INTERRUPTS true   
#include <PulseSensorPlayground.h>    
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);  

//  Variables
const int PulseWire = 0;       
const int LED13 = 13;       
int Threshold = 550;          
                               
PulseSensorPlayground pulseSensor;  

void setup() {   

  Serial.begin(9600);          

 
  pulseSensor.analogInput(PulseWire);   
  pulseSensor.blinkOnPulse(LED13);       
  pulseSensor.setThreshold(Threshold);   

     if (pulseSensor.begin()) {
    Serial.println("We created a pulseSensor Object !");  
   }

  lcd.init();
  lcd.clear();         
  lcd.backlight();
}

void loop() {

int myBPM = pulseSensor.getBeatsPerMinute();  

if (pulseSensor.sawStartOfBeat()) {            
 Serial.println("♥  A HeartBeat Happened ! "); 
 Serial.print("BPM: ");                        
 Serial.println(myBPM);                     
}

  lcd.setCursor(0,0); 
  lcd.print("BPM: ");
  lcd.print(myBPM);
 
  delay(20);                    

}

  

Ένα LASER εκπέμπει σήμα SOS! ! !

 Περιγραφή

Ένα laser εκπέμπει . . .  _  _  _  . . .  SOS! 

Εξαρτήματα και συνδέσεις

Η είσοδος του laser συνδέεται στην ψηφιακή έξοδο 13 στην πλακέτα, στην οποία είναι και το ενσωματωμένο BUILT_IN LED.  

  • Arduino Uno
  • Laser module

Κώδικας

void setup()
{
  pinMode(13, OUTPUT);
}

void loop()
{
  digitalWrite(13, HIGH);
  delay(100); // Wait for 1000 millisecond(s)
  digitalWrite(13, LOW);
  delay(100); // Wait for 1000 millisecond(s)
  digitalWrite(13, HIGH);
  delay(100); // Wait for 1000 millisecond(s)
  digitalWrite(13, LOW);
  delay(100); // Wait for 1000 millisecond(s)
  digitalWrite(13, HIGH);
  delay(100); // Wait for 1000 millisecond(s)
  digitalWrite(13, LOW);
  delay(300); // Wait for 3000 millisecond(s)
  digitalWrite(13, HIGH);
  delay(300); // Wait for 3000 millisecond(s)
  digitalWrite(13, LOW);
  delay(100); // Wait for 1000 millisecond(s)
  digitalWrite(13, HIGH);
  delay(300); // Wait for 3000 millisecond(s)
  digitalWrite(13, LOW);
  delay(1000); // Wait for 1000 millisecond(s)
  digitalWrite(13, HIGH);
  delay(300); // Wait for 3000 millisecond(s)
  digitalWrite(13, LOW);
  delay(300); // Wait for 3000 millisecond(s)
  digitalWrite(13, HIGH);
  delay(100); // Wait for 1000 millisecond(s)
  digitalWrite(13, LOW);
  delay(100); // Wait for 1000 millisecond(s)
  digitalWrite(13, HIGH);
  delay(100); // Wait for 1000 millisecond(s)
  digitalWrite(13, LOW);
  delay(100); // Wait for 1000 millisecond(s)
  digitalWrite(13, HIGH);
  delay(100); // Wait for 1000 millisecond(s)
  digitalWrite(13, LOW);
  delay(700); // Wait for 7000 millisecond(s)
  digitalWrite(13, HIGH);
  delay(100); // Wait for 1000 millisecond(s)
  digitalWrite(13, LOW);
  delay(100); // Wait for 1000 millisecond(s)
  digitalWrite(13, HIGH);
  delay(100); // Wait for 1000 millisecond(s)
  digitalWrite(13, LOW);
  delay(700); // Wait for 7000 millisecond(s)
}

Κυριακή 14 Φεβρουαρίου 2021

Προειδοποίηση με άναμμα LED όταν ο ήχος ομιλιών ξεπεράσει μια τιμή κατωφλίου

 Περιγραφή

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

 

 Εξαρτήματα και συνδέσεις



  • Arduino Uno
  • αισθητήρας ήχου (μικρόφωνο)
  • 2 x LED διαφορετικού χρώματος (εδώ κόκκινου και λευκού)
  • 2 x 220Ω
Το αναλογικό σήμα του μικροφώνου συνδέεται στην Α0. Το μικρόφωνο τροφοδοτείται σε τάση 3,3V ώστε να έχει μικρότερο θόρυβο. Το λευκό και κόκκινο LED συνδέονται στην 2 και 3 αντίστοιχα. 

Κώδικας

#define sampleWindow 10 
#define LEDtime 1000 
#define threshold 10 

#define MIC_IN A0 
#define LED_LOUD 2 
#define LED_QUIET 3 
#define V_MIC 3.3 

int sample;
long startLED;
float values[QTY_SAMPLES];
float sum;
int index;


float rollingAverage(float num) {
  sum -= values[index];
  values[index] = num;
  sum += values[index];
  index++;
  index = index % QTY_SAMPLES;
  return sum / QTY_SAMPLES;
}


void setup()
{
  Serial.begin(9600);
  pinMode(LED_QUIET, OUTPUT);
  pinMode(LED_LOUD, OUTPUT);
  pinMode(MIC_IN, INPUT);
  float sum = 0;
  int index = 0;
}


void loop()
{

 int signalMax = 0;
  int signalMin = 1024;
  unsigned long startMillis = millis(); 

    while (millis() - startMillis < sampleWindow)
  {
    sample = analogRead(MIC_IN);
    if (sample > signalMax)
    {
      signalMax = sample;  // save the new maximum
    }
    else if (sample < signalMin)
    {
      signalMin = sample;  // save the new minimum
    }
  }

  
  float amplitude = signalMax - signalMin;  
  float millivolts = rollingAverage(amplitude) * V_MIC / 1.024; 
  Serial.println(millivolts);

    if (millivolts > threshold) {
    digitalWrite(LED_LOUD, HIGH); digitalWrite(LED_QUIET, LOW);
    startLED = millis();
  } else if (millis() - startLED > LEDtime) {
    digitalWrite(LED_LOUD, LOW); digitalWrite(LED_QUIET, HIGH);
  }
}


Έλεγχος σερβοκινητήρα με αισθητήρα κάμψης

 Περιγραφή

Ένας αισθητήρας κάμψης (flex sensor) ελέγχει τη γωνία ενός σερβοκινητήρα. 
 

 Εξαρτήματα και συνδέσεις


  • Arduino Uno
  • αισθητήρας κάμψης
  • σερβοκινητήρας
  • 1 x 10ΚΩ
Ο αισθητήρας συνδέεται ως διαιρέτης τάσης στην αναλογική είσοδο A0 με χρήση της αντίστασης 10ΚΩ. Το σήμα για το έλεγχο της γωνίας του σερβοκινητήρα δίνεται από την  ~11 ( ακίδα PWM). 
Για το έργο και την προσομοίωση στο tinkercad πατήστε στην εικόνα

Κώδικας

Ο αισθητήρας δεν δίνει εύρος 0-1023 όπως για παράδειγμα ένα ποτενσιόμετρο, έτσι χρειάζεται να βρούμε το εύρος και να το αντιστοιχίσουμε στις 0 έως 180ο του σερβοκινητήρα. Στην σειριακή οθόνη τυπώνουμε την Α0 για 0 μοίρες και για 180 μοίρες (πλήρης κάμψη του αισθητήρα). Οι τιμές είναι 539 και 810 αντίστοιχα. Αυτό το εύρος τιμών σημειώνεται στην συνάρτηση map. 
#include <Servo.h>

Servo servo_11;

void setup()
{
  pinMode(A0, INPUT);
  servo_11.attach(11, 500, 2500);
  Serial.begin(9600);

}

void loop()
{
  servo_11.write(map(analogRead(A0), 539, 810, 0, 180));
  Serial.println(analogRead(A0));
  delay(10); 
}

Σάββατο 13 Φεβρουαρίου 2021

Ενδείξεις υγρασίας εδάφους με αισθητήρα και 2 LED

Περιγραφή

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

Εξαρτήματα και συνδέσεις


  

  • Arduino Uno
  • αισθητήρας υγρασίας εδάφους
  • 2 x LED διαφορετικού χρώματος (εδώ κόκκινου και πράσινου)
  • 2 x 220Ω

Ο αισθητήρας συνδέεται στον αναλογικό ακροδέκτη A1, οι τιμές τάσης του αισθητήρα μετατρέπονται σε τιμές 0-1023 που εμφανίζονται στη σειριακή οθόνη. Ορίζουμε μια ελάχιστη τιμή – τιμή κατωφλίου –  ας πούμε 500. Όταν η τιμή στην A1 είναι μικρότερη αυτής της τιμής, τότε στην σειριακή οθόνη τυπώνεται "NO NEED FOR WATERING". Ενώ, όταν η τιμή στην A1 είναι μεγαλύτερη, τυπώνεται "NEED FOR WATERING". Επίσης, δύο λαμπτήρες LED κόκκινου και πράσινου χρώματος έχουν συνδεθεί στους ακροδέκτες 10 και 9, μέσω αντιστάσεων 220Ω δίνοντας οπτική πληροφορία να πότισμα ή μη πότισμα, αντίστοιχα. 

Κώδικας

int rainPin = A1;
int greenLED = 9;
int redLED = 10;
int thresholdValue = 500;

void setup(){
  pinMode(rainPin, INPUT);
  pinMode(greenLED, OUTPUT);
  pinMode(redLED, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int sensorValue = analogRead(rainPin);
  Serial.print(sensorValue);
  if(sensorValue < thresholdValue){
    Serial.println(" - No need for watering");
    digitalWrite(redLED, LOW);
    digitalWrite(greenLED, HIGH);
  }
  else {
    Serial.println(" - Need for watering");
    digitalWrite(redLED, HIGH);
    digitalWrite(greenLED, LOW);
  }
  delay(1000);
}