ESP32 board resetting again and again

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);
  }
}

That's a fairly large program. Did you build it up piece by piece, only adding / debugging a single new element at a time? If so, the problem would have been fairly easy to identify as associated with the last element added.

3 Likes

i tried simulating your code, but not all the branches

i suggest you add prints to various functions and the different cases for a = 0, 1, 2 to determine how far the code gets before it resets to better isolate where there may be a problem

don't see a EEPROM.begin(EEPROM_SIZE)..
maybe that's all it needs..

good luck.. ~q

just checking some more for you..
yes, you need the eeprom begin..
but i think your issue is you pins..

pins 5,12 are strapping pins..
if pin 12 is high, boot fails..

i also have noticed that you have buttonPin defined as 12 but you also use 12 in your pin_rows..
not good i expect..

note what pins are straps depends on the exact chip..

good reference..
esp32-pinout-reference-gpios

good luck.. ~q

Hi, @bimosora

Can you please post some images of your project?
Have you tried uploading your code with ALL the peripherals disconnected?

How many pins does your ESP32 control PCB have on it?

Very good question.

Tom.. :smiley: :+1: :coffee: :australia: