Início Atividade 5
5
INTERMEDIÁRIO

Acelerômetro 🎮

Detecte movimento, vibração e orientação espacial da placa

🎯 O que você vai aprender

Vamos criar dois projetos:
1️⃣ Detector de Vibração - Alarme quando a placa é movida
2️⃣ Joystick Virtual - Use a placa como controle de jogo

📚 O que é um Acelerômetro?

Um acelerômetro mede a aceleração e a orientação em 3 dimensões: X (esquerda/direita), Y (frente/trás) e Z (cima/baixo).

Eixo X

↔️

Esquerda / Direita

Eixo Y

↕️

Frente / Trás

Eixo Z

⬆️⬇️

Cima / Baixo

📱 Exemplo do dia a dia: Seu celular usa acelerômetro para girar a tela quando você vira o aparelho, e para contar seus passos!

🔧 Hardware

📐

Acelerômetro MMA8452Q

Comunicação I2C (integrado ao kit)

📚 Biblioteca necessária: RoboCore_MMA8452Q (instale via Library Manager)

V1

Detector de Vibração / Movimento

Este código detecta quando a placa é movida e exibe um alerta. Útil para sistema de segurança ou alarme anti-furto!

detector_movimento.ino
/************************************************
* RoboCore - IoT DevKit - Detector de Movimento
***********************************************/

#include "RoboCore_MMA8452Q.h"

//Criamos o objeto do acelerômetro
MMA8452Q acel;

void setup() {
  Serial.begin(115200);
  
  //Inicializa o sensor
  acel.init();
  
  Serial.println("Sistema de Alarme Ativo! 🔒");
}

void loop() {
  //Faz a leitura dos 3 eixos
  acel.read();

  //Se houver movimento significativo, dispara o alerta
  if((acel.x > 0.40) || (acel.y > 0.40) || (acel.z < 0.80)){
    Serial.println("⚠️ ALERTA! MOVIMENTO DETECTADO ⚠️");
  }
  
  delay(100);
}

💡 Como funciona: Quando a placa está parada na horizontal, Z ≈ 1.0 (gravidade), X ≈ 0 e Y ≈ 0. Qualquer movimento muda esses valores!

V2

Joystick Virtual - Sensor de Orientação

Transforme a placa em um controle de jogo! Incline para cada direção e veja a resposta no terminal. 🎮

joystick_acelerometro.ino
/*
 * JOYSTICK ACELERÔMETRO
 * Objetivo: Ensinar orientação X, Y e Z de forma visual
 */

#include "RoboCore_MMA8452Q.h"

MMA8452Q acel;

void setup() {
  Serial.begin(115200);
  acel.init();
  Serial.println("Calibrando o Nível Digital...");
  delay(1000);
}

void loop() {
  // 1. Faz a leitura dos eixos
  acel.read();
  
  float x = acel.x;
  float y = acel.y;
  float z = acel.z;

  Serial.println("=============================");
  Serial.println("   SENSOR DE ORIENTACAO 🧭   ");
  Serial.println("=============================");

  // Mostra os dados brutos
  Serial.print("EIXO X (Lado): "); Serial.println(x);
  Serial.print("EIXO Y (Frente): "); Serial.println(y);
  Serial.print("EIXO Z (Cima/Baixo): "); Serial.println(z);
  Serial.println("-----------------------------");
  Serial.print("STATUS: ");

  // Lógica de Decisão (0.3 = zona morta)
  if (x > 0.3) {
    Serial.println("⬅️  INCLINADO PARA ESQUERDA");
  } 
  else if (x < -0.3) {
    Serial.println("➡️  INCLINADO PARA DIREITA");
  } 
  else if (y > 0.3) {
    Serial.println("⬇️  INCLINADO PARA TRÁS");
  }
  else if (y < -0.3) {
    Serial.println("⬆️  INCLINADO PARA FRENTE");
  }
  else {
    Serial.println("⏹️  ESTÁVEL / PLANO");
  }

  // Detecção de Agito forte
  if (abs(x) + abs(y) + abs(z) > 1.8) {
     Serial.println("⚠️  AGITO DETECTADO!"); 
  }

  Serial.println("=============================");
  
  delay(250);
}

🔍 Conceitos Importantes

Zona Morta (Threshold)

O valor 0.3 é um limiar (threshold). Valores abaixo disso são considerados "neutros" para evitar que pequenas vibrações disparem ações. É como uma "margem de tolerância".

abs() - Valor Absoluto

A função abs() retorna o valor sem o sinal.
abs(-0.5) = 0.5
Útil para somar as forças independente da direção!

📝 Teste seus Conhecimentos

🎮

Quiz Gamificado

Responda às perguntas para ganhar XP e desbloquear a próxima atividade!

Carregando quiz...