#1 Re: Програмування Arduino » Не завантажується скетч » 2024-07-19 12:49:05

Не можу завантажити скетч на promini на процесорі atmel mega168pa. Помилка:
"Сталася помилка при вивантаженні скетча
avrdude error: cannot open port \.COM6: A device which does not exist was specified.
avrdude error: unable to open programmer urclock on port COM6".
Програма Arduino IDE 1.8.19. Windows 10.
Програматор:USB-TTL UART перехідник на PL2303HX. (пишуть що чіп встановлений у цьому адаптері не підтримується операційними системами Windows 8.1 та Windows 10).
Порадьте що можна зробити.

#2 Re: Програмування Arduino » Не завантажується скетч » 2024-07-19 09:37:07

г0cть пише:

Не знаю чи є така фішка у версії IDE 2.1, оскільки нею майже не користуюсь, тому візміть версію 1,8,19 і оберіть там Old bootloader

Підкажіть а де там "Old bootloader"? Щось не можу знайти.

#3 Re: Апаратні питання » DHT11 помилка читання. » 2023-10-06 10:40:30

гоcть пише:

Нарисуйте схему, как и что у Вас подключено (в т.ч. и экран)

Тяжкого просите. 3 датчика DHT11, 11 MH-Z19b, до Mega 2560. Також 2 релє 4, 8 каналів.

#4 Re: Апаратні питання » DHT11 помилка читання. » 2023-10-06 10:37:57

Honey пише:

Якщо потрібно підключити датчик вологості на великій відстані (100м і навіть 300м), подивіться ось цей мій варіант:
https://github.com/honechko/DS2450/tree … amples/SPI
Там bme680 підключається по 1-wire, є приклад коду для зчитування на Ардуіно.
Той однодротовий інтерфейс, який використовується в датчиках типу DHT11, AM2320 і подібних, це не Maxim/Dallas 1-wire, він менш завадозахищений.
Доречі, якраз сьогодні спаяв ще один такий датчик)
https://forum.arduino.ua/img/members/2940/front2.jpg
Згодом напишу і викладу коротеньку статтю про виготовлення і підключення до Linux. Там підключення в одну стрічку:
# echo 0 bme680 >/sys/devices/w1_bus_master1/20-594e480f4245/spi_bind
# cat /sys/devices/w1_bus_master1/20-594e480f4245/spi_master/spi0/spi0.0/iio:device0/in_humidityrelative_input
37.518000000
# cat /sys/devices/w1_bus_master1/20-594e480f4245/spi_master/spi0/spi0.0/iio:device0/in_temp_input             
25560
# cat /sys/devices/w1_bus_master1/20-594e480f4245/spi_master/spi0/spi0.0/iio:device0/in_pressure_input         
999.640000000

Підключаю на ~4-10м.

#5 Re: Апаратні питання » DHT11 помилка читання. » 2023-10-06 10:36:54

г0cть пише:
ivvi30 пише:

кабель екранований

І заземлений?

Пробував і одного з них заземляв. Проблема як на мене напевне в контактах підключення до ардуіни чи й сам не знаю що ще може бути. Бо щось поперепідключаю поворушу, і працює. Побачимо як стабільно це буде працювати.

#6 Re: Проекти » Mh-z19b проблеми з відображенням ppm. » 2023-10-06 10:26:46

Не можу під'єднати на мегу2560 більше 1 датчика mhz19b по каналу pwm(тільки на 5 піні працює, перепробував від 2 до 15, А0-А1 пінів не працює), тому прийдеться підключати по аналоговому каналу.
Але і тут виникла проблема, під'єднав всі датчики від А1-А11. Для тесту в скетчі вписав тільки А1, А2. Але коли подую на 1 датчик на другому також зростають показники приблизно одинаково. В чому проблема? Що не так?

int analogPin1 = A1;  // Пін для першого датчика MH-Z19B
int analogPin2 = A2;  // Пін для другого датчика MH-Z19B

unsigned long previousMillis = 0;
const unsigned long interval = 5000;  // Інтервал виведення в мілісекундах

void setup() {
  pinMode(analogPin1, INPUT); // Налаштовуємо пін A1 як вхід
  pinMode(analogPin2, INPUT); // Налаштовуємо пін A2 як вхід
  Serial.begin(9600);
}

void loop() {
  unsigned long currentMillis = millis();

  // Зчитування значення PPM з першого датчика на A1
  int rawValue1 = analogRead(analogPin1);
  unsigned int ppm1 = map(rawValue1, 0, 1023, 400, 2000);  // Діапазон 400-2000 PPM

  // Зчитування значення PPM з другого датчика на A2
  int rawValue2 = analogRead(analogPin2);
  unsigned int ppm2 = map(rawValue2, 0, 1023, 400, 2000);  // Діапазон 400-2000 PPM

  // Перевірка інтервалу для виведення в серійний порт
  if (currentMillis - previousMillis >= interval) {
    // Виведення значень PPM у серійний порт
    Serial.print(ppm1);
    Serial.print(" ");
    Serial.println(ppm2);

    previousMillis = currentMillis;
  }
}

mhz19b.jpg

#7 Re: Проекти » Mh-z19b проблеми з відображенням ppm. » 2023-10-05 14:35:15

#include <MHZ.h>

#define CO2_SENSOR_PIN 5

MHZ co2Sensor(CO2_SENSOR_PIN, MHZ19B, RANGE_2K);

unsigned long previousMillis = 0;
const unsigned long interval = 5000;  // Затримка 5 секунд

const int maxSavedCO2Readings = 30;
int savedCO2Readings[maxSavedCO2Readings];
int savedCO2Index = 0;
int lastValidCO2 = 0;

void setup() {
  Serial.begin(9600);
  pinMode(CO2_SENSOR_PIN, INPUT); // Налаштовуємо пін CO2 датчика на вхід
}
Чому 

void loop() {
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;

    int co2Level = co2Sensor.readCO2PWM();  // Отримуємо рівень CO2

    if (isValidCO2Level(co2Level)) {
      lastValidCO2 = co2Level;
      saveCO2Reading(co2Level);
    }

    // Виводимо останнє дійсне значення CO2 в серійний порт
    Serial.println(lastValidCO2);
  }
}

bool isValidCO2Level(int co2Level) {
  return (co2Level >= 400 && co2Level <= 2000);
}

void saveCO2Reading(int co2Level) {
  savedCO2Readings[savedCO2Index] = co2Level;
  savedCO2Index = (savedCO2Index + 1) % maxSavedCO2Readings;
}

int getValidCO2Level() {
  return lastValidCO2;
}

Чому міняю з піна 5 на 6,7,8 і значення завжди 0?

#8 Re: Апаратні питання » DHT11 помилка читання. » 2023-10-01 15:57:46

Перекладена цитата з даташиті:"У типовій схемі застосування рекомендується використовувати навантажувальний резистор 4,7 К, якщо довжина з’єднувальної лінії коротша за 5 м. Якщо довжина навантажувального резистора перевищує 5 м, зменшіть опір навантажувального резистора відповідно до реальної ситуації." У мене на одному датчику резистор ~5к довжина кабеля~4-5м, на інших двох 10к довжина кабелю 5-10м. Контролер з Китаю Мега2560. Крім цього ще 11 датчиків Mh-z19b підключено. Закрадається думки про навідні магнітні поля, але кабель екранований, і датчикі не аналогові, а цифрові.

#9 Re: Апаратні питання » DHT11 помилка читання. » 2023-10-01 13:48:57

Справа в тім, що -(мінус живлення) датчика має бути спільним з платою Ардуіно.
Хоча датчик підключений кабелем FTP(витою екранованою парою) і з резистором 5-10к і конденсатором 0,1мФ довжина кабелю 4-7м все одно іноді чомусь іноді датчики не зчитують вологість.

#10 Re: Проекти » Mh-z19b проблеми з відображенням ppm. » 2023-09-29 14:52:23

ivvi30 пише:

Виникла ще одна проблема. Частина датчиків були куплені в одному інтернет-магазині в Україні і інші в іншому, так як в попередньому не вистачило кілька штук. І на датчиках різниця тільки в заявленому(написаному на них) діапазоні 0-5000ppm s 400-5000ppm. Два датчика підключені по pwm, лежать один біля одного, а різниця в показниках дуже різниця 850 і 2350 ppm. В чому може бути причина?

Причина була в калібровці. Хоч на датчику написано 5000, по факту 2000.

#11 Re: Проекти » Mh-z19b проблеми з відображенням ppm. » 2023-09-29 11:40:17

Виникла ще одна проблема. Частина датчиків були куплені в одному інтернет-магазині в Україні і інші в іншому, так як в попередньому не вистачило кілька штук. І на датчиках різниця тільки в заявленому(написаному на них) діапазоні 0-5000ppm s 400-5000ppm. Два датчика підключені по pwm, лежать один біля одного, а різниця в показниках дуже різниця 850 і 2350 ppm. В чому може бути причина?

#12 Re: Проекти » Mh-z19b проблеми з відображенням ppm. » 2023-09-29 10:28:51

Розібрався невірний код був.
Ось що виправив:

int ppm_pwm1 = co21.readCO2PWM();

#13 Проекти » Mh-z19b проблеми з відображенням ppm. » 2023-09-29 10:07:06

ivvi30
відповідей: 6

Хочу підключити кілька датчиків Mh-z19b(датчики купував у одного продавця, ніби одинакові) до mega2560 для керування вентиляторами в будинку. Проблема полягає в тому, що підключивши 2 датчика на пін 2 і 3 для мене показалось що покази приблизно одинакові і фізично відключивши один, показники СО2 приблизно дублюються на іншому піні. Більше того коли подую на один датчик на другому також автоматично піднімається рівень СО2(навіть коли він фізично відключений від 3 піну). Використовував pwm(цифровий вихід) канал зв'язку на датчику, також бібліотеку MHZ.h.

#include <MHZ.h>

// pin for pwm reading
#define CO2_IN 2
#define CO2_IN1 3

MHZ co2(CO2_IN, MHZ19B);
MHZ co21(CO2_IN1, MHZ19B, RANGE_2K);

void setup() {
  Serial.begin(9600);
  pinMode(CO2_IN, INPUT);
  pinMode(CO2_IN1, INPUT);
    delay(100);
}

void loop() {
  int ppm_pwm = co2.readCO2PWM();
  Serial.println(ppm_pwm);
  int ppm_pwm1 = co2.readCO2PWM();
  Serial.println(ppm_pwm1);
 
 delay(5000);
}

Питання: Як позбутися цього дублювання і чому це так стається?

#14 Re: Апаратні питання » DHT11 помилка читання. » 2023-09-28 11:28:53

г0cть пише:

Резистор подтяжки между data и питанием есть?

Ставив і резистор 10к і щось нічого не допомогло.

#15 Re: Апаратні питання » DHT11 помилка читання. » 2023-09-27 16:04:45

г0cть пише:
ivvi30 пише:

на довжині кабеля 20м. У мене ~4-5м

А як він себе веде на столі? DHT11 самий г-й датчик

На макетній платі працює ніби добре.

#16 Апаратні питання » DHT11 помилка читання. » 2023-09-27 13:10:57

ivvi30
відповідей: 15

Вітаю. Хочу зробити проєкт на датчиках DHT11 і MH-z19b. Проблема в тому що з датчиків DHT11 не можу зчитати вологість(температура мало важлива). Купував у Китаї, купував і на Аадуіно.юа, і з резистором і без, не зчитується вологість. На бібліотеці DHT.h іноді показує якісь неправдиві показники рідко раз в 10-60с і різнились 10% через 30с-60с може 80% бути. В даташиті Asair dht11 пишіть що можуть працювати і на довжині кабеля 20м. У мене ~4-5м FTP(вита пара) 8 жил, +, -, і на один на data(думав можливо січення мале, додавав спаював 2-6 жил, нічого не допомогло. Не можу зрозуміти в чому справа. Думав наводки але 1 це цифровий датчик, 2 є один провід до якого під'єднаний тільки 1 датчик DHT11.

#include <DHT.h>

#define DHTPIN_1 2
#define DHTTYPE DHT11

DHT dht_vanna_1p(DHTPIN_1, DHTTYPE);

#define FAN_PIN_1 22 // Пін для управління vent_vanna_1p

bool fanState_1 = false;

unsigned long lastHumidityCheckTime_1 = 0;
unsigned long lastHumidityPrintTime = 0;

unsigned long lastFanOffTime_1 = 0;

const int maxSavedHumidityReadings = 30;
int savedHumidityReadings_1[maxSavedHumidityReadings];
int savedHumidityIndex_1 = 0;

int lastValidHumidity_1 = 0;

const unsigned long humidityCheckInterval = 5000;
const unsigned long fanOffDelay = 60000;
const int minHumidity = 5;
const int maxHumidity = 95;

void setup() {
  Serial.begin(9600);
  delay(3000); // Затримка 3 секунди при першому завантаженні
  dht_vanna_1p.begin();

  pinMode(FAN_PIN_1, OUTPUT);

  digitalWrite(FAN_PIN_1, HIGH);
}

void loop() {
  unsigned long currentMillis = millis();

  // Перевіряємо вологість для vent_vanna_1p
  if (currentMillis - lastHumidityCheckTime_1 >= humidityCheckInterval) {
    lastHumidityCheckTime_1 = currentMillis;
    int humidity_1 = round(dht_vanna_1p.readHumidity());

    if (!isnan(humidity_1) && humidity_1 >= minHumidity && humidity_1 <= maxHumidity) {
      lastValidHumidity_1 = humidity_1;
      saveHumidityReading(savedHumidityReadings_1, savedHumidityIndex_1, humidity_1);

      if (currentMillis - lastHumidityPrintTime >= 10000) {
        Serial.print("Вологість vent_vanna_1p: ");
        Serial.print(humidity_1);
        Serial.println(" %");
        lastHumidityPrintTime = currentMillis;
      }

      if (humidity_1 > 65 && !fanState_1) {
        digitalWrite(FAN_PIN_1, LOW);
        fanState_1 = true;
      } else if (humidity_1 <= 65 && fanState_1 && currentMillis - lastFanOffTime_1 >= fanOffDelay) {
        digitalWrite(FAN_PIN_1, HIGH);
        fanState_1 = false;
        lastFanOffTime_1 = currentMillis;
      }
    } else {
      Serial.println("Помилка зчитування вологості vent_vanna_1p! Використовуємо останнє дійсне значення: " + String(lastValidHumidity_1) + " %");
      humidity_1 = getLastValidHumidity(savedHumidityReadings_1, savedHumidityIndex_1);
      lastValidHumidity_1 = humidity_1;
    }
  }
}

void saveHumidityReading(int readings[], int &index, int humidity) {
  readings[index] = humidity;
  index = (index + 1) % maxSavedHumidityReadings;
}

int getLastValidHumidity(int readings[], int index) {
  int sum = 0;
  int count = 0;

  for (int i = 0; i < maxSavedHumidityReadings; i++) {
    if (readings[i] >= minHumidity && readings[i] <= maxHumidity) {
      sum += readings[i];
      count++;
    }
  }

  if (count > 0) {
    return sum / count;
  } else {
    return 0;
  }
}

Підвал форуму