Ви не увійшли.
Сторінки 1
Не можу завантажити скетч на 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).
Порадьте що можна зробити.
Не знаю чи є така фішка у версії IDE 2.1, оскільки нею майже не користуюсь, тому візміть версію 1,8,19 і оберіть там Old bootloader
Підкажіть а де там "Old bootloader"? Щось не можу знайти.
Нарисуйте схему, как и что у Вас подключено (в т.ч. и экран)
Тяжкого просите. 3 датчика DHT11, 11 MH-Z19b, до Mega 2560. Також 2 релє 4, 8 каналів.
Якщо потрібно підключити датчик вологості на великій відстані (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м.
ivvi30 пише:кабель екранований
І заземлений?
Пробував і одного з них заземляв. Проблема як на мене напевне в контактах підключення до ардуіни чи й сам не знаю що ще може бути. Бо щось поперепідключаю поворушу, і працює. Побачимо як стабільно це буде працювати.
Не можу під'єднати на мегу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;
}
}
#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?
Перекладена цитата з даташиті:"У типовій схемі застосування рекомендується використовувати навантажувальний резистор 4,7 К, якщо довжина з’єднувальної лінії коротша за 5 м. Якщо довжина навантажувального резистора перевищує 5 м, зменшіть опір навантажувального резистора відповідно до реальної ситуації." У мене на одному датчику резистор ~5к довжина кабеля~4-5м, на інших двох 10к довжина кабелю 5-10м. Контролер з Китаю Мега2560. Крім цього ще 11 датчиків Mh-z19b підключено. Закрадається думки про навідні магнітні поля, але кабель екранований, і датчикі не аналогові, а цифрові.
Справа в тім, що -(мінус живлення) датчика має бути спільним з платою Ардуіно.
Хоча датчик підключений кабелем FTP(витою екранованою парою) і з резистором 5-10к і конденсатором 0,1мФ довжина кабелю 4-7м все одно іноді чомусь іноді датчики не зчитують вологість.
Виникла ще одна проблема. Частина датчиків були куплені в одному інтернет-магазині в Україні і інші в іншому, так як в попередньому не вистачило кілька штук. І на датчиках різниця тільки в заявленому(написаному на них) діапазоні 0-5000ppm s 400-5000ppm. Два датчика підключені по pwm, лежать один біля одного, а різниця в показниках дуже різниця 850 і 2350 ppm. В чому може бути причина?
Причина була в калібровці. Хоч на датчику написано 5000, по факту 2000.
Виникла ще одна проблема. Частина датчиків були куплені в одному інтернет-магазині в Україні і інші в іншому, так як в попередньому не вистачило кілька штук. І на датчиках різниця тільки в заявленому(написаному на них) діапазоні 0-5000ppm s 400-5000ppm. Два датчика підключені по pwm, лежать один біля одного, а різниця в показниках дуже різниця 850 і 2350 ppm. В чому може бути причина?
Розібрався невірний код був.
Ось що виправив:
int ppm_pwm1 = co21.readCO2PWM();
Хочу підключити кілька датчиків 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);
}
Питання: Як позбутися цього дублювання і чому це так стається?
Резистор подтяжки между data и питанием есть?
Ставив і резистор 10к і щось нічого не допомогло.
ivvi30 пише:на довжині кабеля 20м. У мене ~4-5м
А як він себе веде на столі? DHT11 самий г-й датчик
На макетній платі працює ніби добре.
Вітаю. Хочу зробити проєкт на датчиках 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;
}
}
Сторінки 1