1 — ESP32 simulation

An interactive ESP32 circuit simulation you can run free in your browser on Velxio, by felipe021-com.

Components

Sketch code

#include <TinyGPSPlus.h>
#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include <WiFi.h>
#include <WebServer.h>
#include <vector>
#include <algorithm>
#include <Preferences.h>

//salvar linha
Preferences preferencias;
float START_LAT = 0;
float START_LON = 0;
float START_HEADING = 0;

bool startLineSaved = false;

bool ultimoEstadoStartLine = HIGH;
unsigned long tempoBotaoStartLine = 0;

// deteccao de linha
bool linhaArmada = false;

float distanciaFrente = 0;
float distanciaLateral = 0;

unsigned long tempoUltimaVolta = 0;

const float DISTANCIA_ARMAR = 3.0;  // metros
const float DISTANCIA_CRUZAMENTO = 3.0;
const float LARGURA_LINHA = 12.0;   // metros para cada lado
const float VELOCIDADE_MINIMA = 0.0; // km/h

const unsigned long INTERVALO_VOLTA = 10000; // 10 segundos
     
// ---------------- MODO WIFI (baixar os arquivos do SD sem tirar o cartao) ----------------
// Como usar: com a gravacao PARADA, SEGURE o botao por 3 segundos.
//   1) O LED2 passa a piscar rapido: o ConecTrack criou uma rede WiFi.
//   2) No celular/notebook, conecte na rede abaixo.
//   3) Abra http://192.168.4.1 no navegador: lista de arquivos com Baixar / Apagar.
//   4) Pra sair: segure o botao 3 s de novo, ou aperte rapido pra comecar a gravar.
// Obs.: com o WiFi ligado a amostragem fica pausada (e os pinos GPIO25/26 nao leem no WiFi).
#define WIFI_SSID  "ConecTrack"
#define WIFI_SENHA "conectrack1"          // minimo 8 caracteres. Troque se quiser.
const unsigned long TEMPO_PRESSAO_LONGA = 3000;   // ms

WebServer server(80);
bool wifiOn = false;
void wifiParar();   // declarada aqui porque iniciarGravacao() usa

// ---------------- MPU6050 / clones (leitura direta dos registradores) ----------------
// Nao usa a biblioteca Adafruit: ela recusa clones (WHO_AM_I diferente de 0x68).
// O seu modulo responde WHO_AM_I = 0x70 (chip MPU-6500), que usa os mesmos registradores
// de acelerometro e giroscopio e funciona normalmente aqui.
uint8_t mpuEndereco = 0x68;
uint8_t mpuQuem = 0;
bool mpuOk = false;

const float ACC_LSB_POR_G    = 4096.0f;  // faixa +-8 g
const float GYRO_LSB_POR_DPS = 65.5f;    // faixa +-500 graus/s

// Aceleracao em g, giroscopio em graus/s, temperatura do sensor em graus C
float ACCX = 0, ACCY = 0, ACCZ = 0;
float GYROX = 0, GYROY = 0, GYROZ = 0;
float TEMPM = 0;

bool mpuEscrever(uint8_t reg, uint8_t valor) {
  Wire.beginTransmission(mpuEndereco);
  Wire.write(reg);
  Wire.write(valor);
  return Wire.endTransmission() == 0;
}

bool mpuLerRegs(uint8_t reg, uint8_t* buf, uint8_t n) {
  Wire.beginTransmission(mpuEndereco);
  Wire.write(reg);
  if (Wire.endTransmission(false) != 0) return false;
  if (Wire.requestFrom((int)mpuEndereco, (int)n) != n) return false;
  for (uint8_t i = 0; i < n; i++) buf[i] = Wire.read();
  return true;
}

bool mpuIniciar() {
  // procura em 0x68 e depois 0x69
  bool achou = false;
  for (uint8_t end = 0x68; end <= 0x69; end++) {
    Wire.beginTransmission(end);
    if (Wire.endTransmission() == 0) { mpuEndereco 

More projects by felipe021-com