Справился? Код (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); }
SoftwareWire myWire1(4, 5); SoftwareWire myWire2(6, 7); Должны быть глобальными, а не локальными в функции setup.
Ок! Вывел из 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 }
Еще вопросик... использую условие (нажатия кнопки) Код (C++): const int Z=8; // переменная кнопки №1 pinMode(Z, INTPUT); // кнопка №1 if(digitalRead(Z, HIGH)) //проверка значения Z , соответственно нажата кнопка {S=1} // дествие else {S=2} // пусто... Подскажите, как прописать данное условие, что б оно выполнялось при нажатии кнопки в течении 3-х секунд. (к примеру)
Вот так с нажатием попрет? Код (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 } }
Местами синтаксис и пунктуация неправильные, и констаниа Z локально в setup объявлена. Про digitalRead писал уже.
Когда кнопка нажата частота loop из-за delay(500) будет 2 Гц. Если удерживать кнопку она будет повторно срабатывать.
Я для примера на одном myWire показал... Соответственно значение val пока до 5 не дорастет событие S=2 не случится... Еще раз - событие S=2 случится после удержания кнопки - правильно?
КЛАССС!!!! Количество получения событии "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); Так сработает счетчик нажатии?
Стал заливать... ругается 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; // обнулили переменную } } }
Вот что, погуглить трудно? Вы вначале не обозначили переменную addr и не дали ей значение. Откуда программа будет знать, что вы понимаете под addr?
Спасибо Вот я тупои.... Пропустил... Тут не в гугле дело... #define addr 0x0D //I2C Address for The HMC5883
А тут то что я не правильно записал???? Код (C++): if(digitalRead(knopka2,HIGH)) // нажали кнопочку #2 Ругается.... too many arguments to function 'int digitalRead(uint8_t)'
Вам уже писали, что в digitalRead() не пишется HIGH или LOW. Это ЧТЕНИЕ, а не УКАЗАНИЕ УРОВНЯ НА ПИН.