Arduino Starter Stasiun Cuaca Bluetooth

Pada artikel ini, saya akan berbicara tentang bagaimana mengambil langkah pertama ke dunia Arduino dan membuat stasiun cuaca Anda sendiri. Stasiun cuaca akan terdiri dari dua modul: satu modul akan membaca informasi dari sensor yang terhubung, yang lain akan menampilkan data baca pada layar kecil. Kami akan menggunakan Bluetooth untuk mengirimkan informasi.

Saya juga akan memberikan informasi tentang pengaturan modul BT untuk bekerja satu sama lain.

gambar

Jadi ayo pergi!

Di mana untuk memulai?


Untuk memulainya, untuk memulai kerajinan pertama Anda di platform Arduino, Anda tidak perlu pengetahuan yang luas. Semua informasi dapat diperoleh dari Internet, khususnya, pelajaran pelatihan dari Amperka.ru banyak membantu .

Persiapan


Untuk pembuatan perangkat prototipe, Anda akan memerlukan elemen-elemen berikut:

  • 500 kΞ© Photoresistor (x1)
  • Barometer BMP085 (x1)
  • BT-module HC-05 (x2)
  • LCD, LCD LCM 1602 i2c (x1)
  • Set Email komponen (papan tempat memotong roti, resistor, dioda) (x1)
  • Arduino UNO R3 (x2)

Untuk firmware, kami akan menggunakan IDE Arduino asli.

Saya ingin menarik perhatian pada fakta bahwa setidaknya satu modul harus HC-05 (bukan 06!), Ini penting. Faktanya adalah bahwa HC-06 tidak mendukung mode master , yaitu dengan mengambil kedua modul 06 kita tidak akan dapat mengonfigurasinya untuk saling bekerja. Saya memutuskan untuk mengambil kedua modul HC-05 secara bersamaan untuk menghindari masalah kompatibilitas, jika ada.

Nuansa pengaturan BT-modul akan dijelaskan di bawah ini.

gambar

Kedua modul dibangun ke dalam perisai, yaitu, seharusnya tidak ada masalah menghubungkan ke papan Arduino.

Mulai perakitan


Kami menghubungkan sebuah photoresistor


Resistensi fotoresistor tergantung pada insiden cahaya di atasnya. Menggunakan fotoresistor bersama dengan resistor konvensional, kami memperoleh pembagi tegangan di mana tegangan melewati perubahan fotoresistor, tergantung pada tingkat iluminasi.

Mekanisme untuk memperoleh informasi yang berguna dari sensor sangat sederhana: fungsi analogRead (pin_number) akan mengembalikan nilai yang akan mewakili tingkat pencahayaan. Sensitivitas sensor dapat dikontrol dengan bermain dengan resistor dari peringkat yang berbeda; menurut saya, 10kOhm adalah peringkat optimal.

gambar

Contoh kode
int lightPin= 0; // ,    
void setup()
{
}
void loop()
{
  int light = analogRead(lightPin);
}


Sensor tekanan dan suhu


Untuk mengukur suhu, tekanan, dan ketinggian, kami akan menggunakan barometer BMP085.

gambar

Untuk menghubungkan BMP085 ke Arduino, kita membutuhkan 4 pin:

  • Vcc - terhubung ke daya + 5v
  • SDA - SDA di Arduino (A4)
  • SCL - SCL pada papan Arduino (A5)
  • GND - terhubung ke tanah

gambar

Untuk mengambil nilai dari sensor, Anda harus menghubungkan perpustakaan Adafruit.

Contoh kode

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP085_U.h>
Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085);
void setup(void)
{
/* Initialise the sensor */
  if(!bmp.begin())
  {
    /* There was a problem detecting the BMP085 ... check your connections */
    Serial.print("Ooops, no BMP085 detected ... Check your wiring or I2C ADDR!");
    while(1);
  }
}
void loop(void)
{
  sensors_event_t event;
  bmp.getEvent(&event);
  if (event.pressure)
  {
    float pressure = event.pressure;
    
    float temperature;
    bmp.getTemperature(&temperature);

    float seaLevelPressure = SENSORS_PRESSURE_SEALEVELHPA;
    float altitude = bmp.pressureToAltitude(seaLevelPressure, event.pressure); 
  }
}


Arduino dengan semua sensor terhubung
image

Koneksi tampilan


Pin display LCD1602 terhubung dengan cara yang sama seperti untuk BMP085:

  • LCD SDA -> Arduino SDA (A4)
  • LCD SCL -> Arduino SCL (A5)
  • LCD GND -> Arduino GND
  • LCD VCC -> Arduino 5V

gambar

Contoh kode
/*     LCD  1602. */  
#include <Wire.h>
#include <LiquidCrystal_I2C.h>  
LiquidCrystal_I2C lcd(0x27,16,2); // :  ,    
void setup()
{
    lcd.init();
    //  lcd
    lcd.backlight();
    //  
    //     1 
    lcd.print("Hello");
    //  
    lcd.setCursor(0, 1);
    //     2 
    lcd.print("World!");
    //  
}  
void loop()
{ }
// : http://xrobot.by/modules/lcd_4_4#ixzz3vQXoFKOj


Koneksi Bluetooth


Dan sekarang untuk bagian yang menyenangkan. Kami "menanam" perisai kami dengan bt-module di Arduino kami:

gambar

perangkat master akan terhubung ke perangkat slave, yang akan menunggu koneksi masuk. Pada salah satu papan yang kita atur saklar ke H, ini akan menjadi tuan kita. Di papan lain - di L, itu akan menjadi budak.

gambar

Dengan melampirkan modul ke Arduino, Anda dapat memulai pengaturan. Untuk mengkonfigurasi master, Anda perlu mengirim serangkaian perintah ke bt-module, kami akan melakukan ini menggunakan Serial Monitor (Ctrl + Shift + M). Saat mengirim pesan, disarankan untuk mengatur Baud rate -> 38400 & β€œKeduanya NL&CR”.

Setelah mengirim perintah AT dan mengklik kirim, kami mengharapkan respons yang OK. Jika demikian - papan tersambung dengan benar, Anda dapat melanjutkan. Jika tidak, ada baiknya kembali beberapa langkah dan memeriksa koneksi modul bluetooth.

Beberapa perintah AT penting yang mungkin berguna:

AT - hanya mengembalikan "OK", jadi apakah semuanya baik-baik saja
AT + NAME? - akan mengembalikan nama modul. Bisakah kita juga menetapkan nama kita sendiri dengan mengirim, misalnya, AT + NAME = WEATHER_MONITOR
AT + ROLE? - salah satu perintah utama akan mengembalikan peran perangkat, master / slave. Anda dapat mengatur nilai menggunakan AT + ROLE = 0 - beralih ke mode slave, atau AT + ROLE = 1 - mode master.
AT + PSWD? - akan mengembalikan kode pin yang digunakan untuk menghubungkan.
AT + ADDR? - akan mengembalikan alamat perangkat, misalnya, "14: 2: 110007". Perlu dicatat bahwa ketika menggunakan alamat dalam perintah-AT yang dikirim, titik dua ":" harus diganti dengan koma ",", yaitu. "14: 2: 110007" -> "14,2,110007".

Pengaturan budak


Tidak ada gerakan tubuh yang diperlukan di sini, jadi cukup colokkan papan ke daya.

Master'a


. .

  1. AT+ORGL,
  2. , AT+NAME=myname.
  3. AT+RMAAD β€” «».
  4. AT+PSWD=1234 β€”
  5. AT+ROLE=1 β€” , master .
  6. AT+CMODE=1 β€” , .

. .

  1. AT, , .
  2. AT+INIT β€” . ERROR(17) β€” , , .
  3. AT+INQ β€” BT-,
  4. AT + LINK = <address> - ada koneksi langsung ke perangkat slave. Perintah koneksi dapat, misalnya, terlihat seperti ini: AT + LINK = 14,2,110007.

Setelah perintah terakhir dijalankan, dioda akan berkedip pada frekuensi yang lebih rendah, yang menunjukkan koneksi berhasil.

Garis finish


Itu hampir semuanya. Masih menulis sketsa di mana kita membaca-kirim-menerima-data cuaca tampilan. Jika Anda mau, Anda dapat meninggalkan papan tempat memotong roti dan mulai menyolder, dan kemudian menempatkan struktur dalam kasing.

Hasil kerja
image
image
image
image

Sketsa:

Kode Pemantau Cuaca
#include <SoftwareSerial.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>  

LiquidCrystal_I2C lcd(0x27,16,2); // :  ,    

#define rxPin 2
#define txPin 3

SoftwareSerial btSerial(rxPin, txPin);

bool isDisplayingMode = true;
 
void setup()
{
   lcd.init();
   lcd.backlight();
   // define pin modes for tx, rx pins:
   pinMode(rxPin, INPUT);
   pinMode(txPin, OUTPUT);
   btSerial.begin(38400); 
   Serial.begin(38400);
   Serial.println("Serial started");
   
           
   lcd.print("    Waiting");
   lcd.setCursor(0, 1);
   lcd.print(" for connection");
   
   btSerial.println("AT");
   while (!btSerial.available());
   while (btSerial.available() > 0)
        char c = btSerial.read();
   btSerial.println("AT+INIT");
   while (!btSerial.available());
   while (btSerial.available() > 0)
        char c = btSerial.read();
   btSerial.println("AT+INQ");
   while (!btSerial.available());
   while (btSerial.available() > 0)
        char c = btSerial.read();
   btSerial.println("AT+LINK=2014,5,191146");  
   while (!btSerial.available());
   while (btSerial.available() > 0)
        char c = btSerial.read();   
}

void loop()
{   
  int i = 0;
  char someChar[32] = {0};
  // when characters arrive over the serial port...
  bool availible = Serial.available();
  if(availible) {
    do{
        someChar[i++] = Serial.read();
      //As data trickles in from your serial port you are grabbing as much as you can, 
      //but then when it runs out (as it will after a few bytes because the processor 
      //is much faster than a 9600 baud device) you exit loop, which then restarts, 
      //and resets i to zero, and someChar to an empty array.So please be sure to keep this delay 
      delay(3);                  
 
    }while (Serial.available() > 0);

    lcd.clear();
    Serial.println(i);
    btSerial.println(someChar);
    Serial.println(someChar);
  }
 
  lcd.setCursor(0, 0);
  while(btSerial.available()) 
      {
        if (isDisplayingMode)
        {
          lcd.clear();
          isDisplayingMode = false;
        }
        char c = (char)btSerial.read();
        Serial.print(c);          
        if (c != 13 && c != 10)
          lcd.print(c);
        if (c == '\n')
          lcd.setCursor(0, 1);
      }
}


Kode sensor cuaca
#include <SoftwareSerial.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP085_U.h>

Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085);
int lightSensorPin = 0;

#define rxPin 2
#define txPin 3

SoftwareSerial btSerial(rxPin, txPin);

struct SensorData
{
  float Pressure;
  float Temperature;
  float Altitude;
  float Lightness;
  void DisplaySensorData()
{
    Serial.print("Light:       ");
    Serial.print(this->Lightness, 2);
    Serial.println("%");
    Serial.print("Altitude:    "); 
    Serial.print(this->Altitude); 
    Serial.println(" m");
    Serial.print("Temperature: ");
    Serial.print(this->Temperature);
    Serial.println(" C");
    /* Display atmospheric pressue in hPa */
    Serial.print("Pressure:    ");
    Serial.print(this->Pressure);
    Serial.println(" hPa");
    Serial.println("");
}

void DisplaySensorDataInTwoRows()
{
    Serial.print("Temp: "); Serial.print(this->Temperature); Serial.println(" C");
    Serial.print("Pr: "); Serial.print(this->Pressure); Serial.println(" Pa");
    delay(1000);    
    Serial.print("Alt: "); Serial.print(this->Altitude); Serial.println(" m");
    Serial.print("Light: "); Serial.print(this->Lightness); Serial.println(" %");
    delay(1000);
}
void SendDataToRemote()
{
    btSerial.print("Temp: "); btSerial.print(this->Temperature); btSerial.print(" C\n");
    btSerial.print("Pr:   "); btSerial.print(this->Pressure); btSerial.print(" hPa\n");
    delay(5000);    
    btSerial.print("Alt:   "); btSerial.print(this->Altitude); btSerial.print(" m\n");
    btSerial.print("Light: "); btSerial.print(this->Lightness); btSerial.print(" %  \n");
    delay(5000);
}
};



void displaySensorDetails(void)
{
  sensor_t sensor;
  bmp.getSensor(&sensor);
  
  Serial.println("------------------------------------");
  Serial.print  ("Sensor:       "); Serial.println(sensor.name);
  Serial.print  ("Driver Ver:   "); Serial.println(sensor.version);
  Serial.print  ("Unique ID:    "); Serial.println(sensor.sensor_id);
  Serial.print  ("Max Value:    "); Serial.print(sensor.max_value); Serial.println(" hPa");
  Serial.print  ("Min Value:    "); Serial.print(sensor.min_value); Serial.println(" hPa");
  Serial.print  ("Resolution:   "); Serial.print(sensor.resolution); Serial.println(" hPa");  
  Serial.println("------------------------------------");
  Serial.println("");
  delay(500);
}

void setup(void) 
{
   // define pin modes for tx, rx pins:
   pinMode(rxPin, INPUT);
   pinMode(txPin, OUTPUT);
   btSerial.begin(38400);
   
  Serial.begin(9600);
  Serial.println("Pressure Sensor Test"); Serial.println("");
  
   
  /* Initialise the sensor */
  if(!bmp.begin())
  {
    /* There was a problem detecting the BMP085 ... check your connections */
    Serial.print("Ooops, no BMP085 detected ... Check your wiring or I2C ADDR!");
    while(1);
  }
    
  /* Display some basic information on this sensor */
  displaySensorDetails();
}
int counter = 0;
void loop(void) 
{
  /* Get a new sensor event */ 
  sensors_event_t event;
  bmp.getEvent(&event);
  SensorData data;
  /* Display the results (barometric pressure is measure in hPa) */
  if (event.pressure)
  {
    data.Pressure = event.pressure;
    
    float temperature;
    bmp.getTemperature(&temperature);
    data.Temperature = temperature;

    /* Then convert the atmospheric pressure, and SLP to altitude         */
    /* Update this next line with the current SLP for better results      */
    float seaLevelPressure = SENSORS_PRESSURE_SEALEVELHPA;
    float altitude = bmp.pressureToAltitude(seaLevelPressure, event.pressure);
    data.Altitude = altitude;  
    
    int lightValue = analogRead(lightSensorPin);
    float lightValueInPercent = 1.0 * lightValue / 1024 * 100;
    data.Lightness = lightValueInPercent;
    
    //data.DisplaySensorDataInTwoRows();    
  }
  else
  {
    Serial.println("Sensor error");
  }
  Serial.println("");
  data.SendDataToRemote();
}


Itu saja. Terima kasih atas perhatian anda!

Source: https://habr.com/ru/post/id388605/


All Articles