Semua Tentang Belajar Teknologi Digital Dalam Kehidupan Sehari - Hari

  • IC Timer 555 yang Multifungsi

    IC timer 555 adalah sirkuit terpadu (chip) yang digunakan dalam berbagai pembangkit timer, pulsa dan aplikasi osilator. Komponen ini digunakan secara luas, berkat kemudahan dalam penggunaan, harga rendah dan stabilitas yang baik

  • Ayo Migrasi TV Digital

    Kami bantu anda untuk memahami lebih jelas mengenai migrasi tv digital, apa sebabnya dan bagaimana efek terhadap kehidupan. Jasa teknisi juga tersedia dan siap membantu instalasi - setting perangkat - pengaturan antena dan distribusi televisi digital ke kamar kos / hotel

  • Bermain DOT Matrix - LOVEHURT

    Project Sederhana dengan Dot Matrix dan Attiny2313. Bisa menjadi hadiah buat teman atau pacarmu yang ulang tahun dengan tulisan dan animasi yang dapat dibuat sendiri.

  • JAM DIGITAL 6 DIGIT TANPA MICRO FULL CMOS

    Jika anda pencinta IC TTL datau CMOS maka project jam digital ini akan menunjukkan bahwa tidak ada salahnya balik kembali ke dasar elektronika digital , sebab semuanya BISA dibuat dengan teknologi jadul

  • Node Red - Kontrol Industri 4.0

    Teknologi kontrol sudah melampaui ekspektasi semua orang dan dengan kemajuan dunia elektronika, kini semakin leluasa berkreasi melalui Node Red

Tampilkan postingan dengan label arduino. Tampilkan semua postingan
Tampilkan postingan dengan label arduino. Tampilkan semua postingan

Selasa, 26 Maret 2024

[Modbus] Menampilkan Sensor Suhu Infra Red ke Matrix P10

 



Sambungan dari praktek membaca sensor suhu infra red RS-WD-HW-N01 yang saya bahas sebelumnya disini , saya akan ajarkan bagaimana menampilkan suhunya di dot matrix display P10. Display dot matrix ini paling umum digunakan di layar sekolah, toko, masjid dll, ini sangat banyak yang membahas di blog maupun youtube, dengan harga yang sangat murah (menyebabkan 10 tahun lalu saya berhenti jadi pengrajin display led matrix), namun kali ini kebetulan ada proyek dan akan saya bagi ilmunya secara perlahan.


PINOUT 



Pinoutnya berupa header 2x8 dan beberapa seller online shop diluar sana menjual header converter ke arduino uno seperti gambar diatas. Jika ingin buat sendiri tentunya tidak akan menjadi kesulitan. Untuk tegangan 5 volt sebaiknya diberikan terpisah dari arduino dengan adaptor 5v yang mempunyai ampere lebih tinggi.



LIBRARY


Library asli dibuat oleh produsen aslinya yaitu FREETRONICS dan dapat di unduh disini. Pemilihan portnya berbasiskan port SPI dimana akan memanfaatkan 2 pin MOSI (13) dan SCK (11). Sedangkan pemilihan pin OE (output enable) harus berhubungan dengan timer1 sehingga kakinya jangan dirubah dari nomer 9.




Untuk menambahkan font yang lebih keren, beberapa pengembang elektronika mikrokontroller di Indonesia berkreasi dengan library DMD3 yang bisa di googling sendiri. 


 SCRIPT 


Saya bagi aja langsung dan semoga bermanfaat untuk belajar kalian maupun tugas di sekolah/kampus.


/*      Sensor Suhu Infra merah
       Tampilan ke Led Matrix P10   
	type : RS-WD-HW-N01 RS485
	www.aisi555.com
	ahocool@gmail.com
*/

#include "BIG7SEGMENT.h"
#include "DMD3.h"
#include "DejaVuSans9.h"
#include "bmz9.h"
#include "bmz6x7.h"

#include <SoftwareSerial.h>
SoftwareSerial mod(12, 10); // RX (A) , TX (B) ke rs485 sensor 


DMD3 display (1,1);


byte baca[] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x01, 0x84, 0x0A};//perintah baca suhu


byte bufferDataModbus[18];
byte *ptr;

int incomingByte ;

int suhune, puluhan, satuan;

bool terima = false;
unsigned long previousMillis = 0;


char dmdBuff1[10]; //Suhu Digit Depan koma
char dmdBuff2[10]; //belakang koma


void scan()
{
    display.refresh();
}

void setup() {
  Serial.begin(9600);
  Serial.println(F("Sensor infra red ke p10"));
  Serial.println(F("http://www.aisi555.com"));
  Serial.println();
 
  mod.begin(4800);
  ptr = bufferDataModbus;

    Timer1.initialize(1350);
    Timer1.attachInterrupt(scan);
    Timer1.pwm(9,255);
 
}

void loop() {
 unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis >= 5000) {
    // timer baca sensor tiap 5 detik 
    previousMillis = currentMillis;   
    //kirim perintah ke modbus baca suhu
   mod.write(baca, sizeof(baca));

   
   
    }

  //check modbus timeout
  long millisResponModbus = millis() + 1000;
  while (!mod.available())
  {
    if (millisResponModbus < millis())
    {
      break;//timeout
    }
  }
 
 // baca data serial yang masuk dari modbus lalu simpan pada pointer
  while (mod.available())
  { 
    byte b = mod.read();
    *ptr++ = b;
    Serial.print("0x");
    Serial.print(String(b, HEX));
    Serial.print(" ");
    delay(2);
    terima = true;
  }


if (terima){
	ptr = bufferDataModbus;

	suhune = (ptr[3] *256) + ptr[4];
	puluhan = suhune / 10;
	satuan = suhune % 10;

	Serial.print("Suhu = ");
	Serial.print(puluhan);
	Serial.print(",");
	Serial.print(satuan);
	Serial.println(" Celcius");

	memset(bufferDataModbus, 0x00, sizeof(bufferDataModbus));
	terima =false;

    display.clear();

    //tulis suhu ke p10
    display.setFont(BIG7SEGMENT);
    sprintf(dmdBuff1, "%.2d", puluhan);
    sprintf(dmdBuff2, "%.1d", satuan);

    display.drawText(0, 0, dmdBuff1);
    display.setFont(bmz9);
    display.drawText(26, -1, "C");
    display.drawRect(22,1,24,3,1);

    display.setFont(bmz6x7);
    display.drawRect(22,13,23,14,1);
    display.drawText(25, 8 , dmdBuff2);
}


}

Share:

Minggu, 17 Maret 2024

[Modbus] Membaca Sensor Suhu RS-WD-HW-N01 RS485 - Arduino

 




Sebagai pembuka saya ingin berbagi bahwa sensor suhu inframerah memiliki beberapa kekurangan yang perlu dipertimbangkan:


1. **Akurasi terbatas**: Akurasi sensor suhu inframerah dapat dipengaruhi oleh berbagai faktor seperti emisivitas objek yang diukur, suhu lingkungan, kelembaban, dan jarak sensor dari objek. Hal ini dapat mengakibatkan pembacaan yang kurang tepat dibandingkan dengan sensor suhu kontak.

2. **Efek permukaan**: Sensor suhu inframerah mengukur suhu permukaan objek. Hal ini dapat menjadi kelemahan ketika berurusan dengan material dengan konduktivitas termal rendah atau permukaan yang tidak merata dalam suhu. Misalnya, permukaan yang mengkilap atau reflektif dapat memantulkan radiasi inframerah lingkungan, menyebabkan pembacaan yang tidak akurat.

3. **Rentang terbatas**: Beberapa sensor suhu inframerah memiliki rentang pengukuran yang terbatas, yang mungkin tidak sesuai untuk semua aplikasi. Sebagai contoh, beberapa sensor mungkin tidak dapat mengukur suhu yang sangat tinggi atau rendah dengan akurat.

4. **Waktu respons**: Sensor suhu inframerah mungkin memiliki waktu respons yang lebih lambat dibandingkan dengan sensor suhu kontak, terutama ketika mengukur suhu yang berubah dengan cepat atau objek yang bergerak.

5. **Interferensi lingkungan**: Faktor lingkungan seperti asap, debu, atau partikel lainnya di udara dapat mengganggu pengukuran suhu inframerah, menyebabkan ketidakakuratan.

6. **Biaya**: Sensor suhu inframerah dapat lebih mahal dibandingkan dengan sensor suhu kontak, terutama untuk model presisi tinggi atau yang memiliki fitur canggih.

7. **Kalibrasi**: Kalibrasi berkala diperlukan untuk menjaga akurasi sensor suhu inframerah. Hal ini membutuhkan peralatan dan keahlian khusus, menambah biaya dan kompleksitas penggunaan sensor tersebut.

8. **Kedalaman penetrasi terbatas**: Radiasi inframerah hanya dapat menembus permukaan objek yang diukur sampai kedalaman tertentu. Hal ini dapat menjadi keterbatasan ketika mengukur suhu material tebal atau tidak tembus pandang.


Meskipun memiliki kelemahan-kelemahan ini, sensor suhu inframerah tetap banyak digunakan dalam berbagai industri karena sifat non-kontaknya, kemudahan penggunaan, dan kecocokannya untuk beberapa aplikasi tertentu.




Praktek kita kali ini menggunakan TTL to RS485 agar data modbus dari sensor suhu infra red (bisa baca dulu disini untuk belajar cara akses sensor ini), dapat diubah level tegangan nya. Dan beberapa tulisan saya mengenai Modbus telah membahas juga namun kebetulan sekali ini adalah kali pertama saya membaca alat modbus menggunakan arduino uno sebagai master. Sebelumnya saya menggunakan esp8266 sebagai master modbus IOT dan arduino micro sebagai slave modbus, bisa dibaca disini dan disini .

Prinsip parsing data modbus pada pembahasan saya terdahulu tahun 2020 (jaman pandemi) seperti script berikut ini :


void loop()
{

unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis >= 5000) {
    // timer baca dht11 tiap 5 detik 
    previousMillis = currentMillis;   
    //kirim perintah ke modbus baca dht 11
   mod.write(humitemp, sizeof(humitemp));
    
    }

  //check modbus timeout
  long millisResponModbus = millis() + 1000;
  while (!mod.available())
  {
    if (millisResponModbus < millis())
    {
      break;//timeout
    }
  }
 
 // baca data serial yang masuk dari modbus lalu simpan pada pointer
  while (mod.available())
  {
    byte b = mod.read();
    *ptr++ = b;
    Serial.print("0x");
    Serial.print(String(b, HEX));
    Serial.print(" ");
    delay(2);

  }

  //proses komparasi data yg masuk (DHT11) dengan array jawaban lalu parsing
  if (memcmp(bufferDataModbus, dhtOK, sizeof(dhtOK)) == 0) {
  ptr = bufferDataModbus;
  Serial.println("");
  Serial.print(F("SUHU :"));
  Serial.print(ptr[4]); //alamat byte ke 4
  Serial.print(F(","));
  Serial.print(ptr[6]); //alamat byte ke 6
  Serial.print(F(" C HUMI :"));
  Serial.print(ptr[8]); //alamat byte ke 8
  Serial.println(" %");
  memset(bufferDataModbus, 0x00, sizeof(bufferDataModbus));
 }


}


Jadi script diatas dulu itu akan menunggu membaca data OK berdasarkan Check Sum / CRC  modbus 16bit. Namun sepertinya itu bisa diabaikan karena hampir error jarang sekali terjadi. Jadi untuk membaca sensor suhu RS-WD-HW-N01 RS485, kira kira scriptnya seperti berikut :


/* Cara baca Sensor Suhu Infra merah
    type : RS-WD-HW-N01 RS485
	www.aisi555.com
	ahocool@gmail.com
*/

#include <SoftwareSerial.h>

SoftwareSerial mod(12, 10); // RX, TX ke rs485

//perintah baca suhu, baca penjelasan di blog
byte baca[] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x01, 0x84, 0x0A};


byte bufferDataModbus[10];
byte *ptr;

int incomingByte ;

int suhune, puluhan, satuan;

bool terima = false;
unsigned long previousMillis = 0;

void setup() {
  Serial.begin(9600);
  Serial.println(F("Testing Sensor Infra Ke Serial"));
  Serial.println(F("http://www.aisi555.com"));
  Serial.println();
  
  //baud rate default 4800
  mod.begin(4800);
  ptr = bufferDataModbus;
 
}

void loop() {
 unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis >= 5000) {
    // timer baca sensor tiap 5 detik 
    previousMillis = currentMillis;   
    //kirim perintah ke modbus baca sensor
   mod.write(baca, sizeof(baca));
    
    }

  //check modbus timeout
  long millisResponModbus = millis() + 1000;
  while (!mod.available())
  {
    if (millisResponModbus < millis())
    {
      break;//timeout
    }
  }
 
 // baca data serial yang masuk dari modbus lalu simpan pada pointer
  while (mod.available())
  {
    byte b = mod.read();
    *ptr++ = b;
    Serial.print("0x");
    Serial.print(String(b, HEX));
    Serial.print(" ");
    delay(1);
    terima = true;
  }

//parsing data suhu dan tampilkan di serial debug

	if (terima){
		ptr = bufferDataModbus;

		suhune = (ptr[3] *256) + ptr[4];
		puluhan = suhune / 10;
		satuan = suhune % 10;

		Serial.print("Suhu = ");
		Serial.print(puluhan);
		Serial.print(",");
		Serial.print(satuan);
		Serial.println(" Celcius");

		memset(bufferDataModbus, 0x00, sizeof(bufferDataModbus));
		terima =false;
		}


}

Hasil dari tangkapan layar debug seperti ini :




Data suhu yang akan dibaca adalah data ke-4 (0x1) dan data ke-5 (0x3E). Data lainnya bisa diabaikan, sehingga rumus parsing saya dilakukan dengan script berikut:


	if (terima){
		ptr = bufferDataModbus; // pindahkan data
                //ini rumus sederhana untuk merubah 2byte modbus jadi desimal
		suhune = (ptr[3] *256) + ptr[4]; //pointer memori mulai dari nol
		puluhan = suhune / 10;
		satuan = suhune % 10;

		Serial.print("Suhu = ");
		Serial.print(puluhan);
		Serial.print(",");
		Serial.print(satuan);
		Serial.println(" Celcius");
               //bersihkan memori
		memset(bufferDataModbus, 0x00, sizeof(bufferDataModbus));
		terima =false;
		}


Sehingga secara gampangannya , 0x01 merupakan  High Byte sehingga dapat dikalikan 256 (desimal) untuk mendapatkan nilai desimal High Byte, sedangkan 0x3E (Low Byte) bernilai  desimal 62, dan selanjutnya tinggal ditambahkan saja yaitu 256 + 62 =  318. Ini cocok hasilnya dengan hexa 0x13E. Sebenernya ada cara lebih "elegan" yaitu dengan geser byte ke kiri, namun saya yakin pembaca akan tambah bingung.



Share:

Jumat, 22 September 2023

[Tutorial] Sensor Suhu Ds18b20 dan output ke display oled

 




Pada beberapa tulisan di blog ini telah sering dibahas mengenai sensor suhu dasar, baik yang paling sederhana LM35 dan yang lumayan cukup sering dipakai untuk sensor IOT yaitu DHT11. Namun untuk pengukuran yang lebih akurat dan mengakomodir suhu negatif, maka kali ini saya pilihkan sensor suhu digital DS18B20. Secara umum rangkaian DS18B20 memerlukan 3 pin dan sebuah resistor pull up data bernilai 4,7K ohm. Praktek kali ini dilakukan bersama mahasiswa teknik listrik vokasi unesa angkatan 2022.





Untuk dapat menjalankan sensor ini pada arduino atau esp8266, library yang perlu di install pada sketch arduino yaitu One Wire dan Dallas Temperature. Perhatikan penjelasan script dasar berikut ini untuk mendapatkan pembacaan suhu yang tepat.


#include <OneWire.h>
#include <DallasTemperature.h>

// Sensor data ke digital pin 4, sesuaikan yg dipakai
#define ONE_WIRE_BUS 4

// inisialisasi nama library one wire
OneWire oneWire(ONE_WIRE_BUS);

// menghubungkan library onewire vs Dallas Temperature 
DallasTemperature sensors(&oneWire);

void setup(void)
{
  // Start serial baud 9600
  Serial.begin(9600);
  // memulai ibrary library
  sensors.begin();
}

void loop(void){ 
  // Panggil pembacaan sensor pada bus one wire
  sensors.requestTemperatures(); 
  //tulis ke serial monitor
  Serial.print("Celsius temperature: ");
  // kasi index 0 karena cuman 1 sensor, bisa untuk banyak sensor
  Serial.print(sensors.getTempCByIndex(0)); 
  Serial.print(" - Fahrenheit temperature: ");
  Serial.println(sensors.getTempFByIndex(0));
  delay(1000);
}

Dan jika rangkaian sudah benar maka hasilnya seperti berikut ini :



Catatan jika menggunakan wemos atau nodemcu, pin yang digunakan disesuaikan dengan tulisan pin pada board, namun asal board yang digunakan sesuai. Perhatikan gambar dibawah ini :




Jadi jika library boardnya sesuai maka cukup mengikuti penamaan pada board yg dipakai, seperti contoh dibawah ini :

 
// Sensor data ke digital pin D4, sesuaikan yg dipakai
#define ONE_WIRE_BUS D4

-  Display Ke OLED 


Layar oled yang kita gunakan adalah OLED SSD12306 dengan lebar layar 128x64 pixel. 



Pin dari OLED ini berbasis I2C 3.3 volt, sehingga VCC/VDD jangan sampai salah colok harus ke pin 3.3 volt pada wemos kamu. I2C merupakan komunikasi data 2 kabel dengan SCK (serial clock) dan SDA (serial data), dimana pada wemos pin SCK = D1 , sedangkan SDA = D2. Untuk mencoba melakukan testing terhadap display oled kamu bisa menggunakan script example pada Library Adafruit_SSD1306 .








catatan: Pada example terdapat kesalahan address dari oled yang dijual dipasaran ( 128 x 64 ) yang seharusnya 0x3C

#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


Lalu mari kita gabungkan 2 koding diatas untuk menampilkan pengukuran sensor suhu DS12B20 pada OLED.


#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <OneWire.h>
#include <DallasTemperature.h>


#define SCREEN_WIDTH 128 // display display width, in pixels
#define SCREEN_HEIGHT 64 // display display height, in pixels

#define SENSOR_PIN D4   // pin sensor DS18B20
#define BUZZER_PIN D5   // pin buzzer

#define display_RESET     -1 // Reset pin 
#define SCREEN_ADDRESS 0x3C ///address i2c oled 
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, display_RESET);

OneWire oneWire(SENSOR_PIN);         // setup a oneWire 
DallasTemperature tempSensor(&oneWire); // pass oneWire 



unsigned long previousMillis = 0;

String tempString,tempString1;
float batas = 35;     // batas suhu biar alarm
float tempCelsius;


void setup() {
  Serial.begin(9600);
  pinMode(BUZZER_PIN,OUTPUT);
  digitalWrite(BUZZER_PIN,LOW);

  // initialize display display with address 0x3C for 128x64
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    while (true);
  }

  delay(2000);         // wait for initializing
  display.clearDisplay(); // clear display

  display.setTextSize(1);          // text size
  display.setTextColor(WHITE);     // text color
  
  displayDisplayCenter("Teknik Listrik", 4);
  displayDisplayCenter("Vokasi Unesa 2023",56);

  display.setTextSize(2);
  display.setCursor(0, 32);        // position to display

  tempSensor.begin();     // initialize the sensor
  tempString.reserve(10); // to avoid fragmenting memory when using String


  

  
}

void loop() {
  tempSensor.requestTemperatures();             // send the command to get temperatures
  tempCelsius = tempSensor.getTempCByIndex(0);  // read temperature in Celsius

  
  tempString  = String(tempCelsius, 2); // two decimal places
  tempString += (char)247;
  tempString += "C";
  
  //biar ketumpuk hitam dulu jika suhu nya berubah
  if(tempString != tempString1)
  {
  display.setTextColor(BLACK);
  displayDisplayCenter(tempString1,28);
  }
  
  tempString1= tempString; 
  Serial.println(tempString); // print the temperature in Celsius to Serial Monitor
  
  //lanjut tulis warna putih
  display.setTextColor(WHITE);
  displayDisplayCenter(tempString,28);


  if( tempCelsius >= batas)  //cek alarm vs buzzer
   {

    digitalWrite(BUZZER_PIN,HIGH);
    delay(200);
    digitalWrite(BUZZER_PIN,LOW);
    delay(50);
   }
  
  else digitalWrite(BUZZER_PIN,LOW);
   
}

//function agar tulisan rata tengah (center)

void displayDisplayCenter(String text, int posisi) {
  int16_t x1;
  int16_t y1;
  uint16_t width;
  uint16_t height;

  display.getTextBounds(text, 0, 0, &x1, &y1, &width, &height);

  display.setCursor((SCREEN_WIDTH - width) / 2, posisi);
  display.println(text); // text to display
  display.display();
}

Dan hasilnya menjadi keren seperti ini :




Share:

Rabu, 20 September 2023

[Tutorial] Dasar Input - Output Pada Mikrokontroler




Pada umumnya terdapat 2 jenis input output yang terlihat paling "sederhana" dan paling sering dibahas pada sebuah sistem mikrokontroler AVR, arduino maupun ESP 8266. Dari list dibawah ini, nomer 1 dan 2 akan kita praktekkan pada tulisan blog kali ini, bersama dengan adik - adik mahasiswa di jurusan teknik listrik vokasi unesa Surabaya. 


Jenis Input Output :

  1. Digital Pin
  2. Analog Pin
  3. PWM
  4. Serial
  5. I2C
  6. SPI

- DIGITAL PIN

Digital pin ini merupakan hal yang paling dasar yang pertama kali harus dipraktekkan ketika memulai mikrokontroler sekelas arduino. Coba pembaca buka sketch dan akan menemukan example yang bernama "blink" yang merupakan coding untuk menyalakan dan mematikan LED internal pada bord arduino ( jenis apapun ) yang umumnya berada pada pin 13.


 void setup() {
  // inisialisasi digital pin LED_BUILTIN sebagai output.
  pinMode(LED_BUILTIN, OUTPUT);
}

//the loop function muter terus
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);  // HIGH = Nyala
  delay(1000);                      // Tunggu 1 detik
  digitalWrite(LED_BUILTIN, LOW);   // LOW = Mati
  delay(1000);                      // Tunggu 1 detik
}


Dan kemudian perhatikan gambar ekuivalen dari sebuah Bit Input Output pada mikrokontroler, melalui tombol sebagai Input dan Led sebagai output .



Saya ingin membuat penekanan tombol switch tactile bereaksi terhadap led, dan tidak ingin menjadi on off seperti saklar biasa. Jadi saat tombol (aktif low / pull up) maka akan merubah status dari led nyala atau mati. Perhatikan script berikut dan akan saya bahas per bagian.


const int buttonPin = 9;     // pin push button
const int ledPin =  13;      // pin LED

int buttonState = 0;         // variable status tombol
bool ledstate;

void setup() {
  //Pin LED sebagai output
  pinMode(ledPin, OUTPUT);
  // tombol sebagai intput
  pinMode(buttonPin, INPUT);
   
  //status awal led mati 
  ledstate = false;
  digitalWrite(ledPin, LOW);

  Serial.begin(9600); //agar bisa dilihat pada terminal
}

void loop() {

  // baca status tombol
  buttonState = digitalRead(buttonPin);

  // cek status tombol High atau Low
  if (buttonState == HIGH) {
    
    //nyalakan led dan ubah status led 
    if ( !ledstate){
      digitalWrite(ledPin, HIGH);
      ledstate =true;
      //kirim serial
      Serial.println("Kondisi led = Nyala");
     }
    //matikan led
     else {
      digitalWrite(ledPin, LOW);
      ledstate = false;
      Serial.println("Kondisi led = mati");
    }
  delay(200);
    
  } 
  
}


Dari script diatas, penjelasan perbagian  bisa dilihat pada bagian script berwarna merah, dan yang paling utama adalah proses perubahan status boolean dari led status yang akan tersimpan sesuai kondisi terakhir dari led.

    //nyalakan led dan ubah status led 
    if ( !ledstate){
      digitalWrite(ledPin, HIGH);
      ledstate =true;
      //kirim serial
      Serial.println("Kondisi led = Nyala");
     }

    //matikan led
    else {
      digitalWrite(ledPin, LOW);
      ledstate = false;
      Serial.println("Kondisi led = mati");
    }


Terdapat perintah Serial.println yang bertujuan untuk melihat kondisi led pada serial monitor yang merupakan fasilitas debuging paling utama pada sketch arduino.




Pada tulisan selanjutnya akan saya bahas input analog yang sangat bermanfaat.


Share:

Rabu, 25 Mei 2022

LoRaWan - Antares id "Hello World" dengan SX1276 / RFM95 di Frekuensi AS923-2

 


Lora bukanlah barang yang asing bagi saya karena telah cukup lama mengenal modul modem RF nya kira-kira 7 tahun yang lalu, dan berhasil mengirimkan data text / terminal serial antar 2 modul lora (point to point) yang saya letakkan dari ujung ke ujung jembatan Suramadu. Kala itu modul yang digunakan masih menggunakan frekuensi 433 Mhz yang cukup terjangkau harganya,  namun setelah praktek sederhana ini saya merasa tak ada yg spesial dari sekedar kirim-kiriman data jarak jauh. Kemudian ketika konsep IOT saya sudah lumayan mendapatkan pencerahan dan lebih memilih wifi sebagai koneksi paling murah meriah, maka modul ini jadi terlupakan dan entah terselip dimana. Apalagi kemudian pemerintah baru men-standarkan dan meregulasi frekuensi lora sesuai dengan pembagian regional ITU - Lora aliance yaitu di 923Mhz pada tahun 2019.

Ketiadaan gateway lora pada tahun dimana saya mencoba lora juga menjadi kendala untuk oprek-oprek, dan saat itu pernah membantu seorang mahasiswa menyeting GW Lora dragino yang ternyata harganya sangat memberatkan kantong mahasiswa. Baik TTN ( the things network) maupun Lora alliance tidak muncul juga gatewaynya saat saya getol2nya mengoprek modul lora 433Mhz. Sampai suatu ketika saya mendapatkan request pembaca untuk menengok perkembangan gateway LoraWan yang dipasang telkom bersama mitratel. Lalu meluncurlah saya ke websitenya Telkom iot dan mendapatkan Lorawan nya ternyata telah di deploy dan memancar dilokasi yang tak jauh dari kediaman saya.


 





Peta diatas terasa sangat familiar bagi saya, perasaan de-ja-vu pun muncul...yahh karena telkom surabaya adalah mantan terindah buat saya. Cieee...cieee....ya iyalah hampir 9 tahun saya berkutat dengan map dan coverage persis dengan gambar diatas. Dan benar saja lingkaran merah yang menyatakan sinyal Lorawan nya besar, itu berada pada titik lokasi STO Telkom yang memiliki tower BTS / Radio. Yahhh..kenangan mantan memang menyakitkan, namun saya harus MOVE ON dan segera mencari modul Lora dengan frekuensi sesuai standar di Indonesia.



  

Banyak modul Lora yang beredar di pasaran online, dan saya sangat berhati-hati agar tidak salah membeli karena dana sedang tipis-tipisnya. Apalagi ada yg memberitahu saya kalau modul lora berbasis esp32 TTG / LilyGo sedang kosong dipasaran. Pilihan datang ke breakout board Lora berbasis SX1276 atau RFM95 yang lumayan terjangkau, namun belum siap pakai karena harus melakukan penyesuaian ke microcontroller yang digunakan. Namun setelah diyakinkan oleh seller online nya dan seharian membaca di internet, saya memutuskan untuk membelinya dan menyandingkannya dengan Arduino nano yang teronggok tak terpakai di gudang. Rangkaian / skematik yg saya gunakan kira-kira tak jauh dari yang bisa didapatkan di internet.



Library yang pertama saya gunakan adalah library LoraId milik antares yang tersedia di sketch arduino, maupun library lainnya yang terdapat pada modul training di website antares. Sesuai pengalaman sebelumnya saat saya membahas library Antares, muncul keraguan kalau library ini tidak bisa langsung pakai dan harus saya oprek terlebih dahulu. Dan benar saja modul lora yang sukses saya koneksikan ke arduino, ternyata tidak mengirimkan data ke console web antares. 



  

Bahkan saya harus berkeliling kota, nostalgia pekerjaan 10 tahun yang lalu yaitu mencari sinyal sesuai peta coverage yang diberikan Telkom. Namun tetap saja hasilnya zonk ! Saya menggunakan script example yang ada pada librarynya Lora-antares, namun kenapa gagal ya ?



Pulang dengan tangan hampa dan wajah terbakar panasnya matahari Surabaya, saya teringat bagaimana proses yg saya lakukan ketika dulu, saya pernah menemukan bug pada library antares yang pernah saya bahas disini.  Saya menggunakan mode koneksi ke gateway secara ABP (Activation by Personalization) sehingga id dan key saya tetap gak berubah, dibanding saya harus menggunakan Autentifikasi lewat OTAA. Jadi kira-kira analisa saya, kenapa tidak bisa terhubung ke gateway antares,  seperti ini:


  1. NwkSkey, ApkSkey dan DevAdress kemungkinan salah format
  2. Frekuensi yang digunakan tidak tepat
  3. Library nya kacau ayuk diubah aja


Berdasarkan tutorial dari librarynya antares, key dan id dari device lora di console antares, mirip dengan yang diajarkan sebelumnya untuk library lainnya, yaitu seperti script ini :


  // Put Antares Key and DevAddress here
  lora.setAccessKey("your Access Key");
  lora.setDeviceId("your Device Id");


Lalu menurut contoh pada modul tutorial, setAccessKey didapatkan dengan melihat pair key dari id userkey di console antares yang berformat : 1111111111111111:2222222222222222 . Jadi 16karakter:16karakter. Namun saat di jalankan maka dilihat pada debug terminal, format dari  NwkSkey dan ApkSkey sesuai dengan literatur yang saya baca yaitu 128bit atau 32 karakter. Sedangkan format device ID nya benar.




Kecurigaan muncul dari saat proses ADD DEVICE lalu SETLORA. Ternyata sudah disediakan NwkSkey dan ApkSkey namun tidak ditampilkan pada console. Dilalahnya pair userkey bukanlah seperti key 128 bit yang ditampilkan pada layar.



Kacau bukan ? Apakah tebakan saya benar dan berhasil mengirimkan pesan ke Gateway? Oooo..tentu tidak semudah itu kawan! Ternyata masih zonk dan kemudian saya melanjutkan kecurigaan dengan frekuensi. Benar saja ada perbedaan tabel frekuensi antara library pada sketch arduino dan tutorial web antares. Dan menurut keputusan kominfo, frekuensi gateway telkom ada pada rentang 921.2 Mhz - 922.6 Mhz dengan jarak tiap channel 200kHz. Ahhh pusing banget harus oprek librarynya antares dan saya kemudian beralih ke 2 library yang saya temukan di Internet yaitu :

  1. Lorawan Packet  by Ricaun disini
  2. Arduino-LoRa by Sandeep Mistry disini


Jadi saya install ke dua library diatas yang saling  berhubungan, dan script testingnya pun sangat mudah dipahami seperti berikut :




#include <SPI.h>
#include <LoRa.h>

#include <LoRaWanPacket.h>
// sesuaikan pin yang dipakai
const int csPin = 10;
const int resetPin = 9;
const int irqPin = 2; // DIO0
//sesuaikan key dan address device lora antares
const char *devAddr = "xxxxxxxx";
const char *nwkSKey = "11111111111111110000000000000000";
const char *appSKey = "00000000000000002222222222222222";

unsigned int counter = 1; 

struct LoRa_config
{
  long Frequency;
  int SpreadingFactor;
  long SignalBandwidth;
  int CodingRate4;
  bool enableCrc;
  bool invertIQ;
  int SyncWord;
  int PreambleLength;
};
//frekuensi  SF BW dan sebagainya
static LoRa_config txLoRa = {922000000, 10, 125000, 5, true, false, 0x34, 8};

void LoRa_setConfig(struct LoRa_config config)
{
  LoRa.setFrequency(config.Frequency);
  LoRa.setSpreadingFactor(config.SpreadingFactor);
  LoRa.setSignalBandwidth(config.SignalBandwidth);
  LoRa.setCodingRate4(config.CodingRate4);
  if (config.enableCrc)
    LoRa.enableCrc();
  else
    LoRa.disableCrc();
  if (config.invertIQ)
    LoRa.enableInvertIQ();
  else
    LoRa.disableInvertIQ();
  LoRa.setSyncWord(config.SyncWord);
  LoRa.setPreambleLength(config.PreambleLength);
}

void LoRa_TxMode()
{
  LoRa_setConfig(txLoRa);
  LoRa.idle();
}

void setup()
{
  Serial.begin(115200);
  while (!Serial);

  LoRaWanPacket.personalize(devAddr, nwkSKey, appSKey);

  LoRa.setPins(csPin, resetPin, irqPin);

  if (!LoRa.begin(txLoRa.Frequency)) {
    Serial.println("LoRa init failed. Check your connections.");
    while (true);
  }

  Serial.println("LoRa init succeeded.");
  Serial.println();

  LoRa_sendMessage();
}

void loop() {
  if (runEvery(10000)) {

    LoRa_sendMessage();
    counter++;
    Serial.println("Send Message!");
  }
}

void LoRa_sendMessage()
{
  LoRa_TxMode();
  LoRaWanPacket.clear();
  LoRaWanPacket.print("Hello World");
  LoRaWanPacket.print(" data ke-");
  LoRaWanPacket.print(String(counter));
  if (LoRaWanPacket.encode()) 
  {
    LoRa.beginPacket();
    LoRa.write(LoRaWanPacket.buffer(), LoRaWanPacket.length());
    LoRa.endPacket();
  }
}

boolean runEvery(unsigned long interval)
{
  static unsigned long previousMillis = 0;
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval)
  {
    previousMillis = currentMillis;
    return true;
  }
  return false;
}

Hasilnya diluar dugaan saya dapat mengirim pesan ke gateway dengan lancar. Saya menggunakan frekuensi yang FIX sesuai dengan tabel frekuensi yang digunakan oleh gateway Lora nya Telkom.




Lalu bagaimana dengan librarynya telkom antares? Kalau ini sih saya gak akan bagikan disini karena sangat membingungkan untuk dijelaskan melalui tulisan. Namun intinya dapat saya ceritakan kalau library nya telkom antares / LoraId kurang bagus saat TX dibandingkan dengan  library lorawan packet. Ada pesan yang tidak nyantol ke antares jika menggunakan library bawaan, ketimbang lorawan packet yang selalu sukses. Namun dengan oprekan tambal sulam yg saya lakukan di library LoRa antares, saya dapat mengirimkan pesan downlink secara MQTT menuju arduino saya melalui LORA GATEWAY. Jarak lokasi rumah dengan titik BTS Gateway LoraWAN di telkom sekitar 1 km.





Wahh..jadi gatel nihh pengen lanjut cek sinyal lora keliling Surabaya...tunggu episode berikutnya yaa...







Share:

Rabu, 18 Agustus 2021

Wemos Esp8266 - Part 1 - Hello World !

 

WeMos-D1R2 adalah kit mikrokontroller berkemampuan WiFi berbasis ESP8266-12 yang kompatibel dengan kit Arduino-UNO. Itu berarti papan circuitnya didesain sama dan berfungsi (layaknya) seperti UNO. Tampaknya beberapa shield, sensor, dan perangkat I/O yang dibuat untuk platform Arduino akan bekerja pada WeMos-D1R2 dengan keuntungan sudah tersedia modul WiFi bawaan.


Ada dua produk WeMos yg beredar di pasaran online dan rata-rata merupakan clone ( KW ) namun harganya terjangkau. Yang pertama adalah WeMos-D1 R2 seperti penjelasan diatas, jangan sampai beli versi jadulnya ya. Sedangkan versi mungilnya D1 mini yg menyediakan versi " siap launching " semisal anda mau menjual kontrol elektronik yg packingnya lebih sederhana. D1 R2 memiliki level tegangan I/O 3.3 - 5Volt, sedangkan D1 mini umumnya menggunakan level logic 3,3 volt. Namun anda tidak perlu dipusingkan dengan level logic karena modul siap pakai yg beredar umumnya mampu menghandel logic ini, kecuali menggunakan tambahan IC TTL jadul maka harus menggunakan logic 5 volt 


Saya akan berfokus pada D1 R2 karena sudah tersolder dan siap pakai. Jadi dalam praktek hello World kali ini perlu disiapkan perangkat tambahan :


DHT11 / DHT22





Kabel Jumper Male Female untuk koneksi ke komponen lainnya




Sebelum instalasi pada komputer maka butuh sesuatu untuk menghubungkan wemos ke komputer berupa kabel data micro usb, yg pasti anda temui di charger hp jaman now. Untuk power supply tegangan dari Wemos D1 R2 cukup menggunakan catuan PC dari kabel data micro USB itu juga, jadi tanpa butuh adaptor atau power supply lagi. 

Wemos D1 R2 memiliki chipset USB to serial jenis ch340, sehingga butuh mendapatkan driver yg sesuai, bisa diunduh untuk berbagai jenis OS komputer disini . Jika sukses maka akan muncul com portnya seperti gambar dibawah.







Sedangkan untuk software IDE yg digunakan adalah sketch milik Arduino yang berbasis java. Jadi kalau windows mungkin akan memakan memory namun untuk linux dapat dikatakan lebih cepat eksekusinya. Unduh saja di websitenya : https://www.arduino.cc/en/software






Karena kita akan menggunakan boards yg merupakan bukan boards asli arduino, maka langkah pertama setelah instalasi selesai adalah memberikan library/packages untuk board wemos. Pilih menu preferences pada gambar.




Lalu masukkan pada additional boards : 

http://arduino.esp8266.com/stable/package_esp8266com_index.json 






Jika OK maka pada menu boards manager maka akan dapat menambahkan boards microcontroller berbasis ESP8266 seperti wemos dan sejenis.






Tunggu sebentar untuk loading daftar boards dan ketika sudah loading semua, pilihlah yg paling bawah seperti pada gambar berikut :




Lanjutkan install boards berbasis esp8266, jika selesai lanjutkan dengan memilih board wemos D1 R2 pada menu boards.





Langkah selanjutnya hanya meilih PORT COM yang sesuai, dan kemudian buka sketch dan tambahkan script hello world seperti berikut :



void setup() {
 Serial.begin(9600);

}

void loop() {
  Serial.println("Hello World");
  delay(1000);

}

Script singkat diatas akan mengirimkan "hello world" ke serial com di PC kamu dengan baud rate 9600.






Serial monitor pada pojok kanan atas sketch arduino merupakan alat debugging paling powerful terutama saat melihat output pada suatu kejadian atau perubahan variabel.

Lalu bagaimana dengan sensor suhu kelembaban DHT 11? Untuk praktek ini kita perlu menginstall library  unified sensor "adafruit" dan library  DHT. Pilih tools => Manage libraries dan ikuti gambar dibawah.





Selanjutnya hubungkan DHT11 dengan header female, (+) (Out) (-) , sedangkan male nya colokkan ke wemos dengan pin (+) ke 5V, (-) ke GND dan kabel jumper (Out) masukkan ke pin D3 (cari label atau tulisan di atas board) . Script contohnya sebagai berikut :




#include "DHT.h"

#define DHTPIN D3     
#define DHTTYPE DHT11   // DHT 11

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  Serial.println(F("DHT HELLO WORLD!"));
  
  dht.begin();
}

void loop() {
  
  delay(2000);

  //read kelembaban
  float h = dht.readHumidity();
  // Read temperatur celcius
  float t = dht.readTemperature();
 

  // Check error
  if (isnan(h) || isnan(t) ) {
    Serial.println(F("Gagal Terhubung Sensor DHT!"));
    return;
  }

  Serial.print(F("Humidity: "));
  Serial.print(h);
  Serial.print(F("%  Temperature: "));
  Serial.print(t);
  Serial.println(F("°C "));
}



Hasilnya sebagai berikut :






Dibagian selanjutnya kita akan mulai menghubungkan wemos ke WiFi dan berkomunikasi secara TCP ke perangkat lainnya.

Share:

Attiny2313 vs Arduino Library, bagaimana solusinya agar tidak habis memorynya ?

 



Seperti yang saya sudah kira sebelumnya kalau platform bernama arduino ini,  memang dirancang untuk IC AVR dengan memory baik flash maupun RAM yang ukurannya berlimpah. Sekelas board arduino UNO menggunakan ATmega328 dengan kapasitas flas 32Mb dan memory SRAM sebanyak 2Kb. Jadi para pembuat library lumayan leluasa untuk berkreasi. Bagaimana dengan Attiny2313 yg hanya flash 2Kb dan memory ram 128 bytes? Ya lihat saja gambar diatas, untuk melakukan pengiriman serial pun sudah menghabiskan memory ram 70% dan ini dijamin akan membuat proses tidak berjalan.

Solusi yang diperlukan untuk mengatasi masalah ini adalah kembali ke model bit banging pada register yg khusus berhubungan dengan komunikasi serial, yang pada attiny2313 berada pada bagian  :

  1. UCSR A/B/C
  2. UBRR L/H
Selengkapnya bisa dilihat pada datasheet dan saya sarankan bisa baca pada project pengenalan USART atau komunikasi serial disini : https://www.aisi555.com/2013/06/tutorial-komunikasi-serial-pada.html .

Jika anda menggunakan  USART atau komunikasi serial pada ATtiny 2313 maka butuh clock yang akan mudah dibagi dengan baudrate umum semisal 9600. Jadi karena dengan adanya DIV8 pada Fusebit ATtiny, maka butuh mengubah setting clock div8 agar attiny menggunakan clok internal 8Mhz. Caranya seperti pada gambar berikut ini :




Mungkin hal ini lebih mudah dilakukan jika kamu menggunakan programmer / dowloader AVR ISP MK2 yg bisa langsung merubah fusebit di atmel studio, seperti yg pernah dibahas disini : https://www.aisi555.com/2013/02/pejelasan-mengenai-fusebit-dari-avr.html . Jadi karena kita menggunakan USBasp maka diingat nilai yg didapat pada kalkulator fusebit tadi yaitu : 

  • LOW = 0xE4
  • HIGH = 0xDF
  • Extended = 0xFF
Lalu bisa dilanjutkan pada Avrdude versi Gui yang lebih gampang dan menghindari kesalahan saat melakukan setting fusebit.





Selanjutnya dengan memasukkan script pada pelajaran komunikasi serial sebelumnya, maka kirim-kiriman serial attiny menggunakan sketch arduino dapat berlangsung dengan lancar.


#define USART_BAUDRATE 9600  // baudrate 9600 bps
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
void init_usart(void)

{

  UCSRB |= (1 << TXEN);   // kirim aja
  UCSRC |= (1 << UCSZ0) | (1 << UCSZ1);
  UBRRL = BAUD_PRESCALE;
  UBRRH = (BAUD_PRESCALE >> 8);

}

void USART_Tx(unsigned char data)

{
  
  while (!(UCSRA & (1<<UDRE)));{} // wait till transmit Data register is empty
  UDR = data; // Send data to the computer


}


void setup() {
  init_usart();


}

void loop() {
  USART_Tx('h');USART_Tx('a');USART_Tx('l');USART_Tx('0');USART_Tx('\n');
  delay(1000);

}





Lalu apa bedanya dengan programming atau koding pada atmel studio ? Ya begitulah tak ada kemewahan library pada chip microcontroller versi mungil seperti attiny, jadi butuh kembali ke dasar pemahaman mengenai register dan proses geser-geser bit, yang akan kita dalami kembali di bagian berikutnya saat attiny akan dicoba mengirim data serial berupa pembacaan sensor DHT11.

Share:

Kontak Penulis



12179018.png (60×60)
+628155737755

Mail : ahocool@gmail.com

Site View

Categories

555 (8) 7 segmen (3) adc (4) amplifier (2) analog (19) android (12) antares (10) arduino (26) artikel (11) attiny (3) attiny2313 (19) audio (5) baterai (5) blog (1) bluetooth (1) chatgpt (2) cmos (2) crypto (2) dasar (46) digital (11) dimmer (5) display (3) esp8266 (26) euro2020 (13) gcc (1) iklan (1) infrared (2) Input Output (3) iot (62) jam (7) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (17) komputer (3) komunikasi (1) kontrol (8) lain-lain (8) lcd (2) led (14) led matrix (6) line tracer (1) lm35 (1) lora (10) MATV (1) memory (1) metal detector (4) microcontroller (70) micropython (6) mikrokontroler (1) mikrokontroller (14) mikrotik (5) modbus (9) mqtt (3) ninmedia (5) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (88) pcb (2) power (1) praktek (2) project (33) proyek (1) python (7) radio (28) raspberry pi (4) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (2) sharing (3) signage (1) sinyal (1) sms (6) software (18) solar (1) solusi (1) tachometer (2) technology (1) teknologi (2) telegram (2) telepon (9) televisi (167) television (28) transistor (2) troubleshoot (3) tulisan (93) tutorial (108) tv digital (6) tvri (2) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika