Skip to content

Instantly share code, notes, and snippets.

@edersonbadeca
Created October 18, 2024 01:43
Show Gist options
  • Save edersonbadeca/7454f8178d386f6a69c1fca536ccb34e to your computer and use it in GitHub Desktop.
Save edersonbadeca/7454f8178d386f6a69c1fca536ccb34e to your computer and use it in GitHub Desktop.
Arquivo do código C++ para ESP32 - sketch.ino
#include <Arduino.h>
#include "modelo_iris.h" // Inclua o arquivo gerado pelo microgenml
Eloquent::ML::Port::DecisionTree dt;
// Definir os pinos dos potenciômetros
#define POT1_PIN 34 // Potenciômetro 1 (Comprimento da Sépala)
#define POT2_PIN 35 // Potenciômetro 2 (Largura da Sépala)
#define POT3_PIN 32 // Potenciômetro 3 (Comprimento da Pétala)
#define POT4_PIN 33 // Potenciômetro 4 (Largura da Pétala)
// Definir os pinos dos LEDs
#define LED_SETOSA_PIN 19 // LED para a classe Setosa
#define LED_VERSICOLOR_PIN 18 // LED para a classe Versicolor
#define LED_VIRGINICA_PIN 5 // LED para a classe Virginica
void setup() {
Serial.begin(115200);
// Configurar os pinos dos potenciômetros como entradas
pinMode(POT1_PIN, INPUT);
pinMode(POT2_PIN, INPUT);
pinMode(POT3_PIN, INPUT);
pinMode(POT4_PIN, INPUT);
// Configurar os pinos dos LEDs como saídas
pinMode(LED_SETOSA_PIN, OUTPUT);
pinMode(LED_VERSICOLOR_PIN, OUTPUT);
pinMode(LED_VIRGINICA_PIN, OUTPUT);
// Inicializar os LEDs desligados
digitalWrite(LED_SETOSA_PIN, LOW);
digitalWrite(LED_VERSICOLOR_PIN, LOW);
digitalWrite(LED_VIRGINICA_PIN, LOW);
}
void loop() {
// Ler os valores dos potenciômetros (0-4095)
int pot1_value = analogRead(POT1_PIN);
int pot2_value = analogRead(POT2_PIN);
int pot3_value = analogRead(POT3_PIN);
int pot4_value = analogRead(POT4_PIN);
// Normalizar os valores para os ranges do dataset Iris
float sepal_length = map(pot1_value, 0, 4095, 43, 79) / 10.0; // 4.3 - 7.9 cm
float sepal_width = map(pot2_value, 0, 4095, 20, 44) / 10.0; // 2.0 - 4.4 cm
float petal_length = map(pot3_value, 0, 4095, 10, 69) / 10.0; // 1.0 - 6.9 cm
float petal_width = map(pot4_value, 0, 4095, 10, 25) / 10.0; // 1.0 - 2.5 cm
// Criar um array com as características para o modelo
float features[4] = {sepal_length, sepal_width, petal_length, petal_width};
// Pré-processamento (se necessário)
// Valores de média e desvio padrão usados durante o treinamento
//float mean[] = {5.8433, 3.054, 3.7587, 1.1987};
//float std_dev[] = {0.8281, 0.4335, 1.7644, 0.7631};
// Padronizar os dados de entrada
//for (int i = 0; i < 4; i++) {
// features[i] = (features[i] - mean[i]) / std_dev[i];
//}
// Chamar a função de predição do modelo
int predicted_class = dt.predict(features); // Substitua pelo nome correto da função
// Mapear a classe predita para o nome da espécie e acender o LED correspondente
String class_name;
switch (predicted_class) {
case 0:
class_name = "Setosa";
// Acender o LED correspondente e apagar os outros
digitalWrite(LED_SETOSA_PIN, HIGH);
digitalWrite(LED_VERSICOLOR_PIN, LOW);
digitalWrite(LED_VIRGINICA_PIN, LOW);
break;
case 1:
class_name = "Versicolor";
digitalWrite(LED_SETOSA_PIN, LOW);
digitalWrite(LED_VERSICOLOR_PIN, HIGH);
digitalWrite(LED_VIRGINICA_PIN, LOW);
break;
case 2:
class_name = "Virginica";
digitalWrite(LED_SETOSA_PIN, LOW);
digitalWrite(LED_VERSICOLOR_PIN, LOW);
digitalWrite(LED_VIRGINICA_PIN, HIGH);
break;
default:
class_name = "Desconhecida";
// Desligar todos os LEDs se a classe for desconhecida
digitalWrite(LED_SETOSA_PIN, LOW);
digitalWrite(LED_VERSICOLOR_PIN, LOW);
digitalWrite(LED_VIRGINICA_PIN, LOW);
break;
}
// Imprimir os resultados no Serial Monitor
Serial.print("Comprimento da Sépala: ");
Serial.print(sepal_length);
Serial.print(" cm, Largura da Sépala: ");
Serial.print(sepal_width);
Serial.print(" cm, Comprimento da Pétala: ");
Serial.print(petal_length);
Serial.print(" cm, Largura da Pétala: ");
Serial.print(petal_width);
Serial.print(" cm -> Classe: ");
Serial.println(class_name);
// Esperar 1 segundo antes de ler os valores novamente
delay(1000);
}
Arquivo google colab - programação em python - treinamento da IA
# Instalação das bibliotecas
!pip install pycaret &> /dev/null
!pip install micromlgen &> /dev/null
# Importar as bibliotecas
import pandas as pd
from pycaret.datasets import get_data
from pycaret.classification import *
# Carregar o dataset Iris
data = get_data('iris')
# Configurar o PyCaret para classificação sem pré-processamento
clf = setup(data, target='species', session_id=123, normalize=False, preprocess=False)
# Criar um modelo de Árvore de Decisão (compatível com microgenml)
dt_model = create_model('dt')
# Finalizar o modelo (treinar no dataset completo)
final_model = finalize_model(dt_model)
https://en.wikipedia.org/wiki/Iris_flower_data_set
https://scikit-learn.org/stable/auto_examples/datasets/plot_iris_dataset.html
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment