Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Proyek Stasiun Cuaca Nirkabel Arduino

Dalam tutorial ini kita akan belajar cara membuat Wireless Weather Station berbasis Arduino. Anda dapat menonton video berikut atau membaca tutorial tertulis di bawah ini.

Ringkasan

Suhu dan kelembaban luar ruangan diukur menggunakan sensor DHT22 dan data ini dikirim secara nirkabel ke unit dalam ruangan menggunakan modul transceiver NRF24L01. Pada unit indoor juga terdapat sensor DHT22 lain untuk mengukur suhu dan kelembaban dalam ruangan, serta modul DS3231 Real Time Clock yang dapat melacak waktu meskipun Arduino kehilangan daya. Semua data ini dicetak pada layar OLED 0,96”.

Diagram Sirkuit Stasiun Cuaca Nirkabel Arduino

Mari kita lihat diagram sirkuit dan bagaimana proyek ini bekerja. Perhatikan bahwa saya sudah memiliki tutorial terperinci tentang cara kerja masing-masing modul ini, jadi untuk detail lebih lanjut Anda dapat memeriksanya:Tutorial NRF24L01, Tutorial DHT22, Tutorial DS3231 .

Anda bisa mendapatkan komponen yang diperlukan untuk proyek ini dari tautan di bawah:

  • Modul Pemancar NRF24L01……….
  • Sensor DHT22…………….……………………
  • DS3231 Jam Waktu Nyata………………….. Amazon / Banggood / AliExpress
  • Arduino Nano ………………………….…….. 

Baik modul real time clock maupun tampilan OLED menggunakan protokol I2C untuk komunikasi dengan Arduino sehingga terhubung ke pin I2C atau pin analog nomor 4 dan 5 pada board Arduino Nano. Tepat di sebelah modul transceiver NRF24L01 terdapat kapasitor untuk menjaga agar catu daya lebih stabil. Ada juga resistor pull-up yang terhubung ke pin data DHT22 agar sensor bekerja dengan baik.

Untuk catu daya saya menggunakan adaptor daya 12V DC untuk unit dalam ruangan, dan di sisi lain, untuk memberi daya pada unit luar ruangan saya menggunakan dua baterai Li-on yang menghasilkan sekitar 7,5V. Dengan konfigurasi ini unit outdoor dapat berjalan sekitar 10 hari sebelum baterai habis, karena kami mengirimkan data secara berkala dan sementara itu kami menempatkan Arduino ke mode tidur, di mana konsumsi daya hanya sekitar 7mA.

PCB desain khusus

Untuk menjaga agar komponen elektronik tetap teratur, sesuai dengan diagram sirkuit saya merancang PCB khusus menggunakan perangkat lunak desain sirkuit online gratis EasyEDA. Kami dapat mencatat bahwa PCB yang sama dapat digunakan untuk unit dalam dan luar ruangan, hanya papan Arduino yang harus diprogram secara berbeda.

Setelah kita menyelesaikan desain di sini, kita cukup mengekspor file Gerber yang digunakan untuk pembuatan PCB. Anda dapat memeriksa file proyek EasyEDA stasiun cuaca nirkabel Arduino di sini.

Kemudian kita bisa memesan PCB kita dari JLCPCB, yang sebenarnya adalah sponsor dari video ini.

Di sini kita cukup drag dan drop file Gerber dan setelah diunggah kita dapat meninjau PCB kita di penampil Gerber. Jika semuanya baik-baik saja maka kita dapat melanjutkan, memilih properti yang kita inginkan untuk PCB kita, dan kemudian kita dapat memesan PCB dengan harga yang wajar. Perhatikan bahwa jika ini adalah pesanan pertama Anda dari JLCPCB, Anda bisa mendapatkan hingga 10 PCB hanya dengan $2.

Namun demikian, setelah beberapa hari PCB telah tiba. Kualitas PCB sangat bagus dan semuanya sama persis dengan desainnya.

Saya mulai merakit komponen elektronik dari proyek ini dengan menyolder pin header ke PCB. Dengan cara ini kita dapat dengan mudah menghubungkan dan memutuskan komponen saat dibutuhkan.

Kemudian saya juga memasukkan dan menyolder kapasitor dan resistor pull-up. Setelah langkah ini selesai, sekarang kita cukup memasang komponen ke pin header dari PCB.

Selanjutnya, saya melanjutkan dengan membuat kasus untuk proyek tersebut. Untuk itu saya menggunakan papan MDF tick 8mm dan menggunakan gergaji bundar, saya memotong semua bagian sesuai ukuran.

Untuk mendapatkan pengukuran suhu dan kelembaban yang akurat, sisi casing harus memungkinkan udara masuk ke casing. Jadi, dengan menggunakan bor dan serak, saya membuat beberapa slot di panel samping pada unit indoor dan outdoor.

Saya juga membuat slot untuk layar OLED di panel depan, serta memotong aluminium kecil-kecilan sesuai ukuran yang nantinya akan saya pasang di panel depan sebagai hiasan.

Untuk merakit casing, saya menggunakan lem kayu dan beberapa klem, serta beberapa sekrup.

Saya melukis kasing menggunakan cat semprot. Saya menggunakan cat putih untuk unit outdoor dan cat hitam untuk unit indoor. Setelah cat mengering, saya cukup memasukkan PCB ke dalam casing.

Di bagian belakang unit indoor saya memasukkan colokan listrik dan sakelar daya, dan di unit outdoor saya menggunakan kabel jumper sederhana sebagai sakelar daya.

Dan hanya itu, stasiun cuaca nirkabel Arduino kami sekarang berfungsi, tetapi yang tersisa di video ini adalah melihat cara kerja program.

Kode Stasiun Cuaca Nirkabel Arduino

Kode unit outdoor stasiun cuaca Arduino:

/*
  Arduino Wireless Communication Tutorial
      Outdoor unit - Transmitter 
      
  by Dejan Nedelkovski, www.HowToMechatronics.com

Libraries:
NRF24L01 - TMRh20/RF24, https://github.com/tmrh20/RF24/
DHT22 - DHTlib, https://github.com/RobTillaart/Arduino/tree/master/libraries/DHTlib
LowPower - https://github.com/rocketscream/Low-Power 
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <dht.h>
#include <LowPower.h>

#define dataPin 8 // DHT22 data pin
dht DHT; // Creates a DHT object

RF24 radio(10, 9); // CE, CSN
const byte address[6] = "00001";

char thChar[32] = "";
String thString = "";

void setup() {
  radio.begin();
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_MIN);
  radio.stopListening();

}
void loop() {
  int readData = DHT.read22(dataPin); // Reads the data from the sensor
  int t = DHT.temperature; // Gets the values of the temperature
  int h = DHT.humidity; // Gets the values of the humidity
  thString = String(t) + String(h);
  thString.toCharArray(thChar, 12);
  // Sent the data wirelessly to the indoor unit
  for (int i = 0; i <= 3; i++) {           // Send the data 3 times
    radio.write(&thChar, sizeof(thChar));
    delay(50);
  }
  // Sleep for 2 minutes, 15*8 = 120s
  for (int sleepCounter = 15; sleepCounter > 0; sleepCounter--)
  {
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
  }
}Code language: Arduino (arduino)

Deskripsi: Unit luar ruangan adalah pemancar komunikasi nirkabel, jadi di sini pertama-tama kita perlu menyertakan perpustakaan RF24, perpustakaan DHT, serta perpustakaan LowPower yang digunakan untuk menempatkan Arduino ke mode tidur.

Setelah menentukan instance mereka, pin yang menghubungkan modul dan beberapa variabel, di bagian setup kita perlu menginisialisasi alamat komunikasi nirkabel. Kemudian pada bagian loop, pertama kita membaca data dari sensor DHT22 atau itulah suhu dan kelembapannya. Awalnya nilai-nilai ini adalah bilangan bulat dan dipisahkan, jadi saya mengubahnya menjadi variabel String tunggal, memasukkannya ke dalam array karakter, dan menggunakan fungsi radio.write(), mengirimkan data ini ke unit dalam-ruang. Menggunakan for loop, kami mengirim data sebanyak 3 kali untuk memastikan penerima akan mendapatkan data jika pengontrol sedang sibuk pada saat pengiriman.

Pada akhirnya kami menempatkan Arduino ke mode tidur selama jangka waktu tertentu untuk meminimalkan konsumsi daya.

Kode unit indoor stasiun cuaca Arduino:

/*
  Arduino Wireless Communication Tutorial
        Indoor unit  - Receiver

  by Dejan Nedelkovski, www.HowToMechatronics.com
 Libraries:
 DS3231 - http://www.rinkydinkelectronics.com/library.php?id=73
 U8G2 - https://github.com/olikraus/u8g2
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <dht.h>
#include <DS3231.h>
#include <U8g2lib.h>
#include <Wire.h>

#define dataPin 8 // DHT22 sensor
dht DHT; // Creats a DHT object
DS3231  rtc(SDA, SCL);
U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

RF24 radio(10, 9); // CE, CSN
const byte address[6] = "00001";

char text[6] = "";
int readDHT22, t, h;
String inTemp, inHum, outTemp, outHum;
String rtcTime, rtcDate;
int draw_state = 0;
unsigned long previousMillis = 0;
long interval = 3000;

#define Temperature_20Icon_width 27
#define Temperature_20Icon_height 47
static const unsigned char Temperature_20Icon_bits[] U8X8_PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x80, 0x7f, 0x00, 0x00,
  0xc0, 0xe1, 0x00, 0x00, 0xe0, 0xc0, 0x01, 0x00, 0x60, 0x80, 0xf9, 0x03,
  0x60, 0x80, 0x01, 0x00, 0x60, 0x80, 0x01, 0x00, 0x60, 0x80, 0x79, 0x00,
  0x60, 0x80, 0x01, 0x00, 0x60, 0x80, 0x01, 0x00, 0x60, 0x80, 0xf9, 0x03,
  0x60, 0x80, 0x01, 0x00, 0x60, 0x80, 0x01, 0x00, 0x60, 0x8c, 0x79, 0x00,
  0x60, 0x9e, 0x01, 0x00, 0x60, 0x9e, 0x01, 0x00, 0x60, 0x9e, 0xf9, 0x03,
  0x60, 0x9e, 0x01, 0x00, 0x60, 0x9e, 0x01, 0x00, 0x60, 0x9e, 0x79, 0x00,
  0x60, 0x9e, 0x01, 0x00, 0x60, 0x9e, 0x01, 0x00, 0x60, 0x9e, 0xf9, 0x03,
  0x60, 0x9e, 0x01, 0x00, 0x60, 0x9e, 0x01, 0x00, 0x60, 0x9e, 0x01, 0x00,
  0x70, 0x9e, 0x03, 0x00, 0x38, 0x1e, 0x07, 0x00, 0x18, 0x3e, 0x0e, 0x00,
  0x1c, 0x3f, 0x0c, 0x00, 0x0c, 0x7f, 0x18, 0x00, 0x8c, 0xff, 0x18, 0x00,
  0x8e, 0xff, 0x38, 0x00, 0xc6, 0xff, 0x31, 0x00, 0xc6, 0xff, 0x31, 0x00,
  0xc6, 0xff, 0x31, 0x00, 0x8e, 0xff, 0x38, 0x00, 0x8c, 0xff, 0x18, 0x00,
  0x0c, 0x7f, 0x1c, 0x00, 0x3c, 0x1c, 0x0e, 0x00, 0x78, 0x00, 0x06, 0x00,
  0xe0, 0x80, 0x07, 0x00, 0xe0, 0xff, 0x03, 0x00, 0x80, 0xff, 0x00, 0x00,
  0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};


#define Humidity_20Icon_width 27
#define Humidity_20Icon_height 47
static const unsigned char Humidity_20Icon_bits[] U8X8_PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
  0x00, 0x70, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00,
  0x00, 0xdc, 0x01, 0x00, 0x00, 0x8e, 0x01, 0x00, 0x00, 0x86, 0x03, 0x00,
  0x00, 0x06, 0x03, 0x00, 0x00, 0x03, 0x07, 0x00, 0x80, 0x03, 0x06, 0x00,
  0x80, 0x01, 0x0c, 0x00, 0xc0, 0x01, 0x1c, 0x00, 0xc0, 0x00, 0x18, 0x00,
  0xe0, 0x00, 0x38, 0x00, 0x60, 0x00, 0x30, 0x00, 0x70, 0x00, 0x70, 0x00,
  0x30, 0x00, 0xe0, 0x00, 0x38, 0x00, 0xc0, 0x00, 0x18, 0x00, 0xc0, 0x01,
  0x1c, 0x00, 0x80, 0x01, 0x0c, 0x00, 0x80, 0x03, 0x0e, 0x00, 0x80, 0x03,
  0x06, 0x00, 0x00, 0x03, 0x06, 0x00, 0x00, 0x03, 0x07, 0x00, 0x00, 0x07,
  0x03, 0x00, 0x00, 0x06, 0x03, 0x00, 0x00, 0x06, 0x03, 0x00, 0x00, 0x06,
  0x63, 0x00, 0x00, 0x06, 0x63, 0x00, 0x00, 0x06, 0x63, 0x00, 0x00, 0x06,
  0xe3, 0x00, 0x00, 0x06, 0xc7, 0x00, 0x00, 0x06, 0xc6, 0x01, 0x00, 0x07,
  0x86, 0x03, 0x00, 0x03, 0x0e, 0x1f, 0x00, 0x03, 0x0e, 0x1e, 0x80, 0x01,
  0x1c, 0x00, 0xc0, 0x01, 0x38, 0x00, 0xe0, 0x00, 0x78, 0x00, 0x70, 0x00,
  0xf0, 0x00, 0x38, 0x00, 0xe0, 0x07, 0x1f, 0x00, 0x80, 0xff, 0x0f, 0x00,
  0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00
};

void setup() {
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN);
  radio.startListening();
  u8g2.begin();
  rtc.begin();
}
void loop() {
  if (radio.available()) {
    radio.read(&text, sizeof(text)); // Read incoming data
    outTemp = String(text[0]) + String(text[1]) + char(176) + "C"; // Outdoor Temperature
    outHum = String(text[2]) + String(text[3]) + "%"; // Outdoor Humidity
  }

  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;
    u8g2.firstPage();
    do {
      switch (draw_state ) {
        case 0: drawDate(); break;
        case 1: drawInTemperature(); break;
        case 2: drawInHumidity(); break;
        case 3: drawOutTemperature(); break;
        case 4: drawOutHumidity(); break;
      }
    } while ( u8g2.nextPage() );
    draw_state++;
    if (draw_state > 4) {
      draw_state = 0;
    }
  }
}

void drawDate() {
  String dowa = rtc.getDOWStr();
  dowa.remove(3);
  rtcDate = dowa + " " + rtc.getDateStr();
  u8g2.setFont(u8g2_font_timB14_tr);
  u8g2.setCursor(0, 15);
  rtcTime = rtc.getTimeStr(); // DS3231 RTC time
  rtcTime.remove(5);
  u8g2.print(rtcDate);
  u8g2.setFont(u8g2_font_fub30_tf);
  u8g2.setCursor(8, 58);
  u8g2.print(rtcTime);
}

void drawInTemperature() {
  readDHT22 = DHT.read22(dataPin); // Reads the data from the sensor
  t = DHT.temperature; // Gets the values of the temperature
  inTemp = String(t) + char(176) + "C";
  u8g2.setFont(u8g2_font_helvR14_tr);
  u8g2.setCursor(24, 15);
  u8g2.print("INDOOR");
  u8g2.setFont(u8g2_font_fub30_tf);
  u8g2.setCursor(36, 58);
  u8g2.print(inTemp);
  u8g2.drawXBMP( 0, 17, Temperature_20Icon_width, Temperature_20Icon_height, Temperature_20Icon_bits);
}

void drawInHumidity() {
  h = DHT.humidity; // Gets the values of the humidity
  inHum = String(h) + "%";
  u8g2.setFont(u8g2_font_helvR14_tr);
  u8g2.setCursor(24, 15);
  u8g2.print("INDOOR");
  u8g2.setFont(u8g2_font_fub30_tf);
  u8g2.setCursor(36, 58);
  u8g2.print(inHum);
  u8g2.drawXBMP( 0, 17, Humidity_20Icon_width, Humidity_20Icon_height, Humidity_20Icon_bits);
}

void drawOutTemperature() {
  u8g2.setFont(u8g2_font_helvR14_tr);
  u8g2.setCursor(12, 15);
  u8g2.print("OUTDOOR");
  u8g2.setFont(u8g2_font_fub30_tf);
  u8g2.setCursor(36, 58);
  u8g2.print(outTemp);
  u8g2.drawXBMP( 0, 17, Temperature_20Icon_width, Temperature_20Icon_height, Temperature_20Icon_bits);
}
void drawOutHumidity() {
  u8g2.setFont(u8g2_font_helvR14_tr);
  u8g2.setCursor(12, 15);
  u8g2.print("OUTDOOR");
  u8g2.setFont(u8g2_font_fub30_tf);
  u8g2.setCursor(36, 58);
  u8g2.print(outHum);
  u8g2.drawXBMP( 0, 17, Humidity_20Icon_width, Humidity_20Icon_height, Humidity_20Icon_bits);
}Code language: Arduino (arduino)

Deskripsi: Di sisi lain, di unit dalam ruangan atau penerima, kita perlu menyertakan dua perpustakaan lagi, satu untuk modul jam waktu nyata DS3231 dan satu lagi untuk tampilan OLED, perpustakaan U8G2. Dengan cara yang sama seperti sebelumnya, kita perlu mendefinisikan instance, pin dan beberapa variabel yang dibutuhkan untuk program di bawah ini. Juga di sini kita perlu mendefinisikan ikon suhu dan kelembaban sebagai bitmap.

Bitmap ikon suhu:

#define Temperature_20Icon_width 27
#define Temperature_20Icon_height 47
static const unsigned char Temperature_20Icon_bits[] U8X8_PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x80, 0x7f, 0x00, 0x00,
  0xc0, 0xe1, 0x00, 0x00, 0xe0, 0xc0, 0x01, 0x00, 0x60, 0x80, 0xf9, 0x03,
  0x60, 0x80, 0x01, 0x00, 0x60, 0x80, 0x01, 0x00, 0x60, 0x80, 0x79, 0x00,
  0x60, 0x80, 0x01, 0x00, 0x60, 0x80, 0x01, 0x00, 0x60, 0x80, 0xf9, 0x03,
  0x60, 0x80, 0x01, 0x00, 0x60, 0x80, 0x01, 0x00, 0x60, 0x8c, 0x79, 0x00,
  0x60, 0x9e, 0x01, 0x00, 0x60, 0x9e, 0x01, 0x00, 0x60, 0x9e, 0xf9, 0x03,
  0x60, 0x9e, 0x01, 0x00, 0x60, 0x9e, 0x01, 0x00, 0x60, 0x9e, 0x79, 0x00,
  0x60, 0x9e, 0x01, 0x00, 0x60, 0x9e, 0x01, 0x00, 0x60, 0x9e, 0xf9, 0x03,
  0x60, 0x9e, 0x01, 0x00, 0x60, 0x9e, 0x01, 0x00, 0x60, 0x9e, 0x01, 0x00,
  0x70, 0x9e, 0x03, 0x00, 0x38, 0x1e, 0x07, 0x00, 0x18, 0x3e, 0x0e, 0x00,
  0x1c, 0x3f, 0x0c, 0x00, 0x0c, 0x7f, 0x18, 0x00, 0x8c, 0xff, 0x18, 0x00,
  0x8e, 0xff, 0x38, 0x00, 0xc6, 0xff, 0x31, 0x00, 0xc6, 0xff, 0x31, 0x00,
  0xc6, 0xff, 0x31, 0x00, 0x8e, 0xff, 0x38, 0x00, 0x8c, 0xff, 0x18, 0x00,
  0x0c, 0x7f, 0x1c, 0x00, 0x3c, 0x1c, 0x0e, 0x00, 0x78, 0x00, 0x06, 0x00,
  0xe0, 0x80, 0x07, 0x00, 0xe0, 0xff, 0x03, 0x00, 0x80, 0xff, 0x00, 0x00,
  0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};Code language: Arduino (arduino)

Untuk tujuan ini, kita dapat menggunakan GIMP, editor gambar open source, yang melaluinya kita dapat menggambar apa saja dan kemudian mengekspornya sebagai bitmap(.xbm).

Kemudian kita dapat membuka file ini menggunakan notepad dan dari sana kita dapat menyalin bitmap ke dalam kode Arduino.

Perhatikan bahwa di sini kita dapat mendefinisikan bitmap sebagai konstan menggunakan pengubah variabel PROGMEM, dan dengan cara itu bitmap akan disimpan dalam memori flash, bukan SRAM papan Arduino.

static const unsigned char Temperature_20Icon_bits[] U8X8_PROGMEM // Save in the Flash memory 
static unsigned char Temperature_20Icon_bits[] // Save in the SRAM

Di bagian penyiapan, kita perlu menginisialisasi komunikasi nirkabel serta menginisialisasi tampilan OLED dan modul jam waktu nyata.

Kemudian di bagian loop kami terus memeriksa apakah ada data masuk yang tersedia untuk dibaca melalui modul NRF24L01. Jika benar, menggunakan fungsi radio.read() kita membacanya, dan menyimpan dua karakter pertama ke dalam variabel String suhu, dan dua karakter berikutnya ke dalam variabel String kelembaban.

Kemudian kita menggunakan fungsi milis() untuk menampilkan berbagai data pada tampilan pada interval yang ditentukan dengan variabel interval yang saya atur menjadi 3 detik. Kami menggunakan fungsi millis() karena dengan cara ini sisa kode dapat dieksekusi berulang kali, sedangkan jika kami menggunakan fungsi delay(), program menunggu periode itu sehingga dengan cara itu kami mungkin akan kehilangan data yang masuk dari unit luar ruangan.

Selanjutnya, dengan menggunakan fungsi firstPage() dan nextPage() dari library U8G2, kami mencetak lima layar berbeda yang ditentukan dengan fungsi kustom.

Fungsi kustom drawDate() mendapatkan informasi tanggal dan waktu dari modul jam waktu nyata dan mencetaknya di layar dengan tepat. Fungsi drawInTemperature() membaca suhu dalam ruangan dan mencetaknya dengan tepat di layar. Sebenarnya, metode yang sama digunakan untuk mencetak semua layar di layar.

Jadi itu saja, saya harap Anda menikmati proyek Arduino ini dan belajar sesuatu yang baru. Jangan ragu untuk mengajukan pertanyaan apa pun di bagian komentar di bawah.


Proses manufaktur

  1. Stasiun cuaca berdasarkan Raspberry Pi
  2. Stasiun Cuaca Raspberry Pi 2
  3. Stasiun Cuaca Raspberry Pi
  4. Stasiun Cuaca V 2.0
  5. Detektor Frekuensi Audio
  6. Manipulator Saklar Lampu Nirkabel
  7. Tech-TicTacToe
  8. Penghitung Waktu Mundur Arduino
  9. $10 Portable Arduino Weather Station (AWS)
  10. eDOT - Jam Presisi dan Stasiun Cuaca Berbasis Arduino