rst:0x8 (TG1WDT_SYS_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0030,len:1448
load:0x40078000,len:14844
ho 0 tail 12 room 4
load:0x40080400,len:4
load:0x40080404,len:3356
entry 0x4008059c
ets Jul 29 2019 12:21:46
#include <ArduinoSort.h>
#include <Wire.h>
#include <WiFi.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <EEPROM.h>
#include <VL53L0X.h>
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
VL53L0X sensor; // deklarasi sensor
int numReadings = 5; // maksimum pengambilan data pengukuran
int readings[5]; // penyimpanan data dalam bentuk array
int indek = 0; // data awal dalam array
int addr; // alamat EEPROM internal
const float tinggi = 130.0;
struct Date { // kelompok struktur tanggal saat ini
byte day;
byte month;
int year;
};
bool tampilRecordMode = false; // Flag untuk menunjukkan apakah sedang dalam mode tampil record
const int EEPROM_ADDRESS = 0; // Alamat EEPROM internal untuk menyimpan data tanggal saat ini
int address; // alamat penyimpanan no urut di EEPROM internal
int alamat; // alamat penyimpanan pemanggilan data SD MD
Date currentDate; // Struktur data untuk menyimpan tanggal saat ini
#define EEPROM_SIZE 3000 // banyak data penyimpanan di EEPROM internal
LiquidCrystal_I2C lcd(0x27, 20, 4); // kode alamat I2C LCD
// Konfigurasi Keypad 4x4
const byte ROW_NUM = 4; // jumlah baris keypad
const byte COLUMN_NUM = 4; // jumlah kolom keypad
char keys[ROW_NUM][COLUMN_NUM] = {
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' }
};
byte pin_rows[ROW_NUM] = { 23, 13, 12, 19 };
byte pin_column[COLUMN_NUM] = { 18, 5, 17, 16 };
Keypad keypad = Keypad(makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM);
float M = 0; // deklarasi variabel data median
float Sd = 0; // deklarasi variabel standar deviasi
float D_U; // deklarasi variabel nilai tinggi
int nourut = 0; // deklarasi variabel no urut
int jk; // jenis kelamin
int usia;
int status;
byte hari; // hari lahir
byte bulan; // bulan lahir
byte tahun; // tahun lahir
float panjang; // panjang fix*10, untuk menghilangkan koma
int panjang1; // panjang1 untuk data di alamat 8 bit atas
float panjang2; // panjang2 untuk data di alamat 8 bit bawah
float panjangfix; // nilai panjang yang disimpan di EEPROM internal
String statusGizi; // untuk printer
const int Buzzer = 13; // buzzer terhubung dengan pin 13
const int buttonPin = 12; // push button terhubung dengan pin 7
static bool buttonState = false; // variable for reading the pushbutton status
int a = 0; // kondisi awal
int statusG; // suara
void connectToWiFi() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Connecting to WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
lcd.print(".");
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("WiFi Connected!");
lcd.setCursor(0, 1);
lcd.print("IP: ");
lcd.print(WiFi.localIP());
}
void setup() {
//Serial.begin(9600);
lcd.begin();
lcd.backlight();
Wire.begin();
pinMode(Buzzer, OUTPUT);
digitalWrite(Buzzer, LOW);
pinMode(buttonPin, INPUT_PULLUP);
digitalWrite(buttonPin, HIGH);
pinMode(11, INPUT_PULLUP); // sambung ke XSHUT sensor VL53L0X
digitalWrite(11, HIGH);
sensor.init();
sensor.startContinuous();
sensor.setTimeout(500);
connectToWiFi();
// Baca data tanggal saat ini dari EEPROM saat Arduino pertama kali dinyalakan
EEPROM.get(EEPROM_ADDRESS, currentDate); // untuk mengambil data dari EEPROM internal
// Jika data yang dibaca kosong (nilai default EEPROM), inisialisasi dengan tanggal saat ini
if (currentDate.day == 0 || currentDate.month == 0 || currentDate.year == 0) {
// Ganti nilainya dengan tanggal saat ini
currentDate.day = 5; // Ganti dengan tanggal yang diinginkan
currentDate.month = 8; // Ganti dengan bulan yang diinginkan
currentDate.year = 2023; // Ganti dengan tahun yang diinginkan
// untuk simpan tanggal saat ini ke dalam EEPROM
EEPROM.put(EEPROM_ADDRESS, currentDate);
}
// Tampilkan tanggal saat ini dan tanggal lahir ke LCD
updateLCD();
}
void loop() {
buttonState |= (digitalRead(buttonPin) == LOW); // membaca kondisi tombol saat di tekan maka nilai button state = LOW
char key = keypad.getKey(); // membaca kondisi keypad
if (a == 0) { // saat kondisi a = 0 maka akan melakukan perintah di dalam kurung kurawal
if (key == '*') { // saat * ditekan akan memanggil fungsi edit date
editDate();
}
// Jika tombol # ditekan, masuk ke mode pengeditan tanggal lahir
if (key == '#') {
editBirthDate();
}
if (key == 'D') { // tekan D untuk memanggil fungsi record
if (getDataEEPROM(address) == 0) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("TIDAK ADA HASIL");
lcd.setCursor(0, 1);
lcd.print("PENGUKURAN");
delay(2000);
tampilRecordMode = false;
a = 0; // jika tidak ada data recor maka nilai a = 0 dan menjalankan kondisi a = 0
updateLCD();
} else { // jika terdapat data record maka panggil fungsi tampil record
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("MEMUAT DATA ...");
delay(1000);
tampilRecordMode = true;
tampilRecord();
a = 2; // jika terdapat data record maka a = 2 dan akan menjalankan kondisi saat a = 2
}
}
} else if (a == 1) { // kondisi a = 1
jarak(); // memanggil fungsi jarak
if (buttonState) { // jika push button ditekan
panjangfix = D_U; // nilai panjang akan disimpan dalam variabel panjangfix
// Cek usia dan kurangkan jika usia berada dalam rentang 12-24 bulan
if (usia >= 12 && usia <= 24) {
panjangfix += 0.7;
}
else if (panjangfix > 60.0 && panjangfix <= 68.0) {
panjangfix += 8.50;
} // 70-75
else if (panjangfix > 67.0 && panjangfix <= 68.0) {
panjangfix += 7.80;
} // 76
else if (panjangfix > 67.0 && panjangfix <= 69.0) {
panjangfix += 8.50;
} // 77
else if (panjangfix > 69.0 && panjangfix <= 89.0) { //pin//
panjangfix += 7.80;
} //78-96
else if (panjangfix > 88.0 && panjangfix <= 90.0) {
panjangfix += 7.80;
} // 97-98
else if (panjangfix > 89.0 && panjangfix <= 99.0) {
panjangfix += 8.50;
} //99-106
else if (panjangfix > 98.0 && panjangfix <= 102.0) {
panjangfix += 9.50;
} //107-109
else if (panjangfix >= 101.0 && panjangfix <= 102.0) {
panjangfix += 8.80;
} // 110-111
else if (panjangfix > 101.0 && panjangfix <= 107) {
panjangfix += 9.50;
} //112-115
else if (panjangfix > 107.0 && panjangfix <= 116.0) {
panjangfix += 8.50;
} //116-124
panjang = panjangfix * 10; // untuk menghilangkan koma
panjang1 = panjang / 100; // untuk mendapatkan nilai bit atas
panjang2 = panjang - (panjang1 * 100); // untuk mendapatkan nilai bit bawah
lcd.clear();
digitalWrite(Buzzer, HIGH);
delay(1000);
digitalWrite(Buzzer, LOW);
informasi_status(); // memanggil informasi status gizi
a = 0; // akan menjalankan kondisi saat a = 0
buttonState = false; // kembali ke saat button tidak ditekan
}
} else if (a == 2) { // kondisi saat a = 2
if (key == 'D') { // jika key D ditekan maka akan kembali ke nilai a = 0
tampilRecordMode = false;
a = 0;
updateLCD();
}
}
}
void jarak() {
while (a == 1) {
if (indek < numReadings) {
readings[indek] = sensor.readRangeSingleMillimeters(); // menyimpan data hasil pengukuran ke dalam array
indek++; // melanjutkan data array berikutnya
delay(100);
}
if (indek == numReadings) { // jika data array = 5
int panjang = 0;
for (int j = 0; j < numReadings; j++) {
panjang += readings[j];
}
panjang = panjang / numReadings;
if (sensor.timeoutOccurred()) {
lcd.setCursor(0, 0);
lcd.print("Error");
delay(1000);
} else {
lcd.clear();
sortArray(readings, numReadings); // untuk sorting nilai array dari kecil ke besar
M = median(readings, numReadings); // untuk mencari nilai median
Sd = StandarDeviasi(readings, numReadings);
D_U = (tinggi - (M / 10)); // data tinggi badan dikurangi hasil pengukuran dari sensor
lcd.setCursor(0, 0);
lcd.print("LILA:");
lcd.setCursor(5, 0);
lcd.print(D_U);
lcd.setCursor(11, 0);
lcd.print("cm");
lcd.setCursor(0, 1);
lcd.print("Med:");
lcd.setCursor(4, 1);
lcd.print(M);
lcd.setCursor(9, 1);
lcd.print("cm");
lcd.setCursor(0, 2);
lcd.print("SD:");
lcd.setCursor(3, 2);
lcd.print(Sd);
lcd.setCursor(9, 2);
lcd.print("cm");
indek = 0;
delay(1000);
break;
}
}
}
}
float median(int data[], int jumlah) {
int tengah;
float median;
if (jumlah % 2 == 0) {
tengah = jumlah / 2;
median = (data[tengah - 1] + data[tengah]) / 2;
} else {
tengah = jumlah / 2;
median = data[tengah];
}
return median;
}
float StandarDeviasi(int data[], int jumlah) {
float rata, total, SD;
total = 0;
for (int i = 0; i < jumlah; i++) {
total += data[i];
}
rata = total / jumlah;
total = 0;
for (int i = 0; i < jumlah; i++) {
total += pow(data[i] - rata, 2);
}
SD = sqrt(total / (jumlah - 1));
return SD;
}
// Fungsi untuk mengedit dan menyimpan tanggal saat ini di EEPROM
void editDate() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Edit Date:");
lcd.setCursor(0, 1);
lcd.print("DD/MM/YYYY");
// Baca tanggal, bulan, dan tahun baru dari keypad
int newDay = readNumber(2, 0, 1);
int newMonth = readNumber(2, 0, 2);
int newYear = readNumber(4, 0, 3);
// Simpan tanggal yang baru ke dalam struktur data tanggal saat ini
currentDate.day = newDay;
currentDate.month = newMonth;
currentDate.year = newYear;
// untuk simpan tanggal yang baru ke dalam EEPROM
EEPROM.put(EEPROM_ADDRESS, currentDate);
updateLCD();
}
// Fungsi untuk mengedit dan menyimpan tanggal lahir di EEPROM
void editBirthDate() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Edit Tgl Lahir:");
lcd.setCursor(0, 1);
lcd.print("DD/MM/YYYY");
// Baca tanggal, bulan, dan tahun baru dari keypad
hari = readNumber(2, 0, 1);
bulan = readNumber(2, 0, 2);
tahun = readNumber(4, 0, 3);
updateLCD();
}
int readNumber(int length, int column, int row) {
char input[length + 1];
for (int i = 0; i < length; i++) {
input[i] = keypad.waitForKey();
lcd.setCursor(column + i, row);
lcd.print(input[i]);
}
input[length] = '\0';
return atoi(input);
}
void updateLCD() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tanggal:");
lcd.setCursor(9, 0);
lcd.print(currentDate.day);
lcd.print("/");
lcd.print(currentDate.month);
lcd.print("/");
lcd.print(currentDate.year);
// Tampilkan tanggal lahir di baris kedua
lcd.setCursor(0, 1);
lcd.print("Tgl Lahir:");
lcd.setCursor(9, 1);
lcd.print(hari);
lcd.print("/");
lcd.print(bulan);
lcd.print("/");
lcd.print(tahun);
}
// Fungsi untuk mendapatkan data dari EEPROM
float getDataEEPROM(int address) {
nourut = EEPROM.read(address); // Memanggil data nomor urut
jk = EEPROM.read(address + 1); // Memanggil data jenis kelamin
usia = EEPROM.read(address + 2); // Memanggil data usia
status = EEPROM.read(address + 3); // Memanggil data status
panjang1 = EEPROM.read(address + 4); // Memanggil data panjang1
panjang2 = EEPROM.read(address + 5); // Memanggil data panjang2
panjangfix = (panjang1 * 100 + panjang2) / 10.0; // Menggabungkan panjang1 dan panjang2 menjadi panjangfix
return nourut;
}
void informasi_status() {
address = EEPROM.length() - 5 * (nourut + 1);
EEPROM.write(address, nourut);
EEPROM.write(address + 1, jk);
EEPROM.write(address + 2, usia);
EEPROM.write(address + 3, status);
EEPROM.write(address + 4, panjang1);
EEPROM.write(address + 5, panjang2);
// Menampilkan informasi status gizi pada LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("No: ");
lcd.print(nourut);
lcd.setCursor(0, 1);
lcd.print("JK: ");
lcd.print(jk);
lcd.setCursor(0, 2);
lcd.print("Usia: ");
lcd.print(usia);
lcd.setCursor(0, 3);
lcd.print("Status: ");
lcd.print(statusGizi);
}
void tampilRecord() {
if (tampilRecordMode) {
address = EEPROM.length() - 5 * (nourut + 1);
nourut = EEPROM.read(address);
jk = EEPROM.read(address + 1);
usia = EEPROM.read(address + 2);
status = EEPROM.read(address + 3);
panjang1 = EEPROM.read(address + 4);
panjang2 = EEPROM.read(address + 5);
panjangfix = (panjang1 * 100 + panjang2) / 10.0;
// Menampilkan data record pada LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("No: ");
lcd.print(nourut);
lcd.setCursor(0, 1);
lcd.print("JK: ");
lcd.print(jk);
lcd.setCursor(0, 2);
lcd.print("Usia: ");
lcd.print(usia);
lcd.setCursor(0, 3);
lcd.print("Panjang: ");
lcd.print(panjangfix);
delay(3000);
}
}