Помогите объединить два скетча

Alexander_1
Offline
Зарегистрирован: 10.08.2017

Здравствуйте!Недавно только заинтересовался 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);

 

b707
Offline
Зарегистрирован: 26.05.2017

Вы при вставке кода половину строк потеряли. Но это, в общем-то, неважно. Главное можно сказать, даже смотря на эти обрывки - В общем случае обьединить два и более скетчей, в которых есть операторы delay - НЕВОЗМОЖНО.

Чтобы обойти эту проблему, необходимо переписать оба скетча без этого оператора. КАК - описаний в инете полно, ищите "блинк без делей".

Alexander_1
Offline
Зарегистрирован: 10.08.2017

Спасибо!

Alexander_1
Offline
Зарегистрирован: 10.08.2017

Пфф..В интернете молоток но мало толку! Так, чтоб что нибудь написать..!?

b707
Offline
Зарегистрирован: 26.05.2017

Вот - почитайте - по-русски.

http://arduino.ru/tutorials/BlinkWithoutDelay

Если не поймете - читайте сначала. Если не сможете этого понять - вы безнадежны....

Когда сможете что-то написать - приходите, поможем.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Давненько такой темы не было Помогите объединить два скетча . Самое удивительное камень падает в ту же воронку - delay

sadman41
Offline
Зарегистрирован: 19.10.2016

b707 пишет:

Вы при вставке кода половину строк потеряли. Но это, в общем-то, неважно. Главное можно сказать, даже смотря на эти обрывки - В общем случае обьединить два и более скетчей, в которых есть операторы delay - НЕВОЗМОЖНО.

Ну, конкретно эти можно, только мигать неравномерно будет. Но лучше пусть учится переписывать, конечно ))

Alexander_1
Offline
Зарегистрирован: 10.08.2017

Вот решение моей "проблемы", может, кому то будет полезно)

Спасибо, за нужную информацию!

#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);
    }
}

 

 

b707
Offline
Зарегистрирован: 26.05.2017

Решение половинчатое. Светодиоды без делея переписали, а датчик нет.

НИЗАЧЕТ.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы это называете решением? Ну, да Бог Вам в помощь!

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
// меня повег в шок такой тупизм
uint16_t lux = lightMeter.readLightLevel();
Serial.println(String(lux) + " lx");
// ну почему нельзя напасать так
uint16_t lux = lightMeter.readLightLevel();
Serial.print(lux);
Serial.print(" lx");
Serial.println();
// видно ну чел полный "электронщик" на голову.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

qwone пишет:

// меня повег в шок такой тупизм

А вот это Вас никуда не повергло?

        if (ledState == LOW) {
            ledState = HIGH;
        } else {
            ledState = LOW;
        }
        
        digitalWrite(ledPin, ledState);

До полноты глубкомыслия не хватает только третью строку заменить на 

} else if (ledState == HIGH) {

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ЕвгенийП пишет:

До полноты глубкомыслия не хватает только третью строку заменить на 

Главное что не так

if (ledState == LOW) {
  ledState = LOW;
} else {
  ledState = HIGH;
}

ПС: я бы написал так

 digitalWrite(ledPin, ledState=!ledState);

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Что вы накинулись на человека с 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) в курсе.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41 пишет:

PS. Про прием с digitalWrite(ledPin, millis() % n < k) в курсе.

Это к чему было? Как ещё один пример уёб@#$%ного программирования?

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:

PS. Про прием с digitalWrite(ledPin, millis() % n < k) в курсе.

совсем недавно я уже писал о этом "алгоритме"

====

Приведу такой пример: допустим, вы хотите сварить яйцо. Положили в воду, поставили на огонь, дождались пока закипит - дальше надо заметить 30 секунд. На часах 14:25:15 - значит выключим плиту, когда будет больше 45 секунд. В следующий раз вы посмотрели на часы. допустим, в 14:26:04. Пора выключать или нет? - с человеческой точки зрения - несомненно. Но с точки зрения  компьютера - рано, ведь вы сформулировали условие как " если число секунд больше 45".

sadman41
Offline
Зарегистрирован: 19.10.2016

b707 пишет:

Приведу такой пример: допустим, вы хотите сварить яйцо. Положили в воду, поставили на огонь, дождались пока закипит - дальше надо заметить 30 секунд. На часах 14:25:15 - значит выключим плиту, когда будет

...мигать не будет на коротком лупе или что - выражайтесь понятней, как ЕвгенийП, да и в моде это нынче ))

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41 пишет:

выражайтесь понятней, как ЕвгенийП,

Благодарю Вас за комплимент моей манере выражаться, но Вы не ответили на вопрос, с какой целью Вы привели эту странноватую конструкцию?

rf68
Offline
Зарегистрирован: 26.02.2017

  Пытаюсь объеденить два кода 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();  // чтение памяти датчика     
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

rf68, Вы не думали о том, что строки 119-127 можно заменить одной вот такой:

 if (timeCount => 483 && timeCount <= 491) bufData[timeCount - 483 ] = sensDs.read();

 

rf68
Offline
Зарегистрирован: 26.02.2017

заменил    error: expected primary-expression before '>' token

 
 
 
 
 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну очепятка, сами не видите? Сделайте правильно

if (timeCount >= 483 && timeCount <= 491) bufData[timeCount - 483 ] = sensDs.read();

 

rf68
Offline
Зарегистрирован: 26.02.2017

Сделал. Скомпилировалось. Но выводиться только температура. Убираю прерывания работает только барометр

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, да, работать должно также, как и раньше. Просто одна строка вместо восьми - я только об этом говорил.

nik182
Offline
Зарегистрирован: 04.05.2015

Ну так разделите во времени. Перерывание работает одну секунду. Разрешите таймер. Подождите секунду. Запретите таймер, прочитайте барометр. И по кругу.

rf68
Offline
Зарегистрирован: 26.02.2017

Разделить по времени это добавить в void  timerInterrupt данные с барометра (press_data)? Простите, если вопрос глупый

nik182
Offline
Зарегистрирован: 04.05.2015

rf68 пишет:

Сделал. Скомпилировалось. Но выводиться только температура. Убираю прерывания работает только барометр


Не надо убирать прерывание. Надо его приостановить на время пока читается барометр. В библиотеке есть команда остановить таймер. После чтения барометра запустить снова.
Внутрь прерывания ничего не надо вставлять.

rf68
Offline
Зарегистрирован: 26.02.2017
void setup() {
  press_data.begin();     //подключаемся к датчику
  
   press_data.begin(); 
 
  pinMode(mA, OUTPUT);    
 Serial.begin(9600); // инициализируем порт, скорость 9600 
 MsTimer2::stop() 
  MsTimer2::set(2, timerInterrupt); // задаем период прерывания по таймеру 2 мс 
  MsTimer2::start();               // разрешаем прерывание по таймеру
   MsTimer2::stop() 
MsTimer2::set(1, timerInterrupt); // задаем период прерывания по таймеру 2 мс 
 
 
}
 в правильном направлении ковыряю?
rf68
Offline
Зарегистрирован: 26.02.2017

ЭЭх....

 

b707
Offline
Зарегистрирован: 26.05.2017

rf68 пишет:

 в правильном направлении ковыряю?

не очень понимаю, что вы вообще пытаетесь сделать , но помоему ковыряете не то.

Зачем эти многократные MsTimer2::start();   MsTimer2::stop(); в сетапе, это надо делать в основном коде перед и после измерения давления.

И я бы посоветовал период таймера взять нормальный - вряд ли вам реально надо мерять температуру каждые 2 миллисекунды - да и не получится это, цикл измерения занимает в сотни раз дольше. Поставьте задержку таймера секунд 30 (секунд! а не миллисекунд) для начала. а потом в реальности можно и раз несколько минут сделать.

rf68
Offline
Зарегистрирован: 26.02.2017

Не прошло и полгода из далёкой восточной республики пришла новая ардуина.

{
  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 милисикунды таймера, наверное нужны для динамической индикации?...

b707
Offline
Зарегистрирован: 26.05.2017

Полгода назад я вам написал "я не понимаю, что вы пытаетесь сделать" - с тех пор ничего не изменилось.