В этой статье подключим датчики DHT11 и DHT22 к Raspberry Pi, а точнее к Orange Pi PC, так как эта плата у меня есть. В принципе это не имеет значения, потому что ниже приведённые библиотеки и примеры запустятся и на Banana Pi, Odroid и NanoPi. Это что касается примеров на Java, использующие библиотеки Pi4J. А примеры на C/C++ можно запустить на все платы, на которые можно установить WiringPi.
Я раньше писал о популярных датчиках влажности и температуры DHT11 и DHT22 в статье Датчики температуры и влажности DHT11 и DHT22. Там же и документация по DHT11 и DHT22.
За основу использовалась библиотека от Adafruit — одна из стабильных версий, найденных мною в Интернете. Это Python библиотека для чтения данных с датчиков влажности и температуры DHT серии на Raspberry Pi и Beaglebone Black. Однако для чтения данных непосредственно с датчика используется язык программирования C, чтобы уменьшить вероятность ошибки во время чтения.
Библиотека C/C++
Изначально планировал сделать только на Java, так как это серия уроков по Pi4J, но решил сделать библиотеку и на C/C++, чтобы не писать отдельную статью.
DHTxx.h
#ifndef DHTXX_H_ #define DHTXX_H_ #include <stdint.h> /* * Define errors and return values. */ #define DHT_ERROR_TIMEOUT -1 #define DHT_ERROR_CHECKSUM -2 #define DHT_ERROR_ARGUMENT -3 #define DHT_ERROR_GPIO -4 #define DHT_SUCCESS 0 /* * Define sensor types. */ #define DHT11 11 #define DHT22 22 #define AM2302 22 /** * This is the only processor specific magic value, the maximum amount of time to * spin in a loop before bailing out and considering the read a timeout. This should * be a high value, but if you're running on a much faster platform than a Raspberry * Pi or Beaglebone Black then it might need to be increased. */ #define DHT_MAXCOUNT 32000 /** * Number of bit pulses to expect from the DHT. Note that this is 41 because * the first pulse is a constant 50 microsecond pulse, with 40 pulses to represent * the data afterwards. */ #define DHT_PULSES 41 class DHTxx { private: int pin; int sensor; public: DHTxx(int pin, int sensor); virtual ~DHTxx(); int init(); /** * Read DHT sensor connected to GPIO pin (using BCM numbering). Humidity and temperature will be * returned in the provided parameters. If a successfull reading could be made a value of 0 * (DHT_SUCCESS) will be returned. If there was an error reading the sensor a negative value will * be returned. Some errors can be ignored and retried, specifically DHT_ERROR_TIMEOUT or DHT_ERROR_CHECKSUM. */ int read(float* humidity, float* temperature); int getPin() const; void setPin(int pin); int getSensor() const; void setSensor(int sensor); private: /** * Busy wait delay for most accurate timing, but high CPU usage. * Only use this for short periods of time (a few hundred milliseconds at most)! */ void busyWaitMilliseconds(uint32_t millis); /** * General delay that sleeps so CPU usage is low, but accuracy is potentially bad. */ void sleepMilliseconds(uint32_t millis); /** * Increase scheduling priority and algorithm to try to get 'real time' results. */ void setMaxPriority(void); /** * Drop scheduling priority back to normal/default. */ void setDefaultPriority(void); }; #endif /* DHTXX_H_ */
init()
Инициализация GPIO и WiringPi.
int init();
read(float*, float*)
Считывает данные с датчика DHT, подключенного к выводу GPIO (с использованием нумерации WiringPi). Влажность и температура будут возвращены в заданных параметрах. Если чтение успешное, будет возвращено значение 0 (DHT_SUCCESS
). Если при считывании данных произошла ошибка, возвращается отрицательное значение. Некоторые ошибки можно игнорировать и повторять чтение, в частности DHT_ERROR_TIMEOUT
или DHT_ERROR_CHECKSUM
.
int read(float* humidity, float* temperature);
busyWaitMilliseconds(uint32_t)
Приостанавливает работу потока, в котором она была вызвана, на указанное в аргументе время, загрузка процессора высокая, а точность высокая. Используйте этот метод только в течение короткого периода времени (не более нескольких сотен миллисекунд)!
void busyWaitMilliseconds(uint32_t millis);
sleepMilliseconds(uint32_t)
Приостанавливает работу потока, в котором она была вызвана, на указанное в аргументе время, загрузка процессора низкая, но точность потенциально плохая.
void sleepMilliseconds(uint32_t millis);
setMaxPriority()
Увеличивает приоритет планирования и алгоритм, чтобы попытаться получить результаты «реального времени» (SCHED_FIFO: планировщик FIFO (First In-First Out)).
void setMaxPriority(void);
setDefaultPriority();
Сбрасывает приоритет на нормальный/по умолчанию (SCHED_OTHER: стандартный алгоритм планировщика с разделением времени).
void setDefaultPriority(void);
DHTxx.cpp
#include <stdbool.h> #include <stdlib.h> #include <errno.h> #include <sched.h> #include <string.h> #include <sys/time.h> #include <time.h> #include <wiringPi.h> #include "DHTxx.h" DHTxx::DHTxx(int pin, int sensor) { this->pin = pin; this->sensor = sensor; } DHTxx::~DHTxx() { } int DHTxx::init() { /* * Initialize GPIO library. */ if (wiringPiSetup() == -1) { return DHT_ERROR_GPIO; } return DHT_SUCCESS; } int DHTxx::read(float* humidity, float* temperature) { /* * Validate humidity and temperature arguments and set them to zero. */ if (humidity == NULL || temperature == NULL) { return DHT_ERROR_ARGUMENT; } *temperature = 0.0f; *humidity = 0.0f; /* * Store the count that each DHT bit pulse is low and high. * Make sure array is initialized to start at zero. */ uint32_t pulseCounts[DHT_PULSES * 2] = { 0 }; /* * Set pin to output. */ pinMode(pin, OUTPUT); /* * Bump up process priority and change scheduler to try to try to make process more 'real time'. */ setMaxPriority(); /* * Set pin high for ~500 milliseconds. */ digitalWrite(pin, HIGH); sleepMilliseconds(500); /* * The next calls are timing critical and care should be taken * to ensure no unnecssary work is done below. */ /* * Set pin low for ~20 milliseconds. */ digitalWrite(pin, LOW); busyWaitMilliseconds(20); /* * Set pin at input. */ pinMode(pin, INPUT); /* * Need a very short delay before reading pins or else value is sometimes still low. */ for (volatile int i = 0; i < 50; ++i) { } /* * Wait for DHT to pull pin low. */ uint32_t count = 0; while (digitalRead(pin)) { if (++count >= DHT_MAXCOUNT) { /* * Timeout waiting for response. */ setDefaultPriority(); return DHT_ERROR_TIMEOUT; } } /* * Record pulse widths for the expected result bits. */ for (int i = 0; i < DHT_PULSES * 2; i += 2) { /* * Count how long pin is low and store in pulseCounts[i] */ while (!digitalRead(pin)) { if (++pulseCounts[i] >= DHT_MAXCOUNT) { /* * Timeout waiting for response. */ setDefaultPriority(); return DHT_ERROR_TIMEOUT; } } /* * Count how long pin is high and store in pulseCounts[i+1] */ while (digitalRead(pin)) { if (++pulseCounts[i + 1] >= DHT_MAXCOUNT) { /* * Timeout waiting for response. */ setDefaultPriority(); return DHT_ERROR_TIMEOUT; } } } /* * Done with timing critical code, now interpret the results. */ /* * Drop back to normal priority. */ setDefaultPriority(); /* * Compute the average low pulse width to use as a 50 microsecond reference threshold. * Ignore the first two readings because they are a constant 80 microsecond pulse. */ uint32_t threshold = 0; for (int i = 2; i < DHT_PULSES * 2; i += 2) { threshold += pulseCounts[i]; } threshold /= DHT_PULSES - 1; /* * Interpret each high pulse as a 0 or 1 by comparing it to the 50us reference. * If the count is less than 50us it must be a ~28us 0 pulse, and if it's higher * then it must be a ~70us 1 pulse. */ uint8_t data[5] = { 0 }; for (int i = 3; i < DHT_PULSES * 2; i += 2) { int index = (i - 3) / 16; data[index] <<= 1; if (pulseCounts[i] >= threshold) { /* * One bit for long pulse. */ data[index] |= 1; } /* * Else zero bit for short pulse. */ } /* * Verify checksum of received data. */ if (data[4] == ((data[0] + data[1] + data[2] + data[3]) & 0xFF)) { if (sensor == DHT11) { /* * Get humidity and temp for DHT11 sensor. */ *humidity = (float) data[0]; if (data[1] > 0) { if (data[1] <= 9) { *humidity += data[1] / 10.0; } else { *humidity += data[1] / 100.0; } } *temperature = (float) data[2]; if (data[3] > 0) { if (data[3] <= 9) { *temperature += data[3] / 10.0; } else { *temperature += data[3] / 100.0; } } } else if (sensor == DHT22) { /* * Calculate humidity and temp for DHT22 sensor. */ *humidity = (data[0] * 256 + data[1]) / 10.0f; *temperature = ((data[2] & 0x7F) * 256 + data[3]) / 10.0f; if (data[2] & 0x80) { *temperature *= -1.0f; } } return DHT_SUCCESS; } else { return DHT_ERROR_CHECKSUM; } } int DHTxx::getPin() const { return pin; } void DHTxx::setPin(int pin) { this->pin = pin; } int DHTxx::getSensor() const { return sensor; } void DHTxx::setSensor(int sensor) { this->sensor = sensor; } void DHTxx::busyWaitMilliseconds(uint32_t millis) { /* * Set delay time period. */ struct timeval deltatime; deltatime.tv_sec = millis / 1000; deltatime.tv_usec = (millis % 1000) * 1000; struct timeval walltime; /* * Get current time and add delay to find end time. */ gettimeofday(&walltime, NULL); struct timeval endtime; timeradd(&walltime, &deltatime, &endtime); /* * Tight loop to waste time (and CPU) until enough time as elapsed. */ while (timercmp(&walltime, &endtime, <)) { gettimeofday(&walltime, NULL); } } void DHTxx::sleepMilliseconds(uint32_t millis) { struct timespec sleep; sleep.tv_sec = millis / 1000; sleep.tv_nsec = (millis % 1000) * 1000000L; while (clock_nanosleep(CLOCK_MONOTONIC, 0, &sleep, &sleep) && errno == EINTR) ; } void DHTxx::setMaxPriority(void) { struct sched_param sched; memset(&sched, 0, sizeof(sched)); /* * Use FIFO scheduler with highest priority for the lowest chance of the kernel context switching. */ sched.sched_priority = sched_get_priority_max(SCHED_FIFO); sched_setscheduler(0, SCHED_FIFO, &sched); } void DHTxx::setDefaultPriority(void) { struct sched_param sched; memset(&sched, 0, sizeof(sched)); /* * Go back to default scheduler with default 0 priority. */ sched.sched_priority = 0; sched_setscheduler(0, SCHED_OTHER, &sched); }
Подключение DHT11 к Orange Pi One
Чтобы проверить работоспособность приведённого выше года, я подключил DHT11 к Orange Pi PC, скомпилировал и запустил ниже приведённый пример. На схеме Orange Pi One, потому что не нашёл компонент Orange Pi PC в fritzing.
Схема подключения DHT11 к Orange Pi One
Лучше использовать подтягивающий резистор на 10 кОм, при подключении резистора номинала 4.7 к — датчик не заработал.
Пример программы на C/C++
main.cpp
#include <iostream> #include <unistd.h> #include "DHTxx.h" using namespace std; int main() { float humidity; float temperature; int pin = 7; DHTxx dht11(pin, DHT11); if (dht11.init() == DHT_SUCCESS) { for (int i = 0; i < 10; ++i) { int result = dht11.read(&humidity, &temperature); switch (result) { case DHT_ERROR_TIMEOUT: cout << "DHT_ERROR_TIMEOUT" << endl; break; case DHT_ERROR_CHECKSUM: cout << "DHT_ERROR_CHECKSUM" << endl; break; case DHT_ERROR_ARGUMENT: cout << "DHT_ERROR_ARGUMENT" << endl; break; case DHT_ERROR_GPIO: cout << "DHT_ERROR_GPIO" << endl; break; case DHT_SUCCESS: cout << "humidity = " << humidity << " %" << endl; cout << "temperature = " << temperature << " °C" << endl; break; default: break; } sleep(3); } } return 0; }
Принцип работы примера
- Включаем файл
DHTxx.h
#include "DHTxx.h"
- Объявляем переменные
humidity
иtemperature
для сохранения данных температуры и относительной влажностиfloat humidity; float temperature;
- Создаём объект класса
DHTxx
. Первый параметр — это WiringPi пин, а второй — тип датчикаDHTxx dht11(pin, DHT11);
- Инициализируем датчик и продолжаем читать данные, если возвращаемый результат метода
init()
равенDHT_SUCCESS
if (dht11.init() == DHT_SUCCESS) {/*...*/}
- Создаём цикл и читаем данные при помощи метода
int result = dht11.read(&humidity, &temperature);
. Если возвращаемый результат методаread()
в переменнуюresult
равенDHT_SUCCESS
, тогда выводим температуру и влажность на экран. А если во время чтения возникла какая-то ошибка, тогда выводим на экран код ошибки.for (int i = 0; i < 10; ++i) { int result = dht11.read(&humidity, &temperature); switch (result) { case DHT_ERROR_TIMEOUT: cout << "DHT_ERROR_TIMEOUT" << endl; break; case DHT_ERROR_CHECKSUM: cout << "DHT_ERROR_CHECKSUM" << endl; break; case DHT_ERROR_ARGUMENT: cout << "DHT_ERROR_ARGUMENT" << endl; break; case DHT_ERROR_GPIO: cout << "DHT_ERROR_GPIO" << endl; break; case DHT_SUCCESS: cout << "humidity = " << humidity << " %" << endl; cout << "temperature = " << temperature << " °C" << endl; break; default: break; } sleep(3); }
- Минимальный интервал очередного чтения около двух секунд, я поставил 3.
sleep(3);
Результат
humidity = 53 % temperature = 29.1 °C DHT_ERROR_CHECKSUM humidity = 53 % temperature = 29 °C humidity = 53 % temperature = 29 °C humidity = 53 % temperature = 29 °C humidity = 53 % temperature = 29 °C humidity = 53 % temperature = 29 °C humidity = 53 % temperature = 29 °C humidity = 53 % temperature = 29 °C humidity = 52 % temperature = 28.9 °C
Подключение DHT22 к Orange Pi One
Всё вышесказанное про DHT11 подойдёт и для DHT22. Единственное отличие только в том, что, при инициализации объекта класса DHTxx
, второй параметр — это DHT22
.
DHTxx dht22(pin, DHT22);
Схема подключения DHT22 к Orange Pi One
Пример программы на C/C++
main.cpp
#include <iostream> #include <unistd.h> #include "DHTxx.h" using namespace std; int main() { float humidity; float temperature; int pin = 7; DHTxx dht22(pin, DHT22); if (dht22.init() == 0) { for (int i = 0; i < 10; ++i) { int result = dht22.read(&humidity, &temperature); switch (result) { case DHT_ERROR_TIMEOUT: cout << "DHT_ERROR_TIMEOUT" << endl; break; case DHT_ERROR_CHECKSUM: cout << "DHT_ERROR_CHECKSUM" << endl; break; case DHT_ERROR_ARGUMENT: cout << "DHT_ERROR_ARGUMENT" << endl; break; case DHT_ERROR_GPIO: cout << "DHT_ERROR_GPIO" << endl; break; case DHT_SUCCESS: cout << "humidity = " << humidity << " %" << endl; cout << "temperature = " << temperature << " °C" << endl; break; default: break; } sleep(3); } } return 0; }
Результат
humidity = 49 % temperature = 28.8 °C humidity = 49.1 % temperature = 28.8 °C humidity = 49.1 % temperature = 28.8 °C humidity = 49.1 % temperature = 28.8 °C humidity = 49.1 % temperature = 28.8 °C humidity = 49 % temperature = 28.8 °C humidity = 49 % temperature = 28.8 °C humidity = 49 % temperature = 28.8 °C humidity = 49 % temperature = 28.8 °C DHT_ERROR_TIMEOUT
Библиотека Java
С помощью инструмента Pi4J я перевёл C/C++ код на Java. Проблема Джавы в том, что при чтении данных с датчика очень часто возникают ошибки. Проблема может быть решена двумя костылями: первое — это использовать нативные методы и вызывать C/C++ функции с помощью JNI, что является более правильным решением; второе и самое простое — это запросить данные с датчика пока не получим правильный результат.
Если ещё не установили Pi4J на вашу плату перейдите на страницу Установка Pi4J на Raspberry Pi и Orange Pi, Banana Pi.
DhtData.java
Класс DhtData
содержит информацию о влажности и температуре.
package ru.micropi.pi4j.dhtxx; public class DhtData { private double temperature; private double humidity; public DhtData() { super(); } public DhtData(double temperature, double humidity) { super(); this.temperature = temperature; this.humidity = humidity; } public double getTemperature() { return temperature; } public void setTemperature(double temperature) { this.temperature = temperature; } public double getHumidity() { return humidity; } public void setHumidity(double humidity) { this.humidity = humidity; } @Override public String toString() { return "Temperature: " + temperature + "°C\nHumidity: " + humidity + "%"; } }
DHTxx.java
Интерфейс DHTxx
— это абстракция устройств DHT. Он позволяет инициализировать GPIO/WiringPi и читать данные с DHT11/DHT22.
package ru.micropi.pi4j.dhtxx; import com.pi4j.io.gpio.Pin; public interface DHTxx { public void init() throws Exception; public Pin getPin(); public void setPin(Pin pin); public DhtData getData() throws Exception; }
init()
Метод инициализирует GPIO/WiringPi, выбрасывает исключение, если это не удалось сделать.
public void init() throws Exception;
getData()
Метод считывает и проверяет данные с датчика, а после возвращает эти данные в виде объекта класса DhtData. В случае ошибки выбрасывает исключение.
public DhtData getData() throws Exception;
DHTxxBase.java
В абстрактном классе DHTxxBase реализованы методы: getPin()
, setPin()
и init()
. Также добавлен метод getRawData()
, именно здесь происходит чтение и преобразование данных с датчиков DHT11/DHT22. Эти методы являются общими для обоих датчиков.
package ru.micropi.pi4j.dhtxx; import com.pi4j.io.gpio.Pin; import com.pi4j.wiringpi.Gpio; public abstract class DHTxxBase implements DHTxx { private static final int DHT_MAXCOUNT = 32000; private static final int DHT_PULSES = 41; private Pin pin; public DHTxxBase(Pin pin) { this.pin = pin; } public Pin getPin() { return pin; } public void setPin(Pin pin) { this.pin = pin; } @Override public void init() throws Exception { /* * Initialize GPIO library. */ if (Gpio.wiringPiSetup() == -1) { throw new Exception("DHT_ERROR_GPIO"); } } protected int[] getRawData() throws Exception { /* * Store the count that each DHT bit pulse is low and high. Make sure array * is initialized to start at zero. */ int pulseCounts[] = new int[DHT_PULSES * 2]; /* * Set pin to output. */ Gpio.pinMode(pin.getAddress(), Gpio.OUTPUT); /* * Bump up process priority and change scheduler to try to try to make * process more 'real time'. */ Thread.currentThread().setPriority(Thread.MAX_PRIORITY); /* * Set pin high for ~500 milliseconds. */ Gpio.digitalWrite(pin.getAddress(), Gpio.HIGH); Gpio.delay(500); /* * The next calls are timing critical and care should be taken to ensure no * unnecessary work is done below. */ /* * Set pin low for ~20 milliseconds. */ Gpio.digitalWrite(pin.getAddress(), Gpio.LOW); Gpio.delay(20); /* * Set pin at input. */ Gpio.pinMode(pin.getAddress(), Gpio.INPUT); /* * Need a very short delay before reading pins or else value is sometimes * still low. */ /* * for (int i = 0; i < 50; ++i) {} */ /* * Wait for DHT to pull pin low. */ long count = 0; while (Gpio.digitalRead(pin.getAddress()) == 1) { if (++count >= DHT_MAXCOUNT) { /* * Timeout waiting for response. */ Thread.currentThread().setPriority(Thread.NORM_PRIORITY); throw new Exception("DHT_ERROR_TIMEOUT"); } } // Record pulse widths for the expected result bits. for (int i = 0; i < DHT_PULSES * 2; i += 2) { /* * Count how long pin is low and store in pulseCounts[i] */ while (Gpio.digitalRead(pin.getAddress()) == 0) { if (++pulseCounts[i] >= DHT_MAXCOUNT) { /* * Timeout waiting for response. */ Thread.currentThread().setPriority(Thread.NORM_PRIORITY); throw new Exception("DHT_ERROR_TIMEOUT: " + pulseCounts[i] + " pulses, " + i); } } /* * Count how long pin is high and store in pulseCounts[i+1] */ while (Gpio.digitalRead(pin.getAddress()) == 1) { if (++pulseCounts[i + 1] >= DHT_MAXCOUNT) { /* * Timeout waiting for response. */ Thread.currentThread().setPriority(Thread.NORM_PRIORITY); throw new Exception("DHT_ERROR_TIMEOUT: " + pulseCounts[i + 1] + " pulses, " + i); } } } /* * Done with timing critical code, now interpret the results. */ /* * Drop back to normal priority. */ Thread.currentThread().setPriority(Thread.NORM_PRIORITY); /* * Compute the average low pulse width to use as a 50 microsecond reference * threshold. Ignore the first two readings because they are a constant 80 * microsecond pulse. */ long threshold = 0; for (int i = 2; i < DHT_PULSES * 2; i += 2) { threshold += pulseCounts[i]; } threshold /= DHT_PULSES - 1; /* * Interpret each high pulse as a 0 or 1 by comparing it to the 50us * reference. If the count is less than 50us it must be a ~28us 0 pulse, and * if it's higher then it must be a ~70us 1 pulse. */ int data[] = new int[5]; for (int i = 3; i < DHT_PULSES * 2; i += 2) { int index = (i - 3) / 16; data[index] <<= 1; if (pulseCounts[i] >= threshold) { /* * One bit for long pulse. */ data[index] |= 1; } /* * Else zero bit for short pulse. */ } return data; } }
DHTxxBase(Pin)
Конструктор класса DHTxxBase
, как параметр получает номер пина по WiringPi, к которому подключён DHT датчик.
public DHTxxBase(Pin pin)
getRawData()
Метод считывает и преобразовывает данные с датчиков DHT11/DHT22. Возвращает массив из 5 байт, содержащий сведения о влажности, температуре и контрольной сумме. Выбрасывает исключение, если во время чтения возникла ошибка.
protected int[] getRawData() throws Exception
DHT11.java
package ru.micropi.pi4j.dhtxx; import com.pi4j.io.gpio.Pin; import com.pi4j.wiringpi.Gpio; public class DHT11 extends DHTxxBase { private static final int DHT_WAIT_INTERVAL = 2000; public DHT11(Pin pin) { super(pin); } @Override public DhtData getData() throws Exception { int atempts = 0; while (true) { try { int[] data = getRawData(); /* * Verify checksum of received data. */ if (data[4] != ((data[0] + data[1] + data[2] + data[3]) & 0xFF)) { throw new Exception("DHT_ERROR_CHECKSUM"); } /* * Get humidity and temp for DHT11 sensor. */ double humidity = data[0]; if (data[1] > 0) { if (data[1] <= 9) { humidity += data[1] / 10.0; } else { humidity += data[1] / 100.0; } } double temperature = data[2]; if (data[3] > 0) { if (data[3] <= 9) { temperature += data[3] / 10.0; } else { temperature += data[3] / 100.0; } } return new DhtData(temperature, humidity); } catch (Exception e) { atempts++; if (atempts <= 3) { Gpio.delay(DHT_WAIT_INTERVAL); continue; } throw new Exception("Atempts " + atempts, e); } } } @Override public String toString() { return "DHT11, pin: " + getPin(); } }
DHT22.java
package ru.micropi.pi4j.dhtxx; import com.pi4j.io.gpio.Pin; import com.pi4j.wiringpi.Gpio; public class DHT22 extends DHTxxBase { private static final int DHT_WAIT_INTERVAL = 2000; public DHT22(Pin pin) { super(pin); } @Override public DhtData getData() throws Exception { int atempts = 0; while (true) { try { int[] data = getRawData(); /* * Verify checksum of received data. */ if (data[4] != ((data[0] + data[1] + data[2] + data[3]) & 0xFF)) { throw new Exception("DHT_ERROR_CHECKSUM"); } /* * Calculate humidity and temp for DHT22 sensor. */ double humidity = (data[0] * 256 + data[1]) / 10.0; double temperature = ((data[2] & 0x7F) * 256 + data[3]) / 10.0; if ((data[2] & 0x80) != 0) { temperature *= -1.0f; } return new DhtData(temperature, humidity); } catch (Exception e) { atempts++; if (atempts <= 3) { Gpio.delay(DHT_WAIT_INTERVAL); continue; } throw new Exception("Atempts " + atempts, e); } } } @Override public String toString() { return "DHT22, pin: " + getPin(); } }
Классы DHT11
и DHT22
расширяют класс DHTxxBase
, переопределён конструктор класса и реализован метод getData()
.
getData()
Метод getData()
классов DHT11
и DHT22
почти одинаковые, отличаются лишь тем, как преобразовываются данные в градусах цельсия и процентах. Полученные данные возвращаются в виде объекта класс DhtData
.
public DhtData getData() throws Exception {}
Из-за того, что очень часто при чтении возникают ошибки, функция пытается считывать данные из датчика до первой удачной попытки. Количество попыток ограничено 3.
if (atempts <= 3) { Gpio.delay(DHT_WAIT_INTERVAL); continue; }
Если не удалось получить результат, тогда выбрасывается исключение.
Проблема в том, Raspberry Pi/Orange Pi не работают в режиме реального времени, то есть, программные задержки не всегда точны и это приводит к ошибкам при считывании данных.
Работа с DHT11 из Java
Ниже приведён пример программы, которая 10 запрашивает данные с интервалом в 2 секунд и выводит результат в терминале. Для DHT11 нужно создать экземпляр класса DHT11
.
DHTxx dht11 = new DHT11(OrangePiPin.GPIO_07);
Схема подключения DHT11 к Orange Pi One
Пример программы на Java, DHT11Test.java
package ru.micropi.pi4j.dhtxx.tests; import ru.micropi.pi4j.dhtxx.DHT11; import ru.micropi.pi4j.dhtxx.DHTxx; import com.pi4j.io.gpio.OrangePiPin; public class DHT11Test { private static final int DHT_WAIT_INTERVAL = 2000; public static void main(String[] args) { DHTxx dht11 = new DHT11(OrangePiPin.GPIO_07); System.out.println(dht11); try { dht11.init(); for (int i = 0; i < 10; i++) { try { System.out.println(dht11.getData()); Thread.sleep(DHT_WAIT_INTERVAL); } catch (Exception e) { e.printStackTrace(); } } } catch (Exception e1) { e1.printStackTrace(); } } }
Результат
DHT11, pin: GPIO 7 Temperature: 28.6°C Humidity: 54.0% Temperature: 28.6°C Humidity: 53.0% Temperature: 28.6°C Humidity: 53.0% Temperature: 28.6°C Humidity: 52.0% Temperature: 28.6°C Humidity: 52.0% Temperature: 28.6°C Humidity: 52.0% Temperature: 28.6°C Humidity: 52.0% Temperature: 28.6°C Humidity: 52.0% Temperature: 28.6°C Humidity: 51.0% Temperature: 28.6°C Humidity: 51.0%
Работа с DHT22 из Java
Для работы с DHT22 создаём экземпляр класса DHT22
, в остальном всё то же самое как и с DHT11.
DHTxx dht22 = new DHT22(OrangePiPin.GPIO_07);
Схема подключения DHT22 к Orange Pi One
Пример программы на Java, DHT22Test.java
package ru.micropi.pi4j.dhtxx.tests; import ru.micropi.pi4j.dhtxx.DHT22; import ru.micropi.pi4j.dhtxx.DHTxx; import com.pi4j.io.gpio.OrangePiPin; public class DHT22Test { private static final int DHT_WAIT_INTERVAL = 2000; public static void main(String[] args) { DHTxx dht22 = new DHT22(OrangePiPin.GPIO_07); System.out.println(dht22); try { dht22.init(); for (int i = 0; i < 10; i++) { try { System.out.println(dht22.getData()); Thread.sleep(DHT_WAIT_INTERVAL); } catch (Exception e) { e.printStackTrace(); } } } catch (Exception e1) { e1.printStackTrace(); } } }
Результат
DHT22, pin: GPIO 7 Temperature: 28.3°C Humidity: 48.7% Temperature: 28.3°C Humidity: 48.6% Temperature: 28.3°C Humidity: 48.9% Temperature: 28.3°C Humidity: 48.5% Temperature: 28.3°C Humidity: 48.5% Temperature: 28.3°C Humidity: 48.5% Temperature: 28.2°C Humidity: 48.4% Temperature: 28.3°C Humidity: 48.5% Temperature: 28.2°C Humidity: 48.4% Temperature: 28.3°C Humidity: 48.5%
Проекты Eclipse
DHT11 — Eclipse C++
DHTxx — Eclipse Java
Материалы
Adafruit Python DHT Sensor Library
Датчики температуры и влажности DHT11 и DHT22
Проект OpenNet: MAN sched_setscheduler (2) Системные вызовы (FreeBSD и Linux)
Отличная статья!Жаль нет пошаговой инструкции для чайников.Будем разбираться 🙂
Здравствуйте, спасибо за ваше руководство. Когда я запускаю программу, время от времени я получаю следующую ошибку. Мой метод использует аннотацию @Scheduled (fixedRate = 10000). Как ее решить?
java.lang.Exception: Atempts 4
Caused by: java.lang.Exception: DHT_ERROR_TIMEOUT: 32000 pulses, 70
at ru.micropi.pi4j.dhtxx.DHTxxBase.getRawData(DHTxxBase.java:119)
at ru.micropi.pi4j.dhtxx.DHT22.getData(DHT22.java:19)
Здравствуйте. Что-то не получается скомпилировать C++
/tmp/ccRZ5e8m.o: In function `main’:
/dht22/cpp/dht.cpp:12: undefined reference to `DHTxx::DHTxx(int, int)’
/dht22/cpp/dht.cpp:14: undefined reference to `DHTxx::init()’
/dht22/cpp/dht.cpp:16: undefined reference to `DHTxx::read(float*, float*)’
/dht22/cpp/dht.cpp:12: undefined reference to `DHTxx::~DHTxx()’
/dht22/cpp/dht.cpp:12: undefined reference to `DHTxx::~DHTxx()’
Добрый день!
при компиляции получаю ошибку
DHTxx.cpp:256:1: error: stray ‘\177’ in program
датчик dht22
))) сам дурак, все поправил.
Подскажите еще такой момент, чем теперь удобнее собирать данные в файл или еще лучше прикрутить график для удаленного мониторинга?
Насколько я понимаю это уже в perl или python, что лучше выбрать?
Ранее программированием не занимался.
why iphone new iphone
автомобиль в аренду в москве дешево прокат машины в москве посуточно
scooby comic action comics 2025 online
маркетплейс аккаунтов продать аккаунт
производство металлических значков https://metallicheskie-znachki-zakaz.ru
аккаунт для рекламы продать аккаунт
услуги по продаже аккаунтов площадка для продажи аккаунтов
продажа аккаунтов платформа для покупки аккаунтов
платформа для покупки аккаунтов https://kupit-akkaunt-top.ru/
Account marketplace Account Acquisition
Account market Online Account Store
Purchase Ready-Made Accounts Secure Account Sales
Secure Account Purchasing Platform Accounts market
profitable account sales account selling service
account buying service buy accounts
verified accounts for sale account exchange
account exchange service account sale
online account store website for selling accounts
account trading platform website for selling accounts
account catalog account exchange service
account purchase buy accounts
accounts for sale secure account purchasing platform
account catalog account sale
account trading database of accounts for sale
online account store website for buying accounts
verified accounts for sale account trading
online account store secure account purchasing platform
online account store https://marketplace-social-accounts.org/
sell account account trading
account trading platform account marketplace
sell account account trading platform
account selling service website for selling accounts
accounts market account acquisition
sell account account market
secure account purchasing platform ready-made accounts for sale
Нужен номер для ТГ? Предлагаем купить виртуальный номер для телеграм дешево для одноразовой или постоянной активации. Регистрация аккаунта без SIM-карты, в любом регионе. Удобно, надёжно, без привязки к оператору.
buy and sell accounts https://accounts-marketplace.xyz
buy account https://social-accounts-marketplaces.live
accounts marketplace https://accounts-marketplace.live
website for selling accounts https://social-accounts-marketplace.xyz
купить смартфон в москве купить смартфон 256 гб
verified accounts for sale accounts marketplace
accounts marketplace account marketplace
website for buying accounts https://buy-accounts.live
marketplace for ready-made accounts accounts market
купить аккаунт https://rynok-akkauntov.top/
маркетплейс аккаунтов https://kupit-akkaunt.xyz/
биржа аккаунтов https://akkaunt-magazin.online
покупка аккаунтов https://akkaunty-optom.live
магазин аккаунтов online-akkaunty-magazin.xyz
Create vivid images with Promptchan AI — a powerful neural network for generating art based on text description. Support for SFW and NSFW modes, style customization, quick creation of visual content.
купить аккаунт https://kupit-akkaunt.online/
buy facebook account https://buy-ad-accounts.click/
buy fb ad account facebook ads accounts
buy fb account https://buy-ads-account.click/
fb account for sale buy facebook ads account
facebook accounts for sale https://buy-ads-account.work
buy aged fb account https://ad-account-for-sale.top
buy a facebook account cheap facebook account
buy a facebook ad account https://ad-accounts-for-sale.work/
buy google ads threshold account google ads reseller
buy verified google ads account https://buy-ads-accounts.click
buy old facebook account for ads https://buy-accounts.click
buy google ad threshold account https://ads-account-for-sale.top
google ads account seller https://ads-account-buy.work
рефераты на заказ сколько стоит написать реферат
buy google ads buy google ads threshold account
google ads reseller google ads agency account buy
buy google ads threshold accounts https://buy-ads-agency-account.top
buy verified google ads accounts https://ads-agency-account-buy.click
buy verified business manager buy-business-manager.org
buy old google ads account buy google ad threshold account
buy facebook business managers buy facebook ads accounts and business managers
buy fb bm buy-verified-business-manager.org
facebook bm buy https://business-manager-for-sale.org
buy facebook business account buy facebook business manager verified
verified bm for sale verified-business-manager-for-sale.org
buy tiktok ad account https://buy-tiktok-ads-account.org
обзорная экскурсия калининград где купить https://ehkskursii-v-kaliningrade.ru
buy tiktok business account https://tiktok-ads-account-for-sale.org
tiktok ads account for sale https://tiktok-agency-account-for-sale.org
tiktok agency account for sale https://buy-tiktok-ad-account.org
buy tiktok ads account https://buy-tiktok-ads-accounts.org
buy tiktok business account https://buy-tiktok-business-account.org
tiktok ads agency account https://buy-tiktok-ads.org
разработка сайтов минск цены разработка сайта магазина минск
seo сайта цена seo сайта цена москва
изготовление нагрудных бейджей сделать бейдж на заказ
корпоративные значки на заказ https://izgotovit-znachki-metalicheskie.ru
типография производство типография заказ
типография полиграфия цифровая типография
стоимость печати визиток печать визиток спб
Нужна печать наклеек на заказ? Закажите стикеры любых форм и размеров с доставкой. Яркие, прочные, влагостойкие наклейки на пленке и бумаге — для рекламы, декора, маркировки и упаковки.
Профессиональная типография срочно. Изготовим любые печатные материалы — от визиток до каталогов. Качественно, быстро, с гарантией. Закажите онлайн или приезжайте в офис в СПб.
Профессиональная https://lazernaya-epilyaciya11.ru. Эффективное удаление волос на любом участке тела, подход к любому фототипу. Сертифицированные специалисты, стерильность, скидки. Запишитесь прямо сейчас!
Безболезненная лазерная эпиляция удаление Удаление волос на любом участке тела. Работаем с чувствительной кожей, используем новейшие лазеры. Акции, абонементы, индивидуальный подход.
программное обеспечение компьютера лицензионное https://internet-magazin-soft.kz
Избавьтесь от волос сколько стоит лазерная эпиляция навсегда — с помощью лазерной эпиляции. Эффективные процедуры на любом участке тела, минимальный дискомфорт, заметный результат уже после первого сеанса.
Избавьтесь от волос лазерная эпиляция цена навсегда — с помощью лазерной эпиляции. Эффективные процедуры на любом участке тела, минимальный дискомфорт, заметный результат уже после первого сеанса.
медицинский центр абакан сайт медицинский центр
дерматолог абакан платный дерматолог
частная клиника клиника диагностика
Пролетни рокли в романтичен стил за разходки и срещи
дамски рокли дамски рокли .
Дамски тениски с щампи и надписи, които подчертават стила ти през целия сезон
елегантни дамски тениски http://www.teniski-damski.com/ .
Инвестирай в качество с дълготрайни и стилни дамски блузи
официални дамски блузи https://bluzi-damski.com/ .
Выбор фундамента и технологии при строительстве деревянного дома
построить деревянный дом под ключ https://www.stroitelstvo-derevyannyh-domov78.ru/ .
Услуги клининга с выездом в день обращения по доступной цене
услуги клининга в москве цены на услуги https://www.kliningovaya-kompaniya0.ru/ .
Каталог шин с актуальными ценами и фото в онлайн-магазине
магазин шины http://www.kupit-shiny0-spb.ru .
Сувенирная продукция с логотипом компании — производство под ключ
изготовление сувениров на заказ https://suvenirnaya-produktsiya-s-logotipom-1.ru .
resume for engineering internship no experience resume for engineering jobs
resume for engineering jobs resume backend engineer
Прогулки на яхте в Сочи: аренда с маршрутом под ваши желания
яхта аренда сочи https://www.arenda-yahty-sochi23.ru .
Сравнение кормов: почему Jarvi — лучший выбор для вашего питомца
jarvi корм отзывы http://www.ozon.ru/category/suhie-korma-dlya-koshek-12349/jarvi-elaman-100175853/review .
Уютные квартиры и дома у моря — отдых в Гаграх для всей семьи
снять жилье в гаграх otdyh-gagry.ru .
Film izleme keyfini yeni boyuta taşıyan full hd film önerileri
hd film izle, https://www.filmizlehd.co .
Алкоголь на заказ с доставкой — быстро, легально, удобно
алкоголь круглосуточно рядом со мной купить заказ алкоголя на дом москва круглосуточно .
Лучшие подарочные наборы бокалов для вина в каталоге магазина
бокалы для вина 2 шт https://www.bokaly-dlya-vina.neocities.org .
Императорский фарфор: изделия ручной работы с уникальным стилем
ифз imperatorskiy-farfor.kesug.com .
Комплексный клининг квартиры за один день с гарантией чистоты
клининг мск kliningovaya-kompaniya10.ru .
займ до зарплаты онлайн займ онлайн птс
Выгодные предложения на лизинг грузовиков и спецтехники с минимальным авансом
сельхозтехника в лизинг https://lizing-auto-top1.ru/lizing-selskohozyajstvennoj-tehniki/ .
Нестандартные решения в печати на футболках — удивляйте вместе с нами
печать на футболках https://pechat-na-futbolkah777.ru .
Наша компания оказывает профессиональные услуги грузовых перевозок по направлению Москва — Питер с ежедневными рейсами и перевозкой от 12 часов. Мы гарантируем надежную перевозку любых типов грузов благодаря современному автопарку и опытным шоферам. Предлагаем выгодные тарифы, полное страхование грузов и возможность контроля в режиме реального времени. Персональный подход к каждому заказчику и выгодная система льгот делают нас проверенным поставщиком услуг для вашего бизнеса. Подробная информация и специальные коммерческие предложения доступны на нашем портале.
кейс защитный fs купить plastcase.ru/
Сравнение цен на деревянные дома под ключ: от типовых решений до эксклюзива
дом деревянный под ключ цена https://derevyannye-doma-pod-klyuch-msk0.ru .
За 15 лет работы мы транспортировали более 100 000 заказов по маршруту Москва-Петербург без единой серьезной аварии. Партнеры выбирают нас за надежность, своевременность и добросовестную работу без сюрпризов. Быстрая перевозка за 12 часов стала нашим правилом, а не исключением. Крупные транспортные корпорации передают нам свои самые важные отправления. Присоединяйтесь к тысячам довольных заказчиков — все отзывы и кейсы на нашем ресурсе.
Наша организация предоставляет надежные услуги грузовых перевозок по направлению Москва — СПБ с постоянными отправками и транспортировкой от 12 часов. Мы гарантируем надежную доставку любых типов отправлений благодаря новому автотранспорту и квалифицированным шоферам. Предлагаем выгодные тарифы, полное покрытие товаров и возможность отслеживания в режиме реального времени. Персональный подход к каждому клиенту и выгодная система скидок делают нас ответственным партнером для вашего бизнеса. Детальная информация и персональные коммерческие предложения доступны на нашем ресурсе.
Обеспечиваем быструю доставку товаров между Москвой и Питером всего за 12 часов! Работаем ежедневно, берем любые товары — от документов до крупногабаритных товаров. Никаких скрытых оплат, полная открытость процесса и контроль по каждой перевозке. Сберегайте время и деньги, доверяя свои товары специалистам с многолетним опытом. Оставьте заявку на нашем сайте и получите расчет стоимости в течение часа!
написать реферат онлайн купить реферат
получить займ онлайн zajmy onlajn
Наша фирма предоставляет надежные услуги грузовых перевозок по маршруту Москва — Санкт-Петербург с регулярными рейсами и доставкой от 12 часов. Мы обеспечиваем безопасную транспортировку любых типов грузов благодаря новому автотранспорту и опытным шоферам. Предлагаем выгодные цены, полное покрытие грузов и возможность мониторинга в режиме реального времени. Индивидуальный подход к каждому клиенту и выгодная система скидок делают нас проверенным поставщиком услуг для вашего бизнеса. Детальная информация и индивидуальные коммерческие предложения доступны на нашем сайте.
Выполняем оперативную перевозку грузов между Москвой и Питером всего за 12 часов! Действуем постоянно, перевозим любые отправления — от документов до крупногабаритных товаров. Никаких скрытых доплат, полная открытость процесса и документооборот по каждой перевозке. Сохраняйте время и деньги, доверяя свои отправления профессионалам с большим опытом. Оставьте заявку на нашем сайте и получите смету стоимости в течение часа!
Массивные подстолья для больших столов — устойчивость без компромиссов
подстолье для столешницы купить https://podstolia-msk.ru/ .
jhl moto — когда цена соответствует качеству
мотоцикл jhlmoto https://www.jhlmoto01.ru .
Клининг в Москве становится все более популярным. Из-за напряженного ритма жизни в Москве многие люди обращаются к профессионалам для уборки.
Компаниям, занимающимся клинингом, доступны разнообразные виды услуг. Это может быть как ежедневная уборка квартир, так и глубокая очистка помещений.
При выборе компании, предоставляющей услуги клининга, стоит ознакомиться с ее отзывами и сроками работы. Необходимо обращать внимание на стандарты и профессионализм уборщиков.
В заключение, клининг в Москве – это удобное решение для занятых людей. Москвичи могут воспользоваться услугами клининговых компаний, чтобы освободить свое время для более важных дел.
служба клининга http://www.uborkaklining1.ru .
Современные грузоперевозки Москва-Санкт-Петербург нового поколения с полным мониторингом процесса. Умная логистика позволяет улучшать маршруты и минимизировать время перевозки до минимума. GPS-отслеживание, автоматические сообщения и полная аналитика по каждой перевозке в личном кабинете. Честное тарификация на основе алгоритмов и оперативный расчет стоимости онлайн. Переходите в эпоху умной логистики вместе с нами — начните на нашей системе.
Выполняем поверку СИ любой категории, включая сложное промышленное и бытовое оборудование. Работаем в соответствии с методиками, утверждёнными Росстандартом.
Проверка средств измерений является основополагающим шагом для обеспечения достоверности измерений в разных сферах. Она нужна для поддержания профессиональных стандартов и обеспечения надежности измерительных систем.
Поверка включает несколько ключевых шагов, таких как анализ технического состояния измерительных приборов. На начальном этапе проводится визуальный анализ состояния измерительных средств.. В случае несоответствий прибор нужно откалибровать или заменить на другой.
Важно помнить, что поверка средств измерений должна проводиться регулярно для обеспечения их точности. Также следует обращать внимание на сроки поверки, чтобы минимизировать риск получения некорректных данных.
Эффективный клининг без вашего участия: от ключа до результата
клининг в москве http://kliningovaya-kompaniya10.ru .
Коммерческие авто в лизинг с регистрацией в ГИБДД и КАСКО в комплекте
лизинг спецтехники для ооо http://www.lizing-auto-top1.ru/specztehnika .
Цифровые логистические услуги Москва-Санкт-Петербург нового поколения с полным контролем процесса. Продвинутая логистика позволяет оптимизировать направления и уменьшать время доставки до минимума. GPS-контроль, автоматические оповещения и полная аналитика по каждой перевозке в личном кабинете. Прозрачное тарификация на основе алгоритмов и оперативный расчет стоимости онлайн. Переходите в эпоху умной логистики вместе с нами — начните на нашей сервисе.
Строительство каркасных домов с учетом всех особенностей вашего участка
каркасные дома спб https://www.spb-karkasnye-doma-pod-kluch.ru .
За 15 лет работы мы перевезли более 100 000 заказов по направлению Москва-Петербург без единой серьезной аварии. Клиенты предпочитают нас за постоянство, пунктуальность и открытую работу без сюрпризов. Быстрая перевозка за 12 часов стала нашим правилом, а не исключением. Крупные транспортные фирмы передают нам свои самые важные заказы. Присоединяйтесь к тысячам довольных партнеров — все отзывы и кейсы на нашем ресурсе.
Наша организация предоставляет качественные услуги доставки грузов по маршруту Москва — Питер с постоянными поездками и перевозкой от 12 часов. Мы обеспечиваем безопасную перевозку любых типов товаров благодаря современному подвижному составу и квалифицированным перевозчикам. Предлагаем конкурентные тарифы, полное защиту товаров и возможность контроля в режиме реального времени. Особый подход к каждому партнеру и удобная система скидок делают нас надежным исполнителем для вашего бизнеса. Детальная информация и индивидуальные коммерческие предложения доступны на нашем ресурсе.
Дизайнерская печать на футболках для стильных и смелых
заказ футболок со своим принтом http://www.pechat-na-futbolkah777.ru .
Посетите наш сайт и узнайте о клининг квартиры цена спб!
Клининговые услуги в Санкт-Петербурге набирают популярность. С каждым годом всё больше компаний предлагают широкий спектр услуг по уборке и обслуживанию помещений.
Пользователи услуг клининга отмечают высокое качество и удобство. Большинство компаний предлагает индивидуальный подход к каждому клиенту, учитывая все пожелания.
В спектр клининговых услуг входят как плановые уборки, так и одноразовые мероприятия
Деревянные дома под ключ с гарантией качества и сроками от проверенного застройщика
деревянные дома под ключ цены https://derevyannye-doma-pod-klyuch-msk0.ru/ .
Требуется надежного логиста между Москвой и СПБ? Наши ребята курсируют по этому направлению каждый день и знают его как свои пять пальцев. Осознаем, что каждый отправление важен для вашего дела, поэтому подходим к нему как к своему собственному. Справедливые цены без накруток, полное защиту и постоянная связь с перевозчиком. Взаимодействуем с организациями любого размера и всегда идем навстречу. Все условия и примеры работы смотрите на нашем портале.
Узнайте сколько стоит клининг в Москве при различных форматах заказа. Цена рассчитывается персонально и не меняется без согласования.
В последние годы клининг в Москве становится все более востребованным. Все больше людей в Москве выбирают услуги профессионального клининга для уборки своих помещений.
Цены на клининг могут варьироваться в зависимости от специфики услуг. Уборка квартиры, как правило, обойдется от 1500 до 5000 рублей в зависимости от площади.
Также можно заказать дополнительные услуги, включая мойку окон и химчистку ковров. Эти услуги могут значительно увеличить общую стоимость уборки.
Перед выбором клининговой фирмы рекомендуется ознакомиться с различными предложениями на рынке. Обращайте внимание на отзывы и рейтинг выбранной клининговой компании.
Профессиональный клининг СПб с полным комплексом услуг. Дезинфекция, уборка после ремонта, мойка окон и больше.
Клининг в Санкт-Петербурге становится всё более популярным. Многие компании предлагают широкий спектр услуг. Уборка квартир, офисов и общественных мест – это основные направления клининговых услуг.
Услуги клининговых компаний востребованы в основном из-за экономии времени. Благодаря этому они могут сосредоточиться на более важных делах. Клининговые услуги также становятся идеальным решением для занятых людей.
Причина успеха клининговых компаний заключается в высоком уровне профессионализма. Специалисты клининговых компаний знают, как правильно применять современное оборудование и моющие средства. Такой подход позволяет быстро и качественно выполнять работу.
Разнообразие пакетов услуг позволяет каждому найти подходящее решение. Некоторые клининговые фирмы предоставляют услуги по разовой уборке, тогда как другие предлагают долгосрочные контракты. Так клиенты могут подобрать наиболее удобный для себя вариант.
Современные грузоперевозки Москва-СПБ нового поколения с полным мониторингом процесса. Умная логистика позволяет оптимизировать маршруты и минимизировать время перевозки до минимума. GPS-контроль, автоматические уведомления и подробная аналитика по каждой перевозке в личном кабинете. Открытое тарификация на основе алгоритмов и быстрый расчет стоимости онлайн. Переходите в эпоху умной логистики вместе с нами — начните на нашей системе.
За 15 лет работы мы перевезли более 100 000 заказов по трассе Москва-СПБ без единой серьезной аварии. Клиенты доверяют нас за стабильность, точность и честную работу без сюрпризов. Экспресс-доставка за 12 часов стала нашим стандартом, а не исключением. Крупные логистические компании доверяют нам свои самые важные отправления. Станьте частью к тысячам довольных клиентов — все отзывы и кейсы на нашем сайте.
Наша фирма оказывает качественные услуги грузоперевозок по маршруту Москва — Питер с ежедневными отправками и транспортировкой от 12 часов. Мы обеспечиваем качественную транспортировку любых типов товаров благодаря современному автопарку и профессиональным перевозчикам. Предлагаем конкурентные тарифы, полное страхование товаров и возможность контроля в режиме реального времени. Персональный подход к каждому клиенту и выгодная система льгот делают нас проверенным партнером для вашего бизнеса. Полная информация и персональные коммерческие предложения доступны на нашем сайте.
Организуем скоростную доставку отправлений между Москвой и СПБ всего за 12 часов! Работаем постоянно, принимаем любые товары — от документов до больших товаров. Никаких скрытых доплат, полная открытость процесса и документооборот по каждой перевозке. Экономьте время и деньги, доверяя свои отправления профессионалам с многолетним опытом. Оставьте заявку на нашем ресурсе и получите расчет стоимости в течение часа!
Ищете ответственного перевозчика между Москвой и Санкт-Петербургом? Наши ребята работают по этому маршруту каждый день и знают его как свои пять пальцев. Знаем, что каждый товар важен для вашего дела, поэтому относимся к нему как к своему собственному. Справедливые тарифы без переплат, полное защиту и постоянная связь с перевозчиком. Взаимодействуем с компаниями любого размера и всегда идем навстречу. Все условия и примеры работы смотрите на нашем портале.
Пряные салаты, вок и кимчи — корейская кухня доставка удивит своим разнообразием.
Вок-заказ стал популярным способом получения вкусной еды на дом. Такой способ избавляет от необходимости готовить и позволяет наслаждаться разнообразной кухней.
Вок-блюда можно заказать в больших и малых ресторанах, которые специализируются на этой кухне. Каждое заведение старается выделиться своим ассортиментом и акциями.
Важно следить за мнениями клиентов, чтобы выбрать наилучший ресторан. Это поможет избежать разочарований и выбрать качественное заведение.
Иногда рестораны предлагают привлекательные скидки на вок-блюда, что делает заказ еще более приятным. Это отличная возможность попробовать новые блюда по более низкой цене.
Цифровые перевозки грузов Москва-Питер нового поколения с полным контролем процесса. Умная логистика позволяет оптимизировать направления и уменьшать время доставки до минимума. GPS-контроль, автоматические сообщения и подробная аналитика по каждой доставке в личном кабинете. Прозрачное формирование цен на основе алгоритмов и мгновенный расчет стоимости онлайн. Переходите в эпоху умной логистики вместе с нами — начните на нашей платформе.
Отличный способ завершить день — доставка ролл СПб без задержек и с высоким уровнем сервиса. Попробуйте и убедитесь.
Заказ суши – это легкая задача. Существует множество способов сделать это: от онлайн-приложений до звонка в ресторан. Каждый из этих способов предлагает определенные плюсы и минусы.
Важно учитывать мнения других клиентов при выборе суши-ресторана. Изучите мнения клиентов о качестве блюд и уровне сервиса. Такой подход позволяет минимизировать риски и сделать правильный выбор.
Проверьте меню заведения, прежде чем сделать заказ. Разные рестораны могут предлагать различные варианты суши и роллов. Выбирайте те блюда, которые вам нравятся, и не стесняйтесь пробовать что-то новое.
После оформления заказа уточните время доставки. Зная время доставки, вы сможете лучше спланировать свои дела. Также важно узнать, есть ли доставка в вашу местность.
Организуем скоростную доставку отправлений между Москвой и Санкт-Петербургом всего за 12 часов! Действуем постоянно, берем любые товары — от документов до больших товаров. Никаких скрытых доплат, полная прозрачность процесса и отчетность по каждой отправке. Экономьте время и деньги, поручая свои отправления профессионалам с большим опытом. Оставьте заявку на нашем портале и получите смету стоимости в течение часа!
Ищете ответственного транспортировщика между Москвой и Питером? Наши ребята ездят по этому маршруту каждый день и знают его как свои пять пальцев. Осознаем, что каждый товар важен для вашего дела, поэтому работаем к нему как к своему собственному. Прозрачные тарифы без накруток, полное страхование и постоянная связь с курьером. Взаимодействуем с фирмами любого размера и всегда идем навстречу. Все условия и примеры работы смотрите на нашем ресурсе.
dragon link slots online real money dragon link slots online real money .
pokiesnet http://www.pokiesnet250.com .
the pokies net 106 the pokies net 106 .
Con los drones iluminados, cada noche se convierte en una experiencia escénica única. Adaptamos nuestros diseños visuales a tus ideas y objetivos, ofreciendo un show elegante y personalizable.
Los espectáculos de drones se han vuelto muy populares en la actualidad. Estos eventos combinan tecnología, arte y entretenimiento. Las demostraciones de drones son frecuentemente vistas en festivales y celebraciones importantes.
Los drones iluminados crean patrones impresionantes en el cielo nocturno. Las audiencias suelen quedar asombradas por la combinación de luces y coreografías.
Muchos organizadores optan por contratar compañías especializadas para estos eventos. Dichas compañías tienen personal cualificado y los equipos más modernos disponibles.
El tema de la seguridad es vital en la planificación de estos shows. Se siguen procedimientos detallados para prevenir riesgos durante estas exhibiciones. El futuro de los espectáculos de drones es prometedor, con innovaciones constantes.
Цифровые грузоперевозки Москва-СПБ нового поколения с полным мониторингом процесса. Продвинутая логистика позволяет оптимизировать направления и минимизировать время транспортировки до минимума. GPS-контроль, автоматические сообщения и подробная аналитика по каждой доставке в личном кабинете. Прозрачное тарификация на основе алгоритмов и оперативный расчет стоимости онлайн. Переходите в эпоху умной логистики вместе с нами — начните на нашей сервисе.
Sonsuz sır filmi ve benzeri yapımları yüksek kalitede izlemek isteyenler için özel seçeneklerimiz bulunuyor. Favori filmleriniz için sonsuz sır sayfasını ziyaret edin.
Son yıllarda, yayın hizmetlerinin popülaritesi hızla arttı. Önemli bir trend, özellikle Full HD ve 4K çözünürlüklerde yüksek tanımlı içeriğe olan talebin artmasıdır. Tüketiciler netlik ve detay sunan sürükleyici izleme deneyimleri arıyor.
1920×1080 piksel çözünürlüğüyle Full HD formatı göz alıcı görsel netlik sunar. Bu, özellikle büyük ekranlarda her detayın fark edilebildiği durumlarda belirgindir. Ancak, 4K filmler bu deneyimi daha da ileriye taşıyarak 3840×2160 piksel gibi çok daha yüksek bir çözünürlük sunar.
Bu talebi fark eden yayın hizmetleri, geniş Full HD ve 4K film koleksiyonları sağlamaya başladı. Bu, izleyicilere yeni çıkanları ve klasik filmleri en iyi kalitede izleme imkânı tanıyor. Bunun yanında, birçok yayın hizmeti yüksek çözünürlüklü formatlara özel orijinal içerik üretimine kaynak ayırıyor.
Kısaca, yayın platformlarında Full HD ve 4K filmlerin artması izleyici zevklerindeki değişimi ortaya koyuyor. Teknoloji ilerledikçe, görsel medyayı tüketme şeklimizde daha fazla gelişme bekleyebiliriz. Bu gelişmeler kesinlikle sinema ve ev eğlencesinin geleceğini etkileyecektir.
Удобный и информативный сайт наркологической клиники поможет вам узнать о наших методах лечения зависимостей в СПб и записаться на консультацию онлайн.
В наркологической клинике пациенты находят поддержку и лечение для преодоления зависимостей. В учреждении работают опытные врачи и консультанты, которые занимаются лечением зависимостей.
Основной целью наркологической клиники является выявление и лечение проблем, связанных с зависимостями. Наркологическая клиника применяет различные методы, чтобы помочь пациентам преодолеть зависимость.
Специалисты работают с клиентами над психологическими аспектами их зависимостей. Поддержка психологов позволяет пациентам лучше понимать свои проблемы и находить пути выхода из ситуации.
Процесс реабилитации может занять различное время, в зависимости от сложности случая. Однако, завоевание контроля над своей жизнью стоит затраченных усилий.
электрические карнизы для штор в москве https://karniz-motorizovannyj77.ru/ .
айфлоу https://www.citadel-trade.ru .
Ваш загородный отдых начинается с проекта. Подберите уютный готовый проект коттеджа для семьи или гостей в нашей коллекции.
Недавно проекты домов приобрели огромную популярность среди тех, кто мечтает о собственном жилье. Правильный выбор проекта дома играет ключевую роль в создании уютного жилого пространства.
Существует множество стилей и разновидностей проектов домов. Каждый сможет подобрать проект, который будет соответствовать его вкусам и потребностям.
Одним из основных факторов при выборе проекта является размер земельного участка. Не менее значимыми являются также условия окружающей среды и климат.
Технологический прогресс помогает в создании оригинальных и уникальных проектов домов. Каждый проект можно настроить в соответствии с требованиями клиента.
Доверьтесь опыту и выбирайте жилье в Джубге через наш проверенный сервис бронирования. Мы заботимся о том, чтобы ваш отдых начался с комфортного заселения. Найдите надежное жилье в джубге.
Джубга — это прекрасное место для отдыха на Черном море. Этот курорт славится своими пляжами и живописными пейзажами.
Каждый год Джубга привлекает множество туристов, желающих увидеть его достопримечательности. К числу популярных мест относятся водопады и древние дольмены.
Джубга также радует разнообразием развлечений для семейного отдыха. Развлечения варьируются от спокойных прогулок до активных водных видов спорта, подходящих для всех.
Не забывайте об отдыхе на пляже — это важная часть вашего времени в Джубге. Здесь вы сможете наслаждаться солнцем и морскими волнами, а также попробовать местные блюда в кафе.
Обеспечиваем быструю доставку отправлений между Москвой и СПБ всего за 12 часов! Функционируем каждый день, перевозим любые отправления — от документов до больших товаров. Никаких скрытых платежей, полная честность процесса и документооборот по каждой доставке. Сохраняйте время и деньги, передавая свои товары специалистам с большим опытом. Оставьте заявку на нашем портале и получите расчет стоимости в течение часа!
Ищете ответственного транспортировщика между Москвой и СПБ? Наши ребята курсируют по этому направлению каждый день и знают его как свои пять пальцев. Понимаем, что каждый отправление важен для вашего дела, поэтому относимся к нему как к своему собственному. Прозрачные тарифы без завышений, полное покрытие и постоянная связь с курьером. Работаем с компаниями любого размера и всегда идем навстречу. Все условия и примеры работы смотрите на нашем портале.
Узнайте точную стоимость проживания для планируемых дат. Мы предлагаем прозрачную отдых в абхазии цена без скрытых комиссий.
Абхазия — удивительное место для отдыха, полное красоты и уникальности. Её живописные пейзажи, мягкий климат и теплое море привлекают туристов со всего мира.
Многочисленные туристы выбирают Абхазию как идеальное место для отдыха и развлечений. Отдых в Абхазии предлагает как спокойные пляжные дни, так и захватывающие приключения.
Местные курорты предлагают множество вариантов размещения от бюджетных гостиниц до роскошных отелей. Кроме того, здесь можно насладиться вкусной местной кухней и разнообразием культурных мероприятий.
Путешествие в Абхазию станет прекрасной возможностью для расслабления и восстановления сил. Посетите Абхазию, и вы сможете насладиться её природными красотами и культурным наследием.
Сочетание спокойствия, комфорта и эстетики делает аренда яхт в сочи отличным выбором как для уединения, так и для яркого праздника на воде.
Аренда яхты — это увлекательный способ провести время на воде. Плавание на яхте открывает перед вами удивительные горизонты и дарит незабываемые впечатления.
Выбор яхты — важный этап в организации вашего путешествия. Необходимо учитывать тип и размер яхты, чтобы она соответствовала вашим требованиям.
При аренде яхты важно внимательно изучить все пункты договора. Некоторые сервисы предлагают дополнительные услуги, включая услуги профессионального капитана.
Также стоит уделить внимание планированию маршрута вашего плавания. Посетите популярные места, такие как уединенные бухты или живописные острова.
En la compañía de espectáculos de luces con drones, creamos eventos únicos donde cada segundo es una obra de arte aérea. Nos apasiona iluminar emociones y generar impacto visual inolvidable.
La popularidad de los espectáculos de drones ha crecido exponencialmente en los últimos tiempos. Estos espectáculos fusionan innovación tecnológica, expresión artística y entretenimiento. Las demostraciones de drones son frecuentemente vistas en festivales y celebraciones importantes.
Los drones que llevan luces crean diseños asombrosos en el cielo oscuro. Las audiencias suelen quedar asombradas por la combinación de luces y coreografías.
Varios organizadores deciden recurrir a compañías dedicadas a la producción de espectáculos de drones. Estas organizaciones poseen pilotos entrenados y tecnología avanzada.
La seguridad representa un factor fundamental en la realización de estos eventos. Se implementan protocolos rigurosos para garantizar la protección de los asistentes. El futuro de los espectáculos de drones es prometedor, con innovaciones constantes.
Опытный нарколог в наркологической клинике – основа успешного лечения зависимостей в СПб. Профессиональная диагностика и подбор методов терапии.
В наркологической клинике пациенты находят поддержку и лечение для преодоления зависимостей. Здесь работают квалифицированные специалисты, готовые помочь каждому пациенту.
Одной из главных задач клиники является диагностика и лечение алкогольной и наркотической зависимости. Наркологическая клиника применяет различные методы, чтобы помочь пациентам преодолеть зависимость.
Клиника предлагает психотерапевтические сессии для укрепления решения пациента. Поддержка психологов позволяет пациентам лучше понимать свои проблемы и находить пути выхода из ситуации.
Процесс реабилитации может занять различное время, в зависимости от сложности случая. Несмотря на сложности, победа над зависимостью крайне ценна.
прогнозы на спорт точные прогнозы на спорт точные .
прогнозы хоккей http://luchshie-prognozy-na-khokkej1.ru .
mostbet mobil tətbiqi https://www.mostbet3041.ru
Сезон 2025: узнайте о трендах в размещении и новых удобствах. Актуальный обзор рынка жилье в архипо осиповке 2025 поможет сделать правильный выбор.
Архипо-Осиповка — идеальное направление для вашего летнего отпуска. Отдых в этом курортном поселке привлекает туристов своим мягким климатом и великолепными видами.
Пляжи этого курорта известны своим чистым песком и спокойными водами. Купание и водные развлечения делают отдых здесь незабываемым.
Архипо-Осиповка предлагает разнообразные варианты проживания для туристов. Гостиницы и частные номера в Архипо-Осиповке подойдут как для романтического уикенда, так и для семейного отдыха.
Здесь вы найдете множество развлечений для всей семьи. Разнообразные экскурсии и культурные события позволят вам глубже узнать местную культуру.
enclomiphene testosterone: buy enclomiphene online — enclomiphene for sale
alliance rx specialty pharmacy: precision pharmacy omeprazole — RxFree Meds
enclomiphene price: buy enclomiphene online — enclomiphene price
напольные горшки для комнатных цветов kashpo-napolnoe-rnd.ru — kashpo-napolnoe-rnd.ru .
https://farmaciaasequible.shop/# Farmacia Asequible