Помогите объединить два скетча
- Войдите на сайт для отправки комментариев
Чт, 10/08/2017 - 16:07
Здравствуйте!Недавно только заинтересовался Arduino, по этому очень много не знаю. Помогите пожалуйста объединить два скетча, или дайте полезный совет (ссылку и.т.д). Первый для bh 1750 и второй для светодиода. Спасибо за ваше внимание!
Скетч для bh1750:
#include
#include
BH1750 lightMeter;
void setup() {
Serial.begin(9600);
lightMeter.begin();
}
void loop() {
uint16_t lux = lightMeter.readLightLevel();
Serial.println(String(lux) + " lx");
delay(100);
}
Скетч для светодиода:
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
digitalWrite(13, LOW);
void setup() {
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
Вы при вставке кода половину строк потеряли. Но это, в общем-то, неважно. Главное можно сказать, даже смотря на эти обрывки - В общем случае обьединить два и более скетчей, в которых есть операторы delay - НЕВОЗМОЖНО.
Чтобы обойти эту проблему, необходимо переписать оба скетча без этого оператора. КАК - описаний в инете полно, ищите "блинк без делей".
Спасибо!
Пфф..В интернете молоток но мало толку! Так, чтоб что нибудь написать..!?
Вот - почитайте - по-русски.
http://arduino.ru/tutorials/BlinkWithoutDelay
Если не поймете - читайте сначала. Если не сможете этого понять - вы безнадежны....
Когда сможете что-то написать - приходите, поможем.
Давненько такой темы не было Помогите объединить два скетча . Самое удивительное камень падает в ту же воронку - delay
Вы при вставке кода половину строк потеряли. Но это, в общем-то, неважно. Главное можно сказать, даже смотря на эти обрывки - В общем случае обьединить два и более скетчей, в которых есть операторы delay - НЕВОЗМОЖНО.
Ну, конкретно эти можно, только мигать неравномерно будет. Но лучше пусть учится переписывать, конечно ))
Вот решение моей "проблемы", может, кому то будет полезно)
Спасибо, за нужную информацию!
#include <Wire.h> #include <BH1750.h> const int ledPin = 13; int ledState = LOW; long previousMillis = 0; long interval = 1000; BH1750 lightMeter; void setup() { Serial.begin(9600); lightMeter.begin(); pinMode(ledPin, OUTPUT); } void loop() { uint16_t lux = lightMeter.readLightLevel(); Serial.println(String(lux) + " lx"); delay(100); //задержка 100 мсек unsigned long currentMillis = millis(); if(currentMillis - previousMillis > interval) { previousMillis = currentMillis; if (ledState == LOW) { ledState = HIGH; } else { ledState = LOW; } digitalWrite(ledPin, ledState); } }Решение половинчатое. Светодиоды без делея переписали, а датчик нет.
НИЗАЧЕТ.
Вы это называете решением? Ну, да Бог Вам в помощь!
// меня повег в шок такой тупизм uint16_t lux = lightMeter.readLightLevel(); Serial.println(String(lux) + " lx"); // ну почему нельзя напасать так uint16_t lux = lightMeter.readLightLevel(); Serial.print(lux); Serial.print(" lx"); Serial.println(); // видно ну чел полный "электронщик" на голову.А вот это Вас никуда не повергло?
if (ledState == LOW) { ledState = HIGH; } else { ledState = LOW; } digitalWrite(ledPin, ledState);До полноты глубкомыслия не хватает только третью строку заменить на
} else if (ledState == HIGH) {
До полноты глубкомыслия не хватает только третью строку заменить на
Главное что не так
if (ledState == LOW) { ledState = LOW; } else { ledState = HIGH; }ПС: я бы написал так
Что вы накинулись на человека с delay, может ему нужно просто мигать и выводить показания ))
Вполне себе учебный скетч, delay() там не особо убивает:
void loop() { delay(interval); uint16_t lux = lightMeter.readLightLevel(); Serial.print(lux); Serial.print(" lx\n"); ledState = !ledState; digitalWrite(ledPin, ledState); }Конечно, когда нужно будет интервалы разные взять, тут товарищу и пригодится millis()...
PS. Про прием с digitalWrite(ledPin, millis() % n < k) в курсе.
PS. Про прием с digitalWrite(ledPin, millis() % n < k) в курсе.
Это к чему было? Как ещё один пример уёб@#$%ного программирования?
PS. Про прием с digitalWrite(ledPin, millis() % n < k) в курсе.
совсем недавно я уже писал о этом "алгоритме"
====
Приведу такой пример: допустим, вы хотите сварить яйцо. Положили в воду, поставили на огонь, дождались пока закипит - дальше надо заметить 30 секунд. На часах 14:25:15 - значит выключим плиту, когда будет больше 45 секунд. В следующий раз вы посмотрели на часы. допустим, в 14:26:04. Пора выключать или нет? - с человеческой точки зрения - несомненно. Но с точки зрения компьютера - рано, ведь вы сформулировали условие как " если число секунд больше 45".
Приведу такой пример: допустим, вы хотите сварить яйцо. Положили в воду, поставили на огонь, дождались пока закипит - дальше надо заметить 30 секунд. На часах 14:25:15 - значит выключим плиту, когда будет
...мигать не будет на коротком лупе или что - выражайтесь понятней, как ЕвгенийП, да и в моде это нынче ))
выражайтесь понятней, как ЕвгенийП,
Благодарю Вас за комплимент моей манере выражаться, но Вы не ответили на вопрос, с какой целью Вы привели эту странноватую конструкцию?
Пытаюсь объеденить два кода http://mypractic.ru/urok-26-podklyuchenie-termodatchikov-ds18b20-k-arduino-biblioteka-onewire-tochnyj-arduino-termometr-registrator.html#comment-6863 и https://arduino-ua.com/art24-vintajnii-barometr работает только градусник. По отдельности работает. Помогите кто может. Познания в програмировании минимальные
// термометр, датчик DS18B20 #include <MsTimer2.h> #include <Led4Digits.h> #include <OneWire.h> #include <Adafruit_BMP085.h> //Библиотека для датчика давления Adafruit_BMP085 press_data; //переменная для работы с датчиком byte mA = 3; int tmp; float Pmm; //для хранения показаний давления float Tc; //для хранения температуры #define POWER_MODE 0 // режим питания, 0 - внешнее, 1 - паразитное #define MEASURE_PERIOD 500 // время измерения, * 2 мс // тип индикатора 1; выводы разрядов 5,4,16,2; выводы сегментов 6,7,8,9,10,11,12,13 Led4Digits disp(1, 5,4,16,2, 6,7,8,9,10,11,12,13); OneWire sensDs (15); // датчик подключен к выводу 15 int timeCount; // счетчик времени измерения boolean flagSensReady; // признак готовности данных с датчика byte bufData[9]; // буфер данных float temperature; // измеренная температура void setup() { press_data.begin(); //подключаемся к датчику press_data.begin(); pinMode(mA, OUTPUT); MsTimer2::set(2, timerInterrupt); // задаем период прерывания по таймеру 2 мс MsTimer2::start(); // разрешаем прерывание по таймеру Serial.begin(9600); // инициализируем порт, скорость 9600 } void loop() { if ( flagSensReady == true ) { flagSensReady= false; // данные готовы if ( OneWire::crc8(bufData, 8) == bufData[8] ) { // проверка CRC // данные правильные temperature= (float)((int)bufData[0] | (((int)bufData[1]) << 8)) * 0.0625 + 0.03125; // вывод измеренной температуры на индикаторы if (temperature >= 0) { // температура положительная disp.print((int)(temperature * 10.), 4, 1); } else { // температура отрицательная disp.print((int)(temperature * -1 * 10.), 3, 1); disp.digit[3]= 0x40; // отображается минус } disp.digit[1] |= 0x80; // зажечь точку второго разряда // передача температуры на компьютер Serial.println(temperature); } else { // ошибка CRC, отображается ---- disp.digit[0]= 0x40; disp.digit[1]= 0x40; disp.digit[2]= 0x40; disp.digit[3]= 0x40; } } { Tc=press_data.readTemperature(); //читаем температуру Pmm=press_data.readPressure()/133.322; //читаем и пересчитываем давление //выводим в порт Serial.print("C= "); Serial.print(Tc); Serial.print(" P= "); Serial.println(Pmm); delay(1000); //ждем 1 секунду Pmm=map(Pmm, 700, 800, 0, 255); analogWrite(mA, Pmm); } } //-------------------------------------- обработчик прерывания 2 мс void timerInterrupt() { disp.regen(); // регенерация индикатора // управление датчиком DS18B20 паралллельным процессом timeCount++; if ( timeCount >= MEASURE_PERIOD ) { timeCount=0; flagSensReady=true; } if (timeCount == 0) sensDs.reset(); // сброс шины if (timeCount == 1) sensDs.write(0xCC, POWER_MODE); // пропуск ROM if (timeCount == 2) sensDs.write(0x44, POWER_MODE); // инициализация измерения if (timeCount == 480) sensDs.reset(); // сброс шины if (timeCount == 481) sensDs.write(0xCC, POWER_MODE); // пропуск ROM if (timeCount == 482) sensDs.write(0xBE, POWER_MODE); // команда чтения памяти датчика if (timeCount == 483 ) bufData[0]= sensDs.read(); // чтение памяти датчика if (timeCount == 484 ) bufData[1]= sensDs.read(); // чтение памяти датчика if (timeCount == 485 ) bufData[2]= sensDs.read(); // чтение памяти датчика if (timeCount == 486 ) bufData[3]= sensDs.read(); // чтение памяти датчика if (timeCount == 487 ) bufData[4]= sensDs.read(); // чтение памяти датчика if (timeCount == 488 ) bufData[5]= sensDs.read(); // чтение памяти датчика if (timeCount == 489 ) bufData[6]= sensDs.read(); // чтение памяти датчика if (timeCount == 490 ) bufData[7]= sensDs.read(); // чтение памяти датчика if (timeCount == 491 ) bufData[8]= sensDs.read(); // чтение памяти датчика }rf68, Вы не думали о том, что строки 119-127 можно заменить одной вот такой:
заменил error: expected primary-expression before '>' token
Ну очепятка, сами не видите? Сделайте правильно
Сделал. Скомпилировалось. Но выводиться только температура. Убираю прерывания работает только барометр
Ну, да, работать должно также, как и раньше. Просто одна строка вместо восьми - я только об этом говорил.
Ну так разделите во времени. Перерывание работает одну секунду. Разрешите таймер. Подождите секунду. Запретите таймер, прочитайте барометр. И по кругу.
Разделить по времени это добавить в
voidtimerInterrupt данные с барометра (press_data)? Простите, если вопрос глупыйСделал. Скомпилировалось. Но выводиться только температура. Убираю прерывания работает только барометр
Не надо убирать прерывание. Надо его приостановить на время пока читается барометр. В библиотеке есть команда остановить таймер. После чтения барометра запустить снова.
Внутрь прерывания ничего не надо вставлять.
ЭЭх....
не очень понимаю, что вы вообще пытаетесь сделать , но помоему ковыряете не то.
Зачем эти многократные MsTimer2::start(); MsTimer2::stop(); в сетапе, это надо делать в основном коде перед и после измерения давления.
И я бы посоветовал период таймера взять нормальный - вряд ли вам реально надо мерять температуру каждые 2 миллисекунды - да и не получится это, цикл измерения занимает в сотни раз дольше. Поставьте задержку таймера секунд 30 (секунд! а не миллисекунд) для начала. а потом в реальности можно и раз несколько минут сделать.
Не прошло и полгода из далёкой восточной республики пришла новая ардуина.
{ MsTimer2::stop(); Tc=press_data.readTemperature(); //читаем температуру Pmm=press_data.readPressure()/133.322; //читаем и пересчитываем давление Pmm=map(Pmm, 700, 800, 0, 255); analogWrite(mA, Pmm); MsTimer2::start(); }так не заработало.
2 милисикунды таймера, наверное нужны для динамической индикации?...
Полгода назад я вам написал "я не понимаю, что вы пытаетесь сделать" - с тех пор ничего не изменилось.