Este tópico contém respostas, possui 2 vozes e foi atualizado pela última vez por  Rosana Guse 3 meses .

Visualizando 4 posts - 1 até 4 (de 4 do total)
  • Autor
    Posts
  • #94242

    cmadureira96
    Participante

    Pessoal, estou tentando fazer um sensor de movimento com MPU6050; porém, adaptando o programa do FelipeFlop para armazenar em banco de dados em MySQL.

    Só que não estou conseguindo resposta do MPU6050 através do NodeMCU ! Além de não gravar os dados no banco de dados, fica sempre registrando -1 nos 3 eixos. Algúem poderia me ajudar ? Meu código está como abaixo:

     

    /*****************************************************
    SENSOR DE QUEDAS UTILIZANDO MPU6050 E NODEMCU
    VERSÃO1.0

    DATA: 10/04/2019
    *****************************************************/

    #include <ESP8266WiFi.h> // Biblioteca para utilizar funções wifi do NodeMCU
    #include<Wire.h> // Biblioteca para utilizar comunicação I2C do MPU6050

    const char* ssid = “********”; // Nome da rede wifi utilizada
    const char* password = “**********”; // Senha da rede wifi utilizada
    const char* host = “************”; // Endereço host utilizado. Nesse caso, como usei o servidor Apache do XAMMP, o host é o próprio endereço IP do meu PC.

    int16_t Ax,Ay,Az,Gx,Gy,Gz; // Variáveis para armazenamento dos dados ‘crus’ do MPU6050

    const int MPU_ADDR = 0x68; // Definição do endereço do sensor MPU6050 (0x68)
    const int WHO_AM_I = 0x75; // Degistro de identificação do dispositivo
    const int PWR_MGMT_1 = 0x6B; // Registro de configuração do gerenciamento de energia
    const int GYRO_CONFIG = 0x1B; // Registro de configuração do giroscópio
    const int ACCEL_CONFIG = 0x1C; // Registro de configuração do acelerômetro
    const int ACCEL_XOUT = 0x3B; // Registro de leitura do eixo X do acelerômetro

    const int sda_pin = D5; // Definição do pino I2C SDA
    const int scl_pin = D6; // Definição do pino I2C SCL

    bool led_state = false;

    //Função que configura a I2C com os pinos desejados
    void initI2C()
    {
    Wire.begin(sda_pin, scl_pin);
    }

    //Função que escreve um dado valor em um dado registro
    void writeRegMPU(int reg, int val) // Aceita um registro e um valor como parâmetro
    {
    Wire.beginTransmission(MPU_ADDR); // Inicia comunicação com endereço do MPU6050
    Wire.write(reg); // Envia o registro com o qual se deseja trabalhar
    Wire.write(val); // Escreve o valor no registro
    Wire.endTransmission(true); // Termina a transmissão
    }

    //Função que lê de um dado registro
    uint8_t readRegMPU(uint8_t reg) // Aceita um registro como parâmetro
    {
    uint8_t data;
    Wire.beginTransmission(MPU_ADDR); // Inicia comunicação com endereço do MPU6050
    Wire.write(reg); // Envia o registro com o qual se deseja trabalhar
    Wire.endTransmission(false); // Termina transmissão mas continua com I2C aberto (envia STOP e START)
    Wire.requestFrom(MPU_ADDR, 1); // Configura para receber 1 byte do registro escolhido acima
    data = Wire.read(); // Lê o byte e guarda em ‘data’
    return data; // Retorna ‘data’
    }

    //Função que procura pelo sensor no endereço 0x68
    void findMPU(int mpu_addr)
    {
    Wire.beginTransmission(MPU_ADDR);
    int data = Wire.endTransmission(true);

    if(data == 0)
    {
    Serial.print(“Dispositivo encontrado no endereço: 0x”);
    Serial.println(MPU_ADDR, HEX);
    }
    else
    {
    Serial.println(“Dispositivo não encontrado!”);
    }
    }

    //Função que verifica se o sensor responde e se está ativo
    void checkMPU(int mpu_addr)
    {
    findMPU(MPU_ADDR);

    int data = readRegMPU(WHO_AM_I);

    if(data == 104)
    {
    Serial.println(“MPU6050 Dispositivo respondeu OK! (104)”);

    data = readRegMPU(PWR_MGMT_1); // Register 107 – Gerenciamento de energia

    if(data == 64) Serial.println(“MPU6050 em modo SLEEP! (64)”);
    else Serial.println(“MPU6050 em modo ACTIVE!”);
    }
    else Serial.println(“Verifique dispositivo – MPU6050 NÃO disponível!”);
    }

    //Função de inicialização do sensor
    void initMPU()
    {
    setSleepOff();
    setGyroScale();
    setAccelScale();
    }

    //Função para configurar o sleep bit
    void setSleepOff()
    {
    writeRegMPU(PWR_MGMT_1, 0); // Escreve 0 no registro de gerenciamento de energia(0x68), colocando o sensor em o modo ACTIVE
    }

    //Função para configurar as escalas do giroscópio
    void setGyroScale()
    {
    writeRegMPU(GYRO_CONFIG, 0);
    }

    //Função para configurar as escalas do acelerômetro
    void setAccelScale()
    {
    writeRegMPU(ACCEL_CONFIG, 0);
    }

    //Função que lê os dados ‘crus'(raw data) do sensor
    void readRawMPU()
    {
    Wire.beginTransmission(MPU_ADDR); // Inicia comunicação com endereço do MPU6050
    Wire.write(ACCEL_XOUT); // Envia o registro com o qual se deseja trabalhar, começando com registro 0x3B (ACCEL_XOUT_H)
    Wire.endTransmission(false); // Termina transmissão mas continua com I2C aberto (envia STOP e START)
    Wire.requestFrom(MPU_ADDR, 14); // Configura para receber 14 bytes começando do registro escolhido acima (0x3B)

    Ax = Wire.read() << 8; // Lê primeiro o byte mais significativo
    Ax |= Wire.read(); // Depois lê o bit menos significativo
    Ay = Wire.read() << 8;
    Ay |= Wire.read();
    Az = Wire.read()<< 8;
    Az |= Wire.read();

    Gx = Wire.read() << 8;
    Gx |= Wire.read();
    Gy= Wire.read() << 8;
    Gy |= Wire.read();
    Gz = Wire.read() << 8;
    Gz |= Wire.read();

    Serial.print(“Ax = “); Serial.print(Ax);
    Serial.print(” | Ay = “); Serial.print(Ay);
    Serial.print(” | Az = “); Serial.print(Az);
    Serial.print(” | Gx = “); Serial.print(Gx);
    Serial.print(” | Gy = “); Serial.print(Gy);
    Serial.print(” | Gz = “); Serial.println(Gz);

    led_state = !led_state;
    digitalWrite(LED_BUILTIN, led_state); // pisca LED do NodeMCU a cada leitura do sensor
    delay(50);
    }

    //Função que conecta o NodeMCU na rede Wifi
    void reconnectWiFi()
    {
    if(WiFi.status() == WL_CONNECTED)
    return;

    WiFi.begin(ssid, password);

    while(WiFi.status() != WL_CONNECTED) {
    delay(100);
    Serial.print(“.”);
    }

    Serial.println();
    Serial.print(“Conectado com sucesso na rede: “);
    Serial.println(ssid);
    Serial.print(“IP obtido: “);
    Serial.println(WiFi.localIP());

    }

    void initWiFi()
    {
    delay(10);
    Serial.print(“Conectando-se na rede: “);
    Serial.println(ssid);
    Serial.println(“Aguarde”);

    reconnectWiFi();

    }

    //Função para enviar os dados pro banco de dados
    void mysql()
    {
    Serial.print(“Conectando com”);
    Serial.print(host);

    WiFiClient client; // Usando a classe WiFiClient para criar conexões TCP

    const int httpPort = 80;
    if (!client.connect(host, httpPort)) {
    Serial.println(“Falha na conexao”);
    delay(5000);
    return;
    }

    String url = “/nodemcu/salvar.php?”; // Cria a URL para enviar dados de requisição.
    url += “Ax=”;
    url += Ax;
    url += “&Ay=”;
    url += Ay;
    url += “&Az=”;
    url += Az;
    url += “Gx=”;
    url += Gx;
    url += “&Gy=”;
    url += Gy;
    url += “&Gz=”;
    url += Gz;

    Serial.print(“Requesting URL: “); // Envia a requisição para o servidor.
    Serial.println(url);
    client.print(String(“GET “) + url + ” HTTP/1.1\r\n” +
    “Host: ” + host + “\r\n” +
    “Connection: close\r\n\r\n”);
    unsigned long timeout = millis(); // Verifica o tempo da solicitação
    while (client.available() == 0) {
    if (millis() – timeout > 5000) {
    Serial.println(“>>> Client Timeout !”);
    client.stop();
    delay(60000);
    return;
    }
    }
    }

    void setup() {
    pinMode(LED_BUILTIN, OUTPUT);
    Serial.begin(115200);

    Serial.println(“nIniciando configuração WiFin”);
    initWiFi();

    Serial.println(“nIniciando configuração do MPU6050n”);
    initI2C();
    initMPU();
    checkMPU(MPU_ADDR);

    Serial.println(“nConfiguração finalizada, iniciando loopn”);
    }

    void loop() {
    readRawMPU(); // Lê os dados do sensor
    mysql(); // Envia os dados do sensor pro banco MySQL
    delay(100);
    }

    0
    #94666

    Rosana Guse
    Moderador

    Olá,

    Usando o códio desse tutorial, o que acontece?

    https://www.filipeflop.com/blog/acelerometro-com-esp8266-nodemcu/

    Abraço!
    Rosana – Equipe FilipeFlop

    0
    #95175

    cmadureira96
    Participante

    Rosana, diferente do tutorial de vcs, eu preciso que meus dados sejam armazenados em uma tabela com MySQL para que eu tenha acesso posterior, e não somente para que seja visualizado de forma instantânea. Inclusive, o código que montei foi uma adaptação do de vocês pra atender a essa necessidade.

    0
    #96270

    Rosana Guse
    Moderador

    Olá,

    A sugestão do tutorial é para que você possa verificar o funcionamento correto do NodeMCU e do MPU6050 em uma aplicação mais simples. Ambos estão funcionando corretamente em uma aplicação mais simples?

    Abraço!

    Rosana – Equipe FilipeFlop

    0
Visualizando 4 posts - 1 até 4 (de 4 do total)

Você deve fazer login para responder a este tópico.