Translate

Menampilkan Suhu Kelembaban Interface DMD P10 Sensor DHT11

Menampilkan Suhu Kelembaban Interface DMD P10 Sensor DHT11


       Pada kesempatan kali ini saya akan mnejelaskan mengenai bagaimana cara membuat sebuah alat dengan tampilan dmd p10 untuk menampilkan nilai suhu kelembaban sensor dht11. jadi alat ini cuma butuh 3 item utama yaitu ARduino uno, DMD P10 dan sensor dht11 untuk deteksi suhu kelembaban. untuk lebih jelasnya berikut kodingnya.


1. Program Arduino IDE

#include <Wire.h>
#include <SPI.h>        //SPI.h must be included as DMD is written by SPI (the IDE complains otherwise)
#include <DMD.h>        //Library DMD yang menyediakan fungsi penampilan teks, gambar dsb
#include <TimerOne.h>   //Library peripheral Timer1 untuk menjalankan prosedur pindai panel DMD
#include <Time.h>     //Library waktu yang menyediakan tipe data, struktur, dan obyek waktu
#include "DHT.h"
#include "Arial_black_16.h"
#include "Arial_Black_16_ISO_8859_1.h"
#include "Arial14.h"
#include "DejaVuSans9.h"
#include "DejaVuSansBold9.h"
#include "DejaVuSansItalic9.h"
#include "Droid_Sans_12.h"
#include "Droid_Sans_16.h"
#include "Mono5x7.h"
#include "SystemFont5x7.h"

#define DHTPIN 2
#define DHTTYPE DHT11

#define WAKTU_TAMPIL_JAM      10    //detik
#define WAKTU_TAMPIL_KALENDAR 5     //detik

#define DISPLAY_COLUMN_COUNT  2
#define DISPLAY_ROW_COUNT     1

#define PIXELS_PER_COLUMN  32
#define PIXELS_PER_ROW    16

DMD dmd(DISPLAY_COLUMN_COUNT, DISPLAY_ROW_COUNT);
unsigned char show = 0;

unsigned int suhu;
unsigned int suhux;
unsigned int dataadc;

char lineBuff[20];
char lineBuffx[20];
DHT dht(DHTPIN, DHTTYPE);
  
void ScanDMD()
{
  dmd.scanDisplayBySPI();
}

void setup(void)
{
  dht.begin();
  dmd.clearScreen( true );   //true is normal (all pixels off), false is negative (all pixels on)
  Serial.begin(9600);
   //initialize TimerOne's interrupt/CPU usage used to scan and refresh the display
  Timer1.initialize( 1000 );           //period in microseconds to call ScanDMD. Anything longer than 5000 (5ms) and you can see flicker.
  Timer1.attachInterrupt( ScanDMD );   //attach the Timer1 interrupt to ScanDMD which goes to dmd.scanDisplayBySPI()

  //clear/init the DMD pixels held in RAM
  dmd.clearScreen( true ); 
 
}

void loop(void)
{
       int h = dht.readHumidity();  
       int t = dht.readTemperature();
       dataadc = analogRead(A0);
     
      sprintf(lineBuff, "%d|%d", t, h);
      sprintf(lineBuffx, "%d ", dataadc);

      dmd.selectFont(DejaVuSans9);
      dmd.selectFont(Mono5x7);
      dmd.drawString( 33,  0, lineBuff, strlen(lineBuff), GRAPHICS_NORMAL);  
      dmd.drawString( 33,  8, lineBuffx, strlen(lineBuffx), GRAPHICS_NORMAL);  


delay(1000);
}



2, Skema PIN 

a. Sensor dht11 : VCC ke 5v, GND ke GND , OUT ke pin 2 Arduino
b. P10 ke arduino seperti berikut.
 
 GND - GND
 PIN 6 - A
 PIN 7 - B
 PIN 8 - SCLK
 PIN 9 - OE
 PIN 11 - R
 PIN 13 - CLK




Running Text ESP32 Input Via WIFI HOTSPOT

Running Text ESP32 Input Via WIFI HOTSPOT
 

         Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang bisa digunakan untuk input text via wifi handphone. alat ini menggunakan wifi untuk input textnya sehingga meudahkan user dalam penggunaannya. untuk lebih jelasnya berikut adalah koding dan skemanya. jika ingin pesan modul esp32 yang sudah di program dan tinggal pakai bisa cek di link shopee berikut.  

 LINK PEMBELIAN SHOPEE : https://id.shp.ee/eVqaTRRi

 
1. Skema 
 

 
2. Program Arduino IDE
 
 /*
GND – GND
OE – D23
A – D19
B – D21
CLK – D18
LAT – D2
DR – D23
VCC – VP
GND – EN
*/

#include <WiFi.h>
#include <WebServer.h>
#include <DMD32.h>
#include "fonts/SystemFont5x7.h"
#include "fonts/Arial_black_16.h"
#include "PageIndex.h" //--> Include the contents of the User Interface Web page, stored in the same folder as the .ino file
#include <Preferences.h>
//----------------------------------------

//----------------------------------------Defining the key.
// "Key" functions like a password. In order to change the text on the P10, the user must know the "key".
// You can change it to another word.
#define key_Txt "123456789"
//----------------------------------------

// Fire up the DMD library as dmd.
#define DISPLAYS_ACROSS 1
#define DISPLAYS_DOWN 1
DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);

// Timer setup.
// create a hardware timer  of ESP32
hw_timer_t * timer = NULL;

const char* ssid = "ESP32_WS";  //--> access point name
const char* password = "123456789"; //--> access point password

IPAddress local_ip(192,168,1,1);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);
//----------------------------------------

String display_Modes = "";
String single_Row_Txt = "";
String double_Row_First_Txt = "";
int double_Row_First_Txt_Pos = 0;
String double_Row_Second_Txt = "";

// Server on port 80.
WebServer server(80);  

// Initialize Preferences.
Preferences preferences;

//________________________________________________________________________________IRAM_ATTR triggerScan()
// Interrupt handler for Timer1 (TimerOne) driven DMD refresh scanning, 
// this gets called at the period set in Timer1.initialize();
void IRAM_ATTR triggerScan() {
  dmd.scanDisplayBySPI();
}
//________________________________________________________________________________

//________________________________________________________________________________handleRoot()
// This routine is executed when you open ESP32 IP Address in browser.
void handleRoot() {
  server.send(200, "text/html", MAIN_page); //Send web page
}
//________________________________________________________________________________

//________________________________________________________________________________handleSettings().
// Subroutine to handle settings. The displayed text and others are set here.
void handleSettings() {
  timerAlarmDisable(timer);
  delay(1000);
  
  String incoming_Settings = server.arg("Settings");
  Serial.println();
  Serial.print("Incoming settings : ");
  Serial.println(incoming_Settings);
  
  // Example of incoming data from a client in double row display mode : 
  // "p10esp32wb,DR,ESP32,1,ESP32 P10 LED Display"
  // - p10esp32wb             = key.
  // - DR                     = Double Row (Two row display mode).
  // - ESP32                  = Text for the first row.
  // - 1                      = Position of text for first row.
  // - ESP32 P10 LED Display  = Text for the second row.
  //
  // - When using the "getValue" string function, the sequence is:
  //   "p10esp32wb,DR,ESP32,1,ESP32 P10 LED Display"
  //        |       |   |   |           |
  //        0       1   2   3           4
  //
  //   > p10esp32wb = getValue(incoming_Settings, ',', 0);
  //   > DR         = getValue(incoming_Settings, ',', 1);
  //   > and so on.

  if (getValue(incoming_Settings, ',', 0) == key_Txt) {
    display_Modes = getValue(incoming_Settings, ',', 1);

    if (display_Modes == "SR") {
      single_Row_Txt = getValue(incoming_Settings, ',', 2);
      
      // Save texts and modes to flash memory.
      preferences.begin("P10_SD", false);
      preferences.putString("DM", display_Modes);
      preferences.putString("SRT", single_Row_Txt);
      preferences.end();
      delay(500);
    }
  
    if (display_Modes == "DR") {
      double_Row_First_Txt = getValue(incoming_Settings, ',', 2);
      double_Row_First_Txt_Pos = getValue(incoming_Settings, ',', 3).toInt();
      double_Row_Second_Txt = getValue(incoming_Settings, ',', 4);
      
      // Save texts and modes to flash memory.
      preferences.begin("P10_SD", false);
      preferences.putString("DM", display_Modes);
      preferences.putString("DRFT", double_Row_First_Txt);
      preferences.putInt("DRFTP", double_Row_First_Txt_Pos);
      preferences.putString("DRST", double_Row_Second_Txt);
      preferences.end();
      delay(500);
    }

    server.send(200, "text/plane", "+OK");  //--> Sending replies to the client.
    delay(500);
  } else {
    server.send(200, "text/plane", "+ERR"); //--> Sending replies to the client.
    delay(500);
  }
  
  timerAlarmEnable(timer);
  delay(500);
}
//________________________________________________________________________________

//________________________________________________________________________________getValue()
// String function to split strings based on certain characters.
String getValue(String data, char separator, int index) {
  int found = 0;
  int strIndex[] = { 0, -1 };
  int maxIndex = data.length() - 1;
  
  for (int i = 0; i <= maxIndex && found <= index; i++) {
    if (data.charAt(i) == separator || i == maxIndex) {
      found++;
      strIndex[0] = strIndex[1] + 1;
      strIndex[1] = (i == maxIndex) ? i+1 : i;
    }
  }
  return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
}
//________________________________________________________________________________ 

//________________________________________________________________________________Single_Row_Display_Mode()
// Subroutine for displaying "running text" on P10 in Single Row mode.
void Single_Row_Display_Mode() {
  char CA_single_Row_Txt[single_Row_Txt.length() + 1];
  single_Row_Txt.toCharArray(CA_single_Row_Txt, single_Row_Txt.length() + 1);

  dmd.clearScreen(true);
  dmd.selectFont(Arial_Black_16);
  dmd.drawMarquee(CA_single_Row_Txt, single_Row_Txt.length(), (32*DISPLAYS_ACROSS)-1, 0);
  long start=millis();
  long timer=start;
  boolean ret=false;
  while(!ret){
   if ((timer+30) < millis()) {
     ret=dmd.stepMarquee(-1,0);
     timer=millis();
   }
  }
  delay(1000);
}
//________________________________________________________________________________ 

//________________________________________________________________________________Double_Row_Display_Mode()
// Subroutine to display text in the first row and display "running text" in the second row in Double Row mode.
void Double_Row_Display_Mode() {
  char CA_double_Row_First_Txt[double_Row_First_Txt.length() + 1];
  double_Row_First_Txt.toCharArray(CA_double_Row_First_Txt, double_Row_First_Txt.length() + 1);

  char CA_double_Row_Second_Txt[double_Row_Second_Txt.length() + 1];
  double_Row_Second_Txt.toCharArray(CA_double_Row_Second_Txt, double_Row_Second_Txt.length() + 1);

  dmd.clearScreen(true);
  dmd.selectFont(SystemFont5x7);
  dmd.drawString(double_Row_First_Txt_Pos, 0, CA_double_Row_First_Txt, double_Row_First_Txt.length(), GRAPHICS_NORMAL);
  
  int scrl_long = (double_Row_Second_Txt.length()*6) + (32*DISPLAYS_ACROSS);
  int i = 32*DISPLAYS_ACROSS;
  long start=millis();
  long timer=start;
  while(true){
    if ((timer+30) < millis()) {
      dmd.drawString(i, 9, CA_double_Row_Second_Txt, double_Row_Second_Txt.length(), GRAPHICS_NORMAL);    
      if (i > ~scrl_long) {
        i--;
      } else {
        break;
      }
      timer=millis();
    }
  }
}
//________________________________________________________________________________ 

//________________________________________________________________________________VOID SETUP()
void setup(void){
  // put your setup code here, to run once:
  
  Serial.begin(115200);
  delay(1000);
  
  Serial.println();

  display_Modes.reserve(5);
  single_Row_Txt.reserve(50);
  delay(500);

  //----------------------------------------Load data stored in flash memory.
  Serial.println("Load data stored in flash memory.");
  preferences.begin("P10_SD", false);
  
  display_Modes = preferences.getString("DM", "");
  single_Row_Txt = preferences.getString("SRT", "");
  double_Row_First_Txt = preferences.getString("DRFT", "");
  double_Row_First_Txt_Pos = preferences.getInt("DRFTP", 0);
  double_Row_Second_Txt = preferences.getString("DRST", "");

  Serial.print("display_Modes : ");
  Serial.println(display_Modes);
  Serial.print("single_Row_Txt : ");
  Serial.println(single_Row_Txt);
  Serial.print("double_Row_First_Txt : ");
  Serial.println(double_Row_First_Txt);
  Serial.print("double_Row_First_Txt_Pos : ");
  Serial.println(double_Row_First_Txt_Pos);
  Serial.print("double_Row_Second_Txt : ");
  Serial.println(double_Row_Second_Txt);

  preferences.end();
  delay(500);
  //----------------------------------------
  
  Serial.println();
  Serial.println("return the clock speed of the CPU.");
  // return the clock speed of the CPU.
  uint8_t cpuClock = ESP.getCpuFreqMHz();
  delay(500);

  Serial.println();
  Serial.println("Timer Begin");
  // Use 1st timer of 4.
  // devide cpu clock speed on its speed value by MHz to get 1us for each signal  of the timer.
  timer = timerBegin(0, cpuClock, true);
  delay(500);

  Serial.println();
  Serial.println("Attach triggerScan function to our timer.");
  // Attach triggerScan function to our timer.
  timerAttachInterrupt(timer, &triggerScan, true);
  delay(500);

  Serial.println();
  Serial.println("Set alarm to call triggerScan function.");
  // Set alarm to call triggerScan function.
  // Repeat the alarm (third parameter).
  timerAlarmWrite(timer, 300, true);
  delay(500);

  Serial.println();
  Serial.println("Start an alarm.");
  // Start an alarm.
  timerAlarmEnable(timer);
  delay(500);

  Serial.println();
  Serial.println("Chose the \"Arial_Black_16\" font.");
  dmd.selectFont(Arial_Black_16);

  Serial.println();
  Serial.println("Clear Screen.");
  // clear/init the DMD pixels held in RAM.
  // true is normal (all pixels off), false is negative (all pixels on).
  dmd.clearScreen(true); 
  delay(500);

  // While the process of connecting to a WiFi network is in progress or when the process of creating an access point is in progress, 
  // the "Alarm Timer" must be disabled.
  timerAlarmDisable(timer);
  delay(1000);

  //----------------------------------------Create ESP32 as Access Point.
Serial.println();
Serial.println("WIFI mode : AP");
WiFi.mode(WIFI_AP);
Serial.println("Setting up ESP32 to be an Access Point.");
WiFi.softAP(ssid, password); //--> Creating Access Points
delay(1000);
Serial.println("Setting up ESP32 softAPConfig.");
WiFi.softAPConfig(local_ip, gateway, subnet);
//----------------------------------------
 
  server.on("/", handleRoot); 
  server.on("/setText", handleSettings);

  // Start server.
  server.begin(); 
  Serial.println();
  Serial.println("HTTP server started");

  delay(500);

  // When successfully connected to a WiFi network or when the access point creation process is complete, 
  // the "Alarm Timer" is re-enabled.
  timerAlarmEnable(timer);
  delay(500);

  Serial.println();
  Serial.print("SSID name : ");
  Serial.println(ssid);
  Serial.print("IP address : ");
  Serial.println(WiFi.softAPIP());
  Serial.println();
  Serial.println("Connect your computer or mobile Wifi to the SSID above.");
  Serial.println("Visit the IP Address above in your browser to open the main page.");
  Serial.println();
  delay(500);

}
//________________________________________________________________________________

//________________________________________________________________________________VOID LOOP()
void loop(void){
  // put your main code here, to run repeatedly:

  // Handle client requests.
  server.handleClient();  

  if (display_Modes == "SR") {
    Single_Row_Display_Mode();
  }

  if (display_Modes == "DR") {
    Double_Row_Display_Mode();
  }
}
//________________________________________________________________________________
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 
 
3. INTERFACE
 

 
4. VIDEO HASILNYA
 

 

Running Text ESP32 DMD P10 Hub 12

Running Text ESP32 DMD P10 Hub 12 
 
        
           Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat dengan menampilkan text running dengan menggunakan ESP32. jadi nanti text yang tampil  ada 2 jenis yaitu single text dan variasi. untuk single text ada di koding pertama dan untuk variasi ada di koding ke dua. berikut adalah skema dan kodingnya.
 

 
 
1. Skema
        
       
2. Program Single Text
 
/*
GND – GND
OE – D23
A – D19
B – D21
CLK – D18
LAT – D2
DR – D23
VCC – VP
GND – EN
*/

#include <DMD32.h>
#include "fonts/SystemFont5x7.h"
#include "fonts/Arial_black_16.h"

#define DISPLAYS_ACROSS 1
#define DISPLAYS_DOWN 1
DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);

hw_timer_t* timer = NULL;

void IRAM_ATTR triggerScan() {
  dmd.scanDisplayBySPI();
}

void setup() {
  Serial.begin(115200);
  delay(500);
  Serial.println();
  Serial.println("return the clock speed of the CPU.");
  uint8_t cpuClock = ESP.getCpuFreqMHz();
  delay(500);
  Serial.println();
  Serial.println("Timer Begin");
  timer = timerBegin(0, cpuClock, true);
  delay(500);
  Serial.println();
  Serial.println("Attach triggerScan function to our timer.");
  timerAttachInterrupt(timer, &triggerScan, true);
  delay(500);
  Serial.println();
  Serial.println("Set alarm to call triggerScan function.");
  timerAlarmWrite(timer, 100, true);
  delay(500);
  Serial.println();
  Serial.println("Start an alarm.");
  timerAlarmEnable(timer);
  delay(500);
}

void loop() {
  dmd.selectFont(Arial_Black_16);
  String txt_1 = "COBA DMD P10";
  char char_array_txt_1[txt_1.length() + 1];
  txt_1.toCharArray(char_array_txt_1, txt_1.length() + 1);
  dmd.clearScreen(true);
  delay(1000);
  dmd.drawMarquee(char_array_txt_1, txt_1.length(), (32 * DISPLAYS_ACROSS) - 1, 0);
  long timer_1 = millis();
  boolean ret = false;
  while (!ret) {
    if ((timer_1 + 50) < millis()) {
      ret = dmd.stepMarquee(-1, 0);
      timer_1 = millis();
    }
  }
 
 
 
3. Program Variasi Text 
 
/*
GND – GND
OE – D23
A – D19
B – D21
CLK – D18
LAT – D2
DR – D23
VCC – VP
GND – EN
*/

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 01_ESP32_P10_Test_Displays
//----------------------------------------Including the libraries.
#include <DMD32.h>  //--> DMD32 by Qudor-Engineer (KHUDHUR ALFARHAN) : https://github.com/Qudor-Engineer/DMD32
#include "fonts/SystemFont5x7.h"
#include "fonts/Arial_black_16.h"
//----------------------------------------

// Fire up the DMD library as dmd.
#define DISPLAYS_ACROSS 1
#define DISPLAYS_DOWN 1
DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);

// Timer setup.
// create a hardware timer  of ESP32.
hw_timer_t * timer = NULL;

//________________________________________________________________________________IRAM_ATTR triggerScan()
//  Interrupt handler for Timer1 (TimerOne) driven DMD refresh scanning,
//  this gets called at the period set in Timer1.initialize();
void IRAM_ATTR triggerScan() {
  dmd.scanDisplayBySPI();
}
//________________________________________________________________________________

//________________________________________________________________________________VOID SETUP()
void setup() {
  // put your setup code here, to run once:

  Serial.begin(115200);
  Serial.println();

  delay(500);

  Serial.println();
  Serial.println("return the clock speed of the CPU.");
  // return the clock speed of the CPU.
  uint8_t cpuClock = ESP.getCpuFreqMHz();
  delay(500);

  Serial.println();
  Serial.println("Timer Begin");
  // Use 1st timer of 4.
  // devide cpu clock speed on its speed value by MHz to get 1us for each signal  of the timer.
  timer = timerBegin(0, cpuClock, true);
  delay(500);

  Serial.println();
  Serial.println("Attach triggerScan function to our timer.");
  // Attach triggerScan function to our timer.
  timerAttachInterrupt(timer, &triggerScan, true);
  delay(500);

  Serial.println();
  Serial.println("Set alarm to call triggerScan function.");
  // Set alarm to call triggerScan function.
  // Repeat the alarm (third parameter).
  timerAlarmWrite(timer, 300, true);
  delay(500);

  Serial.println();
  Serial.println("Start an alarm.");
  // Start an alarm.
  timerAlarmEnable(timer);
  delay(500);
}
//________________________________________________________________________________

//________________________________________________________________________________VOID LOOP()
void loop() {
  // put your main code here, to run repeatedly:

  // If you want to change the font, don't forget to use this line of code : dmd.selectFont . Example: dmd.selectFont(Arial_Black_16);

  //----------------------------------------Demo with "Arial_Black_16" font.
  dmd.selectFont(Arial_Black_16);

  //.................Running Text.
  String txt_1 = "ESP32 with P10 LED Display";
  char char_array_txt_1[txt_1.length() + 1];
  txt_1.toCharArray(char_array_txt_1, txt_1.length() + 1);

  dmd.clearScreen(true);
  delay(1000);
  dmd.drawMarquee(char_array_txt_1,txt_1.length(),(32*DISPLAYS_ACROSS)-1,0);
  long start_1=millis();
  long timer_1=start_1;
  boolean ret=false;
  while(!ret){
   if ((timer_1+30) < millis()) {
     ret=dmd.stepMarquee(-1,0);
     timer_1=millis();
   }
  }
  //.................

  //.................Display Text.
  dmd.clearScreen(true);
  delay(1000);
  dmd.drawString(0,0,"DMD", 3, GRAPHICS_NORMAL);  //--> dmd.drawString(x, y, Text, Number of characters in text, GRAPHICS_NORMAL);
  delay(3000);
  //.................
  //----------------------------------------

  //----------------------------------------Demo with "SystemFont5x7" font.
  // If you use the font "SystemFont5x7", then 1 panel P10 (32x16) can display text in 2 rows.
  dmd.selectFont(SystemFont5x7);

  //.................Display Text.
  dmd.clearScreen(true);
  delay(1000);
  dmd.drawString(0,0,"ESP32", 5, GRAPHICS_NORMAL);
  dmd.drawString(0,9,"P10", 3, GRAPHICS_NORMAL);
  delay(3000);
  //.................

  //.................The first row displays text and the second row displays running text.
  String txt_2 = "ESP32 with P10 LED Display";
  char char_array_txt_2[txt_2.length() + 1];
  txt_2.toCharArray(char_array_txt_2, txt_2.length() + 1);
  int scrl_long = (txt_2.length()*6) + (32*DISPLAYS_ACROSS);

  dmd.clearScreen(true);
  delay(1000);
  
  // Displays text in the first row.
  dmd.drawString(4,0,"COBA", 4, GRAPHICS_NORMAL);
  
  long start_2=millis();
  long timer_2=start_2;
  int i = 32*DISPLAYS_ACROSS;
  while(true){
    if ((timer_2+30) < millis()) {
      // Displays running text on the second row.
      dmd.drawString(i, 9, char_array_txt_2, txt_2.length(), GRAPHICS_NORMAL);
      
      if (i > ~scrl_long) {
        i--;
      } else {
        break;
      }
    
      timer_2=millis();
    }
  }
  //.................

  //.................Displays Text and Numbers.
  int T = 29;
  int H = 73;
  char char_array_T[String(T).length() + 1];
  char char_array_H[String(H).length() + 1];
  String(T).toCharArray(char_array_T, String(T).length() + 1);
  String(H).toCharArray(char_array_H, String(H).length() + 1);

  dmd.clearScreen(true);
  delay(1000);
  
  dmd.drawString(0, 0, "T:", 2, GRAPHICS_NORMAL);
  dmd.drawString(11, 0, char_array_T, String(T).length(), GRAPHICS_NORMAL);
  dmd.drawCircle(24, 1, 1, GRAPHICS_NORMAL);
  dmd.drawString(27, 0, "C", 1, GRAPHICS_NORMAL);
  
  dmd.drawString(0, 9, "H:", 2, GRAPHICS_NORMAL);
  dmd.drawString(11, 9, char_array_H, String(H).length(), GRAPHICS_NORMAL);
  dmd.drawString(27, 9, "%", 1, GRAPHICS_NORMAL);

  delay(3000);
  //.................
  //----------------------------------------
}
//________________________________________________________________________________
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
 
 
4. VIDEO HASILNYA
 

 

Jual Timer Lomba Lari Wireless Start dan Sensor Photoelectric (Mode Single dan Battle)

Jual Timer Lomba Lari Wireless Start dan Sensor Photoelectric (Mode Single dan Battle)
 

       Pada kesempatan kali ini saya akan menjelaskan mengenai produk kami yang berfungsi untuk mengukur waktu atau timer lomba lari / sepatu roda / sejenisnya. alat ini menggunakan remot untuk startnya dan untuk finish menggunakan sensor photoelectic. fitur2nya yaitu sebagai berikut.
 
LINK TOKO SHOPEE:  https://id.shp.ee/Dxgj3kYh
 
Fitur Single (satu jalur) :
1. Jarak sensor finish 1- 4 meter
2. Menggunakan 1 kontroler dan 1 reflektor 
3. Menggunakan battery 12v sehingga bisa portable
4. Jarak Remote kurang lebih 1 - 10 meter (mungkin 20 meter) open area
5. Menggunakan tripod untuk penyangganya. 
 

 
 
Fitur Battle (dua jalur) :
1. Jarak sensor finish 1- 4 meter
2. Menggunakan 2 kontroler dan 2 reflektor 
3. Menggunakan battery 12v sehingga bisa portable
4. Jarak Remote kurang lebih 1 - 10 meter (mungkin 20 meter) open area
5. Menggunakan tripod untuk penyangganya. 
 

 
Jika Ingin pesan bisa melalui toko Shopee atau WA admin: 085726496643 (Yanuar) 
 
 
 

 

Timer Lomba Lari 7 Segment Wireless Start dan Stop

Timer Lomba Lari 7 Segment Wireless Start dan Stop


         Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang berfungsi untuk menghitung waktu lari dari start hingga finish. alat ini menggunakan penampil 7 segment dan sensor photoelectric sehingga mudah untuk instalasinya. untuk lebih jelasnya berikut adalah koding dan skemanya. 


1. Skema



2. Program Arduino IDE Single MODE

#include <Wire.h>
#include <TimerOne.h>   //Library peripheral Timer1 untuk menjalankan prosedur pindai panel DMD
#include <Time.h>     //Library waktu yang menyediakan tipe data, struktur, dan obyek waktu
#include <Joatsy74HC595.h>

void(* resetFunc) (void) = 0;

const byte pin_data=5;
const byte pin_clock=7;
const byte pin_latch=6;

const byte count_chips=4;
const double delay_time=0.1;
const byte common_logic=1;

int sensorpin = 2; 
int sensorpinx;
int buzzer = 8;
int ledind = 3;
int ledstart = 4;
int ori;

int btstartx;
int btrstx;
//int btstart = 10;
//int btrst = 9;
int btstart = 11;
int btrst = 12;

Joatsy74HC595 shiftreg(BUFFERED_OUTPUT, pin_data, pin_clock, pin_latch, count_chips, delay_time);

int number_1=0;
int number_2=0;
int detik;
int cacah;

char lineBuff[20];

int lineA;
int lineB;
int lineC;
int seconds;
int cs;
int secondsa;
int ms;
int secondsb;
int csb;
int secondsc;
int csc;
int csa;

long start_time = 0;
int lapa,lapb,lapc;
int finisha = 0;
String dataku;

void setup(void)
{  
  Serial.begin(9600); 
  pinMode(sensorpin,INPUT_PULLUP);
  pinMode(buzzer,OUTPUT);
  pinMode(ledind,OUTPUT);
  pinMode(ledstart,OUTPUT);
  delay(1000);
  shiftreg.clear(); //default logic=1
  digitalWrite(ledind,HIGH);
  pinMode(btstart,INPUT_PULLUP);
  pinMode(btrst,INPUT_PULLUP);

}

void loop(void)
{

    btstartx = digitalRead(btstart);
    btrstx = digitalRead(btrst);
    //Serial.print(btstartx);
    //Serial.println(btrstx);
    
      if (btstartx == 1){
        digitalWrite(ledstart,HIGH);
        digitalWrite(buzzer,HIGH);
        delay(3000);
        digitalWrite(buzzer,LOW);
        delay(1000);
        digitalWrite(buzzer,HIGH);
        delay(2000);
        digitalWrite(buzzer,LOW);
        delay(1000);
        digitalWrite(buzzer,HIGH);
        delay(2000);
        digitalWrite(buzzer,LOW);
        start_time = millis();
        mulai();
      }
      
      if (btrstx == 1){
        digitalWrite(ledstart,LOW);
        resetFunc();
      }
      
delay(1);
}

void mulai(){

sensorpinx = digitalRead(sensorpin);

if(sensorpinx == 0){
  digitalWrite(ledstart,LOW);
  digitalWrite(buzzer,HIGH);
  delay(500);
  digitalWrite(buzzer,LOW);
  delay(500);
  digitalWrite(buzzer,HIGH);
  delay(500);
  digitalWrite(buzzer,LOW);
  return;
}

seconds = (millis() - start_time) / 1000;
ori = ((millis() - start_time) / 10);
cs = ((millis() - start_time) / 10) % 100;
csa = cs / 10;
csb = cs % 10;
csc = ori / 100;

//Serial.println(ori);

if(csa == 9){
delay(10);  
cacah++; 
}

if(cacah > 9){
  cacah = 0;
  detik++;
}
  
  int digit_1 = detik;
  int digit_2 = cacah;
  int digit_3 = csa;
  int digit_4 = csb;
  int digit_dot = 0;
  
  build_data(1,1,digit_1,0);
  build_data(1,2,digit_2,1);
  build_data(1,3,digit_3,0);
  build_data(1,4,digit_4,0);
  
  shiftreg.buildData(); 
  delay(100);  
mulai();  
}


void build_data(int module, int digit, int number, int point){
  int digit_flag=0;
  if (digit==1){
    digit_flag=4;
  } else if (digit==2){
    digit_flag=3;
  } else if (digit==3){
    digit_flag=2;
  } else if (digit==4){
    digit_flag=1;
  }
  int digit_index=((module-1)*4)+digit_flag;
  byte data=0;
  
  if (number==0){
    if (digit_flag==2){
      data=B00010100;
    } else {
      data=B00010100;
    }
  } else if (number==1){
    if (digit_flag==2){
      data=B10110111;
    } else {
      data=B01111110;
    }
  } else if (number==2){
    if (digit_flag==2){
      data=B10001100;
    } else {
      data=B10001100;
    }
  } else if (number==3){
    if (digit_flag==2){
      data=B10000101;
    } else {
      data=B01001100;
    }
  } else if (number==4){
    if (digit_flag==2){
      data=B00100111;
    } else {
      data=B01100110;
    }
  } else if (number==5){
    if (digit_flag==2){
      data=B01000101;
    } else {
      data=B01000101;
    }
  } else if (number==6){
    if (digit_flag==2){
      data=B01000100;
    } else {
      data=B00000101;
    }
  } else if (number==7){
    if (digit_flag==2){
      data=B10010111;
    } else {
      data=B01111100;
    }
  } else if (number==8){
    if (digit_flag==2){
      data=B00000100;
    } else {
      data=B00000100;
    }
  } else if (number==9){
    if (digit_flag==2){
      data=B00000101;
    } else {
      data=B01000100;
    }
  }
  if (point==1)
  bitWrite(data,2,0);
  else
  bitWrite(data,2,1);
  shiftreg.setdata(digit_index,data);
}



3. Program Arduino IDE BATTLE MODE TRANSMITTER

#include <Wire.h>
#include <TimerOne.h>   //Library peripheral Timer1 untuk menjalankan prosedur pindai panel DMD
#include <Time.h>     //Library waktu yang menyediakan tipe data, struktur, dan obyek waktu
#include <Joatsy74HC595.h>

void(* resetFunc) (void) = 0;

const byte pin_data=5;
const byte pin_clock=7;
const byte pin_latch=6;

const byte count_chips=4;
const double delay_time=0.1;
const byte common_logic=1;

int sensorpin = 2; 
int sensorpinx;
int buzzer = 8;
int ledind = 3;
int ledstart = 4;
int ori;

int btstartx;
int btrstx;
int btstart = 10;
int btrst = 9;
int battle = A0;

Joatsy74HC595 shiftreg(BUFFERED_OUTPUT, pin_data, pin_clock, pin_latch, count_chips, delay_time);

int number_1=0;
int number_2=0;
int detik;
int cacah;

char lineBuff[20];

int lineA;
int lineB;
int lineC;
int seconds;
int cs;
int secondsa;
int ms;
int secondsb;
int csb;
int secondsc;
int csc;
int csa;

long start_time = 0;
int lapa,lapb,lapc;
int finisha = 0;
String dataku;

void setup(void)
{  
  Serial.begin(9600); 
  pinMode(sensorpin,INPUT_PULLUP);
  pinMode(buzzer,OUTPUT);
  pinMode(ledind,OUTPUT);
  pinMode(ledstart,OUTPUT);
  delay(1000);
  shiftreg.clear(); //default logic=1
  digitalWrite(ledind,HIGH);
  pinMode(btstart,INPUT_PULLUP);
  pinMode(btrst,INPUT_PULLUP);
  pinMode(battle,OUTPUT);
  digitalWrite(battle,HIGH);
  
}


void loop(void)
{


    btstartx = digitalRead(btstart);
    btrstx = digitalRead(btrst);
    //Serial.print(btstartx);
    //Serial.println(btrstx);
    
      if (btstartx == 1){
        digitalWrite(ledstart,HIGH);
        digitalWrite(battle,LOW);
        digitalWrite(buzzer,HIGH);
        delay(3000);
        digitalWrite(buzzer,LOW);
        delay(1000);
        digitalWrite(buzzer,HIGH);
        delay(2000);
        digitalWrite(buzzer,LOW);
        delay(1000);
        digitalWrite(buzzer,HIGH);
        delay(2000);
        digitalWrite(buzzer,LOW);
        digitalWrite(battle,HIGH);
        start_time = millis();
        mulai();
      }
      
      if (btrstx == 1){
        digitalWrite(ledstart,LOW);
        digitalWrite(battle,HIGH);
        resetFunc();
      }
      
delay(1);
}


void mulai(){

sensorpinx = digitalRead(sensorpin);

if(sensorpinx == 0){
  digitalWrite(ledstart,LOW);
  digitalWrite(buzzer,HIGH);
  delay(500);
  digitalWrite(buzzer,LOW);
  delay(500);
  digitalWrite(buzzer,HIGH);
  delay(500);
  digitalWrite(buzzer,LOW);
  return;
}

seconds = (millis() - start_time) / 1000;
ori = ((millis() - start_time) / 10);
cs = ((millis() - start_time) / 10) % 100;
csa = cs / 10;
csb = cs % 10;
csc = ori / 100;

//Serial.println(ori);

if(csa == 9){
delay(10);  
cacah++; 
}

if(cacah > 9){
  cacah = 0;
  detik++;
}
  
  int digit_1 = detik;
  int digit_2 = cacah;
  int digit_3 = csa;
  int digit_4 = csb;
  int digit_dot = 0;
  
  build_data(1,1,digit_1,0);
  build_data(1,2,digit_2,1);
  build_data(1,3,digit_3,0);
  build_data(1,4,digit_4,0);
  
  shiftreg.buildData(); 
  delay(100);  
mulai();  
}


void build_data(int module, int digit, int number, int point){
  int digit_flag=0;
  if (digit==1){
    digit_flag=4;
  } else if (digit==2){
    digit_flag=3;
  } else if (digit==3){
    digit_flag=2;
  } else if (digit==4){
    digit_flag=1;
  }
  int digit_index=((module-1)*4)+digit_flag;
  byte data=0;
  
  if (number==0){
    if (digit_flag==2){
      data=B00010100;
    } else {
      data=B00010100;
    }
  } else if (number==1){
    if (digit_flag==2){
      data=B10110111;
    } else {
      data=B01111110;
    }
  } else if (number==2){
    if (digit_flag==2){
      data=B10001100;
    } else {
      data=B10001100;
    }
  } else if (number==3){
    if (digit_flag==2){
      data=B10000101;
    } else {
      data=B01001100;
    }
  } else if (number==4){
    if (digit_flag==2){
      data=B00100111;
    } else {
      data=B01100110;
    }
  } else if (number==5){
    if (digit_flag==2){
      data=B01000101;
    } else {
      data=B01000101;
    }
  } else if (number==6){
    if (digit_flag==2){
      data=B01000100;
    } else {
      data=B00000101;
    }
  } else if (number==7){
    if (digit_flag==2){
      data=B10010111;
    } else {
      data=B01111100;
    }
  } else if (number==8){
    if (digit_flag==2){
      data=B00000100;
    } else {
      data=B00000100;
    }
  } else if (number==9){
    if (digit_flag==2){
      data=B00000101;
    } else {
      data=B01000100;
    }
  }
  if (point==1)
  bitWrite(data,2,0);
  else
  bitWrite(data,2,1);
  shiftreg.setdata(digit_index,data);
}



4. Program Arduino IDE BATTLE MODE RECEIVER

#include <Wire.h>
#include <TimerOne.h>   //Library peripheral Timer1 untuk menjalankan prosedur pindai panel DMD
#include <Time.h>     //Library waktu yang menyediakan tipe data, struktur, dan obyek waktu
#include <Joatsy74HC595.h>

void(* resetFunc) (void) = 0;

const byte pin_data=5;
const byte pin_clock=7;
const byte pin_latch=6;

const byte count_chips=4;
const double delay_time=0.1;
const byte common_logic=1;

int sensorpin = 2; 
int sensorpinx;
int buzzer = 8;
int ledind = 3;
int ledstart = 4;
int ori;

int btstartx;
int btrstx;
int btstart = 11;
int btrst = 12;
int battlepin = A0;
int battlepinx;

Joatsy74HC595 shiftreg(BUFFERED_OUTPUT, pin_data, pin_clock, pin_latch, count_chips, delay_time);

int number_1=0;
int number_2=0;
int detik;
int cacah;

char lineBuff[20];

int lineA;
int lineB;
int lineC;
int seconds;
int cs;
int secondsa;
int ms;
int secondsb;
int csb;
int secondsc;
int csc;
int csa;

long start_time = 0;
int lapa,lapb,lapc;
int finisha = 0;
String dataku;

void setup(void)
{  
  Serial.begin(9600); 
  pinMode(sensorpin,INPUT_PULLUP);
  pinMode(buzzer,OUTPUT);
  pinMode(ledind,OUTPUT);
  pinMode(ledstart,OUTPUT);
  delay(1000);
  shiftreg.clear(); //default logic=1
  digitalWrite(ledind,HIGH);
  pinMode(btstart,INPUT_PULLUP);
  pinMode(btrst,INPUT_PULLUP);
  pinMode(battlepin,INPUT_PULLUP);
}

void loop(void)
{

    battlepinx = digitalRead(battlepin);
    
    btstartx = digitalRead(btstart);
    btrstx = digitalRead(btrst);
    //Serial.print(btstartx);
    //Serial.println(btrstx);
    
      if((btstartx == 1)||(battlepinx == 0)){
        digitalWrite(ledstart,HIGH);
        digitalWrite(buzzer,HIGH);
        delay(3000);
        digitalWrite(buzzer,LOW);
        delay(1000);
        digitalWrite(buzzer,HIGH);
        delay(2000);
        digitalWrite(buzzer,LOW);
        delay(1000);
        digitalWrite(buzzer,HIGH);
        delay(2000);
        digitalWrite(buzzer,LOW);
        start_time = millis();
        mulai();
      }
      
      if (btrstx == 1){
        digitalWrite(ledstart,LOW);
        resetFunc();
      }
      
delay(1);
}


void mulai(){

sensorpinx = digitalRead(sensorpin);

if(sensorpinx == 0){
  digitalWrite(ledstart,LOW);
  digitalWrite(buzzer,HIGH);
  delay(500);
  digitalWrite(buzzer,LOW);
  delay(500);
  digitalWrite(buzzer,HIGH);
  delay(500);
  digitalWrite(buzzer,LOW);
  return;
}

seconds = (millis() - start_time) / 1000;
ori = ((millis() - start_time) / 10);
cs = ((millis() - start_time) / 10) % 100;
csa = cs / 10;
csb = cs % 10;
csc = ori / 100;

//Serial.println(ori);

if(csa == 9){
delay(10);  
cacah++; 
}

if(cacah > 9){
  cacah = 0;
  detik++;
}
  
  int digit_1 = detik;
  int digit_2 = cacah;
  int digit_3 = csa;
  int digit_4 = csb;
  int digit_dot = 0;
  
  build_data(1,1,digit_1,0);
  build_data(1,2,digit_2,1);
  build_data(1,3,digit_3,0);
  build_data(1,4,digit_4,0);
  
  shiftreg.buildData(); 
  delay(100);  
mulai();  
}


void build_data(int module, int digit, int number, int point){
  int digit_flag=0;
  if (digit==1){
    digit_flag=4;
  } else if (digit==2){
    digit_flag=3;
  } else if (digit==3){
    digit_flag=2;
  } else if (digit==4){
    digit_flag=1;
  }
  int digit_index=((module-1)*4)+digit_flag;
  byte data=0;
  
  if (number==0){
    if (digit_flag==2){
      data=B00010100;
    } else {
      data=B00010100;
    }
  } else if (number==1){
    if (digit_flag==2){
      data=B10110111;
    } else {
      data=B01111110;
    }
  } else if (number==2){
    if (digit_flag==2){
      data=B10001100;
    } else {
      data=B10001100;
    }
  } else if (number==3){
    if (digit_flag==2){
      data=B10000101;
    } else {
      data=B01001100;
    }
  } else if (number==4){
    if (digit_flag==2){
      data=B00100111;
    } else {
      data=B01100110;
    }
  } else if (number==5){
    if (digit_flag==2){
      data=B01000101;
    } else {
      data=B01000101;
    }
  } else if (number==6){
    if (digit_flag==2){
      data=B01000100;
    } else {
      data=B00000101;
    }
  } else if (number==7){
    if (digit_flag==2){
      data=B10010111;
    } else {
      data=B01111100;
    }
  } else if (number==8){
    if (digit_flag==2){
      data=B00000100;
    } else {
      data=B00000100;
    }
  } else if (number==9){
    if (digit_flag==2){
      data=B00000101;
    } else {
      data=B01000100;
    }
  }
  if (point==1)
  bitWrite(data,2,0);
  else
  bitWrite(data,2,1);
  shiftreg.setdata(digit_index,data);
}



5. VIDEO HASILNYA



ELCB Arduino Sensor PZEM-004t IOT Blynk

ELCB Arduino Sensor PZEM-004t IOT Blynk 
 

         Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah ELCB dengan arduino dan iot blynk. alat ini menggunakan 2 buah sensor arus tegangan PZEM-004t. dan juga alat ini menggunakan wemos D1 mini esp8266. untuk lebih jelasnya berikut kodingnya.


1. Skema
 

 
2. Program Arduino IDE
 
 #define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPL6EN0PXXXX"
#define BLYNK_TEMPLATE_NAME "elcb"
#define BLYNK_AUTH_TOKEN "-defmRxYVYlK5bYKNU8YJ6kLNdkZzXXX"

#include <Wire.h>
#include <SoftwareSerial.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <PZEM004Tv30.h>
#include <LiquidCrystal_I2C.h> 

LiquidCrystal_I2C lcd(0x27,16,2); 
PZEM004Tv30 pzem(&Serial);
PZEM004Tv30 pzem2(D7,D8); 
 
float voltage;
float current;
float power;
float energy;
float biaya; 
float voltage2;
float current2;
float energy2;
int relay = D3;
float selisih;
int btresetx;
int pinValue;
int pinValue2;
int tanda;

BlynkTimer timer;

char ssid[] = "hotspothpku";
char pass[] = "123456789";


BLYNK_WRITE(V4)
{
  pinValue = param.asInt();   

  if((pinValue == 1)&&(tanda == 0)){
    digitalWrite(relay, LOW);
  }
  
  if((pinValue == 0)&&(tanda == 0)) {
    digitalWrite(relay, HIGH);
  }
  
}

BLYNK_WRITE(V5)
{
  pinValue2 = param.asInt();   

  if(pinValue2 == 1){
    tanda = 1;
  }
  
  if(pinValue2 == 0) {
    tanda = 0;
  }
  
}

void kirimdata()
{
  Blynk.virtualWrite(V0,voltage);
  Blynk.virtualWrite(V1,current);
  Blynk.virtualWrite(V2,voltage2);
  Blynk.virtualWrite(V3,current2);
}

void setup() {

  Serial.begin(9600);
  
  lcd.begin();  
  lcd.clear();
  lcd.noCursor();  

  pinMode(relay,OUTPUT);
  digitalWrite(relay,LOW); //LITRIK AC NYALA

  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
  timer.setInterval(1000L, kirimdata);
}

void loop() {
 
voltage = pzem.voltage();
current = pzem.current();

voltage2 = pzem2.voltage();
current2 = pzem2.current();

if((current == current2)&&(tanda == 1)){
  digitalWrite(relay,LOW);  
}

if((current > current2)&&(tanda == 1)){
  selisih = current - current2;

if((selisih >= 0)&&(tanda == 1)){
  digitalWrite(relay,HIGH); 
  lcd.clear(); 
  delay(1000);
  arusbocor(); 
}

}

if((current < current2)&&(tanda == 1)){
  selisih = current2 - current;  

if((selisih >= 0)&&(tanda == 1)){
 digitalWrite(relay,HIGH);
 lcd.clear(); 
 delay(1000);
 arusbocor();
}

}

lcd.setCursor(0,0);
lcd.print("V:");
lcd.print(voltage);
lcd.print("/");
lcd.print(voltage2);
lcd.print("  ");

lcd.setCursor(0,1);
lcd.print("I:");   
lcd.print(current);
lcd.print("/");
lcd.print(current2);
lcd.print("  ");

Blynk.run();
timer.run(); // Initiates BlynkTimer
delay(200);
}

void arusbocor(){

lcd.setCursor(0,0);
lcd.print("arus bocor ");
lcd.setCursor(0,1);
lcd.print(" > 30mA");  
  
arusbocor();  
}



3. VIDEO HASILNYA
 

 
 

Monitoring Warna dan kekeruhan Air Sensor TCS3200 dan Turbidity ESP32

Monitoring Warna dan kekeruhan Air Sensor TCS3200 dan Turbidity ESP32
 

      Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat memonitoring warna dan kekeruhan air. alat ini mengginakan lcd Nextion dan ESP32 selain itu juga alat ini dimonitoring dengan IOT Blynk. berikut adalah skema dan kodingnya.


1. Skema



2. Program ESP32

#include <WiFi.h>
#include <WiFiClient.h>

#define S2 35 /*Define S2 Pin Number of ESP32*/
#define S3 32 /*Define S3 Pin Number of ESP32*/
#define sensorOut 33 /*Define Sensor Output Pin Number of ESP32*/

#define RXD2 16
#define TXD2 17

String apiKey = "0OIYJ1X0ML1VPKXX";     //  Enter your Write API key from ThingSpeak
const char* resource = "/update?api_key=";

const char *ssid =  "hotspothpku";     // replace with your wifi ssid and wpa2 key
const char *pass =  "123456789";
const char* server = "api.thingspeak.com";

WiFiClient client;

/*Define int variables*/
int Red = 0;
int Green = 0;
int Blue = 0;
int Frequency = 0;
int adctds;
int tds;

void setup() {
  pinMode(S2, OUTPUT); /*Define S2 Pin as a OUTPUT*/
  pinMode(S3, OUTPUT); /*Define S3 Pin as a OUTPUT*/
  pinMode(sensorOut, INPUT); /*Define Sensor Output Pin as a INPUT*/
  Serial.begin(9600); /*Set the baudrate to 115200*/
  Serial2.begin(9600, SERIAL_8N1, RXD2, TXD2);

  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, pass);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

      while (WiFi.status() != WL_CONNECTED)
     {
            delay(500);
            Serial.print(".");
     }
      Serial.println("");
      Serial.println("WiFi connected");

}

void loop() {

  adctds = analogRead(34);
  tds = map(adctds,250,4096,100,0);

  if(tds < 0){
    tds = 0;
  }
    
  Red = getRed();
  delay(200); /*wait a 200mS*/
  Green = getGreen();
  delay(200); /*wait a 200mS*/
  Blue = getBlue();
  delay(200); /*wait a 200mS*/

  lcdCMD("n0.val=" + String(Red));
  lcdCMD("n1.val=" + String(Green));
  lcdCMD("n2.val=" + String(Blue));
  lcdCMD("n3.val=" + String(tds)); 

kirimdata();  
}

int getRed() {
  digitalWrite(S2,LOW);
  digitalWrite(S3,LOW);
  Frequency = pulseIn(sensorOut, LOW); /*Get the Red Color Frequency*/
  return Frequency;
}

int getGreen() {
  digitalWrite(S2,HIGH);
  digitalWrite(S3,HIGH);
  Frequency = pulseIn(sensorOut, LOW); /*Get the Green Color Frequency*/
  return Frequency;
}

int getBlue() {
  digitalWrite(S2,LOW);
  digitalWrite(S3,HIGH);
  Frequency = pulseIn(sensorOut, LOW); /*Get the Blue Color Frequency*/
  return Frequency;
}

void lcdCMD(String cmd) {
  Serial2.print(cmd);
  Serial2.write(0xff);
  Serial2.write(0xff);
  Serial2.write(0xff);
}


void kirimdata(){

   if (client.connect(server,80))   //   "184.106.153.149" or api.thingspeak.com
                   {
                           
                             String postStr = apiKey;
                             postStr +="&field1=";
                             postStr += String(Red);
                             postStr += "\r\n\r\n";

                             client.print(String("GET ") + resource + apiKey + "&field1=" + Red + "&field2=" + Green + "&field3=" + Blue + "&field4=" + tds + " HTTP/1.1\r\n" + "Host: " + server + "\r\n" + "Connection: close\r\n\r\n");
                                       
                             client.print("Host: api.thingspeak.com\n");
                             client.print("Connection: close\n");
                             client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
                             client.print("Content-Type: application/x-www-form-urlencoded\n");
                             client.print("Content-Length: ");
                             client.print(postStr.length());
                             client.print("\n\n");
                             client.print(postStr);
                           
                             Serial.println(". Send to Thingspeak.");
                        }
                       
          client.stop();

          Serial.println("Waiting...");
 
  // thingspeak needs minimum 15 sec delay between updates, i've set it to 30 seconds
  delay(1000);
  
}



3. VIDEO HASILNYA