Спасибо, но проводами не интересно. Как датчик приедет, я его конечно проводами испытаю, но все-таки по воздуху интереснее. Если Вы знаете, что есть "что-то менее прожорливое", но при этом и такое же приемлемо-точное как BME280, не стоит в 10 раз дороже, может подскажите где купить?
nRF24 без проводов к МК пока не прикрутить никак. Да и любой трансивер пока только проводами подключается к МК.
nRF24 по проводам? Это как? Коаксиальным фидером их будешь соединять? Интересный ход. Будешь пионером!
я сам в поисках. Пришел к выводу, что аналоговые датчики это мастхэв. Замер у МК длится 15 мкс, плюс какое-то время надо подождать на переходной процесс. Но это все равно выгоднее, чем датчик с цифровым интерфейсом.
"Без проводов никак", "с проводами это как?" Где-то не правильно высказались. Малина + nrf24 -> воздух <- nrf24 + bme280 - у вас так? я примерно так и думал делать, но только два датчика температуры. аккум в доме, питание по проводу на улицу, где темп.датчик + вифи/радио модуль
я могу неправильно высказаться, но не написать, ибо обязательно перечитываю сообщение перед отправкой. зачем? У меня 123 батарейка прекрасно перенесла морозы в прошлую зиму. у меня 328 камень с DS18B20 и nrf24 от 123 батарейки живет на балконе. Это очень неудачное решение и вскоре отпишусь почему. Рядом с роутером живет малинка также с nRF24. Если интересно, то код с малинки могу выложить. Хорошее подспорье для старта, ибо сам когда начинал собирал по крупицам. В сети один ШЛАК.
328 камень это Атмега? Сначала не понял что за 328, и гугль первой ссылкой выдал https://devicter.ru/goods/Sensor-Node-V3?from=MmY5 - тут вообще "имеет питание от солнечной панели и в место батарейки используется ионистр" , но дороговато. Идею понял, спасибо за конкретику, поизучаю DS18B20 - не натыкался я на него до этого момента. Код интересно посмотреть, пришлите пожалуйста.
Ну, согласитесь, я не так масштабен За этой невероятной историей следит весь форум Реально. Даже фото видели. Код - нет. С начала рассказов об этом необыкновенном устройстве его уже раза три можно было написать, даже на ассемблере. Это только датчик температуры. Начинающим, обычно нужны (жизненно необходимы!) влажность и давление. Если температуры все таки достаточно - выкиньте его за окно одного на трех проводах. Там шина 1Wire, а она длиииииинная... Хоть всю квартиру обмотай.
я присматривался к этой шняге. Но это шняга. Я свою сделаю. Лучше в разы. Мде? Не знал. Но для батарейки он не канает - много жрет. будет ещё лучше!
parovoZZ я Вас вообще перестал понимать. Сначала вы говорите что DS18B20 у Вас имеется и работает на балконе от батарейки, после чего я изучаю и говорю что это датчик температуры, а Вы в ответ, что не знали этого и для батарейки он не канает - жрет много. Пусть так, но мне нужна влажность. Нужна правда внутри квартиры, но для некоторой статистики пусть будет и на улице.
Вот код для малинки Код (C++): #include <cstdlib> #include <iostream> #include <fstream> #include <time.h> #include <RF24/RF24.h> #define nRF_SEND_LEN 11 #define interruptPin RPI_V2_GPIO_P1_29 using namespace std; typedef struct { uint8_t id; // 1 byte uint16_t temperature; // 2 byte uint16_t pressure; // 2 byte uint8_t humidity; // 1 byte uint8_t rain; // 1 byte uint8_t solar; // 1 byte uint8_t wind; // 1 byte uint8_t direction_w; // 1 byte uint8_t _error; // 1 byte } payload; // 11 byte // gpio pins, spi speed RF24 radio(RPI_V2_GPIO_P1_22, RPI_V2_GPIO_P1_24, BCM2835_SPI_SPEED_8MHZ); void getWeather(uint8_t Buf[nRF_SEND_LEN]) { float temperature; // bool listen = 1; payload receivePayload; const time_t curTime = time(NULL); receivePayload.id = Buf[0]; receivePayload.temperature = (uint16_t)Buf[2]; receivePayload.temperature = ((receivePayload.temperature << 8) & 0xff00) | (uint16_t)Buf[1]; receivePayload.pressure = (uint16_t)Buf[4]; receivePayload.pressure = ((receivePayload.pressure << 8) & 0xff00) | (uint16_t)Buf[3]; receivePayload.humidity = Buf[5]; receivePayload.rain = Buf[6]; receivePayload.solar = Buf[7]; receivePayload.wind = Buf[8]; receivePayload.direction_w = Buf[9]; receivePayload._error = Buf[10]; if (receivePayload.temperature & 0xf800){ receivePayload.temperature = ~(receivePayload.temperature)+1; temperature = 0 - (float)receivePayload.temperature / 16.0; } else { temperature = (float)receivePayload.temperature / 16.0; } printf("%s", ctime(&curTime)); printf("0=%x, 1=%x, 2=%x, 3=%x, 4=%x, 5=%x, 6=%x, 7=%x, 8=%x, 9=%x, 10=%x\n", Buf[0], Buf[1], Buf[2], Buf[3], Buf[4], Buf[5], Buf[6], Buf[7], Buf[8], Buf[9], Buf[10]); printf("id=%d, temperature=%f, error=%d\n", receivePayload.id, temperature, receivePayload._error); printf("\n"); ofstream out("/home/pi/Weather"); out << "time" << ctime(&curTime) << "\n"; out << "ID = " << receivePayload.id*1 << "\n"; out << "temperature = " << temperature << "\n"; out << "humidity = " << receivePayload.humidity*1 << "\n"; out << "pressure = " << receivePayload.pressure << "\n"; out << "solar = " << receivePayload.solar*1 << "\n"; out << "wind = " << receivePayload.wind*1 << "\n"; out << "direction = " << receivePayload.direction_w*1 << "\n"; out << "rain = " << receivePayload.rain*1 << "\n"; out << "text = " << receivePayload._error*1 << "\n"; out.close (); } void intHandler() { uint8_t pipe_num=0; uint8_t Buf[nRF_SEND_LEN]; bool tx_ok, tx_fail, rx; radio.whatHappened(tx_ok, tx_fail, rx); if (radio.available(&pipe_num)){ memset(Buf, 0, nRF_SEND_LEN); radio.read(Buf, nRF_SEND_LEN); switch (Buf[0]){ case 222: getWeather(Buf); break; } radio.stopListening(); radio.startListening(); } } int main(int argc, char** argv) { radio.begin(); radio.setPALevel(RF24_PA_MAX); radio.setDataRate(RF24_1MBPS); radio.setCRCLength(RF24_CRC_8); radio.setRetries(15, 15); radio.setAutoAck(1); radio.setChannel(125); radio.setPayloadSize(nRF_SEND_LEN); radio.openWritingPipe(0x1111111111LL); radio.openReadingPipe(1,0x1111111110LL); radio.openReadingPipe(2,0x1111111111LL); radio.openReadingPipe(3,0x1111111112LL); radio.openReadingPipe(4,0x1111111113LL); radio.openReadingPipe(5,0x1111111114LL); //radio.maskIRQ(0, 0, 1); radio.startListening(); radio.printDetails(); attachInterrupt(interruptPin, INT_EDGE_FALLING, intHandler); while (1) { delay(100); } } Был написан за пару вечеров за бутылочкой и впоследствии заброшен. Поэтому комментариев нет. Код рабочий, но не правильный. Для старта пойдет)) Структура пакета, которую отправляет передатчик, такая uint8_t id; // 1 byte uint16_t temperature; // 2 byte uint16_t pressure; // 2 byte uint8_t humidity; // 1 byte uint8_t rain; // 1 byte uint8_t solar; // 1 byte uint8_t wind; // 1 byte uint8_t direction_w; // 1 byte uint8_t _error; // 1 byte Всего 11 байт при 32 максимальных. Посылает только температуру))