Подключение HMC5883L

Тема в разделе "Arduino & Shields", создана пользователем Artclonic, 3 мар 2018.

  1. Artclonic

    Artclonic Гик

    Справился?
    Код (C++):
    void setup() {

      Serial.begin(9600);

      myWire1.begin();
      myWire2.begin();
    SoftwareWire myWire1(4, 5);
    SoftwareWire myWire2(6, 7);
    //Проверить изменение показаний можно магнитом

      myWire1.beginTransmission(addr); //start talking
      myWire1.write(0x0B); // Tell the HMC5883 to Continuously Measure
      myWire1.write(0x01); // Set the Register
      myWire1.endTransmission();
      myWire1.beginTransmission(addr); //start talking
      myWire1.write(0x09); // Tell the HMC5883 to Continuously Measure
      myWire1.write(0x1D); // Set the Register
      myWire1.endTransmission();
      myWire2.beginTransmission(addr); //start talking
      myWire2.write(0x0B); // Tell the HMC5883 to Continuously Measure
      myWire2.write(0x01); // Set the Register
      myWire2.endTransmission();
      myWire2.beginTransmission(addr); //start talking
      myWire2.write(0x09); // Tell the HMC5883 to Continuously Measure
      myWire2.write(0x1D); // Set the Register
      myWire2.endTransmission();


    }

    void loop() {
      //Начало первого блока кода для чтения 1 датчика

      int x1, y1, z1; //triple axis data

      //Tell the HMC what regist to begin writing data into


      Wire.beginTransmission(addr);
      Wire.write(0x00); //start with register 3.
      Wire.endTransmission();

      //Read the data.. 2 bytes for each axis.. 6 total bytes
      Wire.requestFrom(addr, 6);
      if (6 <= Wire.available()) {
        x1 = Wire.read(); //MSB  x
        x1 |= Wire.read() << 8; //LSB  x
        z1 = Wire.read(); //MSB  z
        z1 |= Wire.read() << 8; //LSB z
        y1 = Wire.read(); //MSB y
        y1 |= Wire.read() << 8; //LSB y
      }


    //Начало второго блока кода для чтения 2 датчика


      int x2, y2, z2; //triple axis data

      //Tell the HMC what regist to begin writing data into

      Wire.beginTransmission(addr);
      Wire.write(0x00); //start with register 3.
      Wire.endTransmission();

      //Read the data.. 2 bytes for each axis.. 6 total bytes
      Wire.requestFrom(addr, 6);
      if (6 <= Wire.available()) {
        x2 = Wire.read(); //MSB  x
        x2 |= Wire.read() << 8; //LSB  x
        z2 = Wire.read(); //MSB  z
        z2 |= Wire.read() << 8; //LSB z
        y2 = Wire.read(); //MSB y
        y2 |= Wire.read() << 8; //LSB y
      }
      }


      // Show Values
       //Serial.print("X Value: ");
    Serial.print("E");
    Serial.print(x1);
    Serial.print(",");
    Serial.print(y1);
    Serial.print(",");
    Serial.print(z1);
    Serial.print(x2);
    Serial.print(",");
    Serial.print(y2);
    Serial.print(",");
    Serial.print(z2);
    Serial.print("\n");

      delay(100);
    }
     
     
  2. mcureenab

    mcureenab Гуру

  3. mcureenab

    mcureenab Гуру

    SoftwareWire myWire1(4, 5);
    SoftwareWire myWire2(6, 7);

    Должны быть глобальными, а не локальными в функции setup.
     
  4. mcureenab

    mcureenab Гуру

    В функции loop ничего не сделал. Как был Wire так и остался.
     
  5. Artclonic

    Artclonic Гик

    Ок! Вывел из stup в самое начало - и они стали глобальными!

    В loop с Wire - я сначало изменил на myWire1 и на myWire2 соответственно, Вы мне сказали оставить Wire... тут не пойму..
    Вот так будет loop выглядеть?

    Код (C++):
    void loop() {
      //Начало первого блока кода для чтения 1 датчика

      int x1, y1, z1; //triple axis data

      //Tell the HMC what regist to begin writing data into


      myWire2.beginTransmission(addr);
      myWire2.write(0x00); //start with register 3.
      myWire2.endTransmission();

      //Read the data.. 2 bytes for each axis.. 6 total bytes
      myWire2.requestFrom(addr, 6);
      if (6 <= myWire2.available()) {
        x1 = myWire2.read(); //MSB  x
        x1 |= myWire2.read() << 8; //LSB  x
        z1 = myWire2.read(); //MSB  z
        z1 |= myWire2.read() << 8; //LSB z
        y1 = myWire2.read(); //MSB y
        y1 |= myWire2.read() << 8; //LSB y
      }
     
     
    Последнее редактирование: 22 мар 2018
  6. Artclonic

    Artclonic Гик

    Еще вопросик... использую условие (нажатия кнопки)
    Код (C++):
    const int Z=8; // переменная кнопки №1
    pinMode(Z, INTPUT); // кнопка №1

    if(digitalRead(Z, HIGH))   //проверка значения Z , соответственно нажата кнопка
    {S=1} // дествие
    else
    {S=2}  // пусто...
    Подскажите, как прописать данное условие, что б оно выполнялось при нажатии кнопки в течении 3-х секунд. (к примеру)
     
  7. mcureenab

    mcureenab Гуру

    У digitalRead один аргумент. А LOW или HIGH это её результат.
     
  8. Artclonic

    Artclonic Гик

    mcureenab я правильно разобрался с Wire в loop?
     
  9. Artclonic

    Artclonic Гик

    Вот так с нажатием попрет?
    Код (C++):
    int val=0;
    void setup()
    {  
    constint Z=8;// переменная кнопки №1
    pinMode(Z, INTPUT);// кнопка №1              
    }
    void loop()
    {
          if(digitalRead(Z, HIGH))  // нажали кнопочку
          {
            val++;  // прибавляем к переменной 1 при каждой смене цикла.      
          delay(500); //небольшая защита от "дребезга" контактов кнопки
          }
          else
          {
            val=0; // обнулили переменную
          }      
          if(val>=5)
          {
            S=2
            val=0; // обнулили переменную
          }              
    else
          {
            S=1
          }      
    }
     
     
  10. mcureenab

    mcureenab Гуру

    Похоже на правду, только myWire1 исчез.
     
  11. mcureenab

    mcureenab Гуру

    Местами синтаксис и пунктуация неправильные, и констаниа Z локально в setup объявлена. Про digitalRead писал уже.
     
  12. mcureenab

    mcureenab Гуру

    Когда кнопка нажата частота loop из-за delay(500) будет 2 Гц.
    Если удерживать кнопку она будет повторно срабатывать.
     
  13. Artclonic

    Artclonic Гик

    Я для примера на одном myWire показал...
    Соответственно значение val пока до 5 не дорастет событие S=2 не случится...
    Еще раз - событие S=2 случится после удержания кнопки - правильно?
     
  14. mcureenab

    mcureenab Гуру

    Да.
     
  15. Artclonic

    Artclonic Гик

    КЛАССС!!!!
    Количество получения событии "S=2" (обзовем ее L)можно посчитать таким образом?
    К примеру L = val / 5 (В условии по val соответственно установить равно, а не больше либо равно 5)
    А не... оно потом обнулится.....

    А вот так?
    Код (C++):
    if(digitalRead(knopka2, HIGH))ii++
    Serial.print(ii);
    Так можно?
    Во! Наверное надо ii разделить на 5, тогда вот количество долговременных нажати будет считаться!

    Или еще проще вот сюда вставить r
    Код (C++):

    int r=0;
    if(val>=5)
          {
            S=2
    r++;
            val=0; // обнулили переменную
          }
    Serial.print(r);
    Так сработает счетчик нажатии?
     
    Последнее редактирование: 23 мар 2018
  16. Artclonic

    Artclonic Гик

    Стал заливать... ругается
    HMC5883L:17: error: 'addr' was not declared in this scope
    Вот код...
    Код (C++):
    #include <SoftwareWire.h>

    SoftwareWire myWire1(4, 5);
    SoftwareWire myWire2(6, 7);
    const int knopka1=8; // кнопка №1
    const int knopka2=9; // кнопка №2
    int val=0;
    int ii;
    void setup() {

    pinMode(knopka1, INPUT);
    pinMode(knopka2, INPUT);
    Serial.begin(9600);

      myWire1.begin();
      myWire2.begin();
     
      myWire1.beginTransmission(addr); //start talking
      myWire1.write(0x0B); // Tell the HMC5883 to Continuously Measure
      myWire1.write(0x01); // Set the Register
      myWire1.endTransmission();
      myWire1.beginTransmission(addr); //start talking
      myWire1.write(0x09); // Tell the HMC5883 to Continuously Measure
      myWire1.write(0x1D); // Set the Register
      myWire1.endTransmission();
     
      myWire2.beginTransmission(addr); //start talking
      myWire2.write(0x0B); // Tell the HMC5883 to Continuously Measure
      myWire2.write(0x01); // Set the Register
      myWire2.endTransmission();
      myWire2.beginTransmission(addr); //start talking
      myWire2.write(0x09); // Tell the HMC5883 to Continuously Measure
      myWire2.write(0x1D); // Set the Register
      myWire2.endTransmission();


    }

    void loop() {
     
    if(digitalRead(knopka1,HIGH)) //проверка включена ли кнопка №1
    {
      //Начало первого блока кода для чтения 1 датчика
      int x1, y1, z1; //triple axis data
      //Tell the HMC what regist to begin writing data into

      myWire1.beginTransmission(addr);
      myWire1.write(0x00); //start with register 3.
      myWire1.endTransmission();

      //Read the data.. 2 bytes for each axis.. 6 total bytes
      myWire1.requestFrom(addr, 6);
      if (6 <= myWire1.available()) {
        x1 = myWire1.read(); //MSB  x
        x1 |= myWire1.read() << 8; //LSB  x
        z1 = myWire1.read(); //MSB  z
        z1 |= myWire1.read() << 8; //LSB z
        y1 = myWire1.read(); //MSB y
        y1 |= myWire1.read() << 8; //LSB y
      }

      //Начало второго блока кода для чтения 2 датчика
      int x2, y2, z2; //triple axis data
      //Tell the HMC what regist to begin writing data into

      myWire2.beginTransmission(addr);
      myWire2.write(0x00); //start with register 3.
      myWire2.endTransmission();

      //Read the data.. 2 bytes for each axis.. 6 total bytes
      myWire2.requestFrom(addr, 6);
      if (6 <= myWire2.available()) {
        x2 = myWire2.read(); //MSB  x
        x2 |= myWire2.read() << 8; //LSB  x
        z2 = myWire2.read(); //MSB  z
        z2 |= myWire2.read() << 8; //LSB z
        y2 = myWire2.read(); //MSB y
        y2 |= myWire2.read() << 8; //LSB y
      }
     
      // Печать в порт
     
    Serial.print("E");
    Serial.print(x1);
    Serial.print(",");
    Serial.print(y1);
    Serial.print(",");
    Serial.print(z1);
    Serial.print(x2);
    Serial.print(",");
    Serial.print(y2);
    Serial.print(",");
    Serial.print(z2);
    Serial.print("\n");

      delay(100);
    }
    else
    {
      if(digitalRead(knopka2, HIGH))ii++  // нажали кнопочку #2
          {
            val++;  // прибавляем к переменной 1 при каждой смене цикла.    
          delay(500); //небольшая защита от "дребезга" контактов кнопки
          }
          else
          {
            val=0; // обнулили переменную
          }    
          if(val>=5)
          {
           Serial.print("REPER");
           Serial.print(ii);
         
           // тут надо подумать как отразить номер репера
         
            val=0; // обнулили переменную
          }            
        }
    }
     
     
  17. Arduino_man

    Arduino_man Гик

    Вот что, погуглить трудно? Вы вначале не обозначили переменную addr и не дали ей значение. Откуда программа будет знать, что вы понимаете под addr?
     
  18. Artclonic

    Artclonic Гик

    Спасибо Вот я тупои.... Пропустил... Тут не в гугле дело...
    #define addr 0x0D //I2C Address for The HMC5883
     
  19. Artclonic

    Artclonic Гик

    А тут то что я не правильно записал????
    Код (C++):
    if(digitalRead(knopka2,HIGH))  // нажали кнопочку #2
    Ругается....
    too many arguments to function 'int digitalRead(uint8_t)'
     
  20. Arduino_man

    Arduino_man Гик

    Вам уже писали, что в digitalRead() не пишется HIGH или LOW. Это ЧТЕНИЕ, а не УКАЗАНИЕ УРОВНЯ НА ПИН.