Сделай сам своими руками https://oldoctober.com/forum/ |
|
Датчик движения на базе HW-MS03 и NodeMCU https://oldoctober.com/forum/viewtopic.php?f=9&t=1536 |
Страница 1 из 1 |
Автор: | user314 [ 10 июн 2020, 12:36 ] |
Заголовок сообщения: | Датчик движения на базе HW-MS03 и NodeMCU |
Есть задумка реализовать датчик движения на китайских готовых модулях. Смысл в том, чтобы это устройство большую часть времени находилось в режиме глубокого сна и лишь в момент обнаружения движения, просыпалось, отправляло данных по WI-FI и засыпало снова до следующего обнаружения. Сам датчик движения (HW-MS03) при обнаружении формирует и удерживет на выходе логическую единицу в течение трёх секунд после прекращения движения, то есть: "движение + ещё 3 секунды с момента прекращения движения". Чтобы пробудить устройство NodeMCU нужно подать лишь короткий импульс на сброс. Вопрос заключается в том, как сформировать такой короткий импульс из длинного, да ещё и с регулируемым тайм-аутом, то есть устройство должно гарантированно не сброситься снова до тех пор, пока полностью не завершит отправку данных и снова не перейдёт в режим сна. Просто оставить NodeMCU включенным нельзя, так как питание осуществляется от Li-Ion батареи и потребляет ощутимый ток в размере 100mA. Прототип представлю ниже: Вложение: Вложение: Где между датчиком и полевым транзистором неизвестное пока устройств, которое нужно придумать. Гугление не дало никаких ощутимых результатов. Есть вот такой подход, где применяется программный "костыль": https://www.youtube.com/watch?v=pPd362tRx5o , но мне этот путь не нравится, получается какой-то компромисс, мне он до конца не понятен, а надо-то всего сформировать короткий импульс вместо длинного. Нужен какой-то одновибратор, только какой? |
Автор: | Iurii [ 10 июн 2020, 18:30 ] |
Заголовок сообщения: | Re: Формирователь короткого импульса для сброса NodeMCU |
user314 Это делает дифференцирующая цепь. Конденсатор заряжается с постоянной времени RC. Можно какой-нибудь КМОП элемент прицепить, чтобы сделать фронт и тыл импульса крутыми. Тогда ещё и размер конденсатора снизится на пару порядков, если длительность импульса требуется большая. |
Автор: | user314 [ 12 июн 2020, 11:26 ] |
Заголовок сообщения: | Re: Формирователь короткого импульса для сброса NodeMCU |
Спасибо за подсказку, всё получилось! Чуть позже выложу полную схему и скетч, когда всё доведу до ума. |
Автор: | user314 [ 15 июн 2020, 15:21 ] |
Заголовок сообщения: | Re: Формирователь короткого импульса для сброса NodeMCU |
Итак, вот что у меня получилось: Вложение: Цепочка C1, R2 и Q2 дёргают сброс wifi устройства. Q1 выполняет роль блокировки, до тех пор пока устройство не выполнит все функции и не перейдёт в режим сна. В ходе экспериментов спалил пару транзисторов Q1, пока не дошло, что R1 нужен обязательно, иначе импульсом пробивается сток-исток (а может и паразитный диод?). R3 и R4 делит напряжение пропорционально до 3.3 вольта (максимум аналогового входа) при 4.2 на аккумуляторе и отправляет это значение по указанному адресу в скетче, он представлен ниже (не понял как под кат убрать): Код: #include <ESP8266WiFi.h> // Include the Wi-Fi library const byte holdPin = 12; // The pin which holds the ESP/NodeMCU in working state during data sends const byte ledPin = 13; // Test pin for led const int analogInPin = A0; // The pin where tests battery voltage const char* ssid = "SSID_NAME"; // The SSID (name) of the Wi-Fi network you want to connect to const char* password = "password"; // The password of the Wi-Fi network const char* host = "192.168.0.10"; // Either name or IP of the host to send data const int httpPort = 10000; // The port int sensorValue = 0; int outputValue = 0; void setup() { pinMode(ledPin, OUTPUT); pinMode(holdPin, OUTPUT); digitalWrite(ledPin, HIGH); digitalWrite(holdPin, HIGH); sensorValue = analogRead(analogInPin); outputValue = map(sensorValue, 0, 1024, 0, 42); // e.g 4.2 Voltage for Li-Ion battery Serial.begin(115200); // Start the Serial communication to send messages to the computer delay(10); Serial.println('\n'); Serial.println(); Serial.print("MAC: "); Serial.println(WiFi.macAddress()); // Send the MAC address of the ESP8266 to the computer Serial.println(); Serial.print("Battery Voltage: "); Serial.print(outputValue); // Connect to the network Serial.println(); WiFi.begin(ssid, password); Serial.print("Connecting to "); Serial.print(ssid); Serial.println(" ..."); int i = 0; while (WiFi.status() != WL_CONNECTED) { // Wait for the Wi-Fi to connect delay(1000); Serial.print(++i); Serial.print(' '); if (i > 10) { Serial.println('\n'); Serial.print("Connection failed to "); Serial.println(ssid); ESP.deepSleep(0); } } Serial.println('\n'); Serial.println("Connection established!"); Serial.print("IP address:\t"); Serial.println(WiFi.localIP()); // Send the IP address of the ESP8266 to the computer // Logging data to cloud Serial.println(); WiFiClient client; Serial.print("Sending data to "); Serial.println(host); // Use WiFiClient class to create TCP connections int l = 0; while (!client.connect(host, httpPort)) { delay(1000); Serial.print(++l); Serial.print(' '); if (l > 10) { Serial.println('\n'); Serial.print("Sending failed to "); Serial.println(host); ESP.deepSleep(0); } } // This will send the request to the server client.print("Host: " + WiFi.hostname() + " / Battery Voltage: " + outputValue + " \r\n"); delay(500); client.stop(); Serial.println("\r"); Serial.println("Data sent, communication closed!"); delay(100); ESP.deepSleep(0); } void loop() { } const char* ssid - имя точки доступа const char* password - пароль const char* host - куда отправлять (имя или ip) const int httpPort - порт Далее я применил программу socat и шелл скрипт, который запускается каждый раз при получении данных от датчика: Код: socat TCP4-LISTEN:10000,fork,reuseaddr EXEC:./catch_motion_event.sh & Код: #!/bin/bash while read line; do beep echo "$(date +%F" "%H:%M:%S) / $line"; done >> catch_motion_event.log Каждое срабатывание регистрируется в лог и пикает спикер на сервере с запущеным socat. Код: # cat catch_motion_event.log 2020-06-15 14:13:35 / Host: ESP-223311 / Battery Voltage: 42 2020-06-15 14:14:07 / Host: ESP-223311 / Battery Voltage: 42 2020-06-15 14:14:21 / Host: ESP-223311 / Battery Voltage: 42 2020-06-15 14:16:06 / Host: ESP-223311 / Battery Voltage: 42 2020-06-15 14:16:43 / Host: ESP-223311 / Battery Voltage: 42 На этом пока всё. |
Автор: | Iurii [ 15 июн 2020, 17:39 ] |
Заголовок сообщения: | Re: Датчик движения на базе HW-MS03 и NodeMCU |
user314 писал(а): В ходе экспериментов спалил пару транзисторов Q1 При эксплуатации транзисторы с изолированным затвором вообще нежелательно оставлять затвор в воздухе. У некоторых типов транзистор можно пробить переход статическим напряжением в пару десятков Вольт. Я даже когда-то давно придумал вот такую схему защиты, которая позволяла работать транзисторам при токе менее 100nA. |
Автор: | user314 [ 15 июн 2020, 19:50 ] |
Заголовок сообщения: | Re: Датчик движения на базе HW-MS03 и NodeMCU |
Iurii писал(а): При эксплуатации транзисторы с изолированным затвором вообще нежелательно оставлять затвор в воздухе. У некоторых типов транзистор можно пробить переход статическим напряжением в пару десятков Вольт. Я даже когда-то давно придумал вот такую схему защиты, которая позволяла работать транзисторам при токе менее 100nA. А я вот всегда забываю, что эти приборы "хлипкие" при грубом обращении, поэтому каждый раз всё сначала. Видимо привычка думать, что современные полевики менее подвержены статическим разрядам. |
Автор: | Iurii [ 15 июн 2020, 22:22 ] |
Заголовок сообщения: | Re: Датчик движения на базе HW-MS03 и NodeMCU |
user314 Я думаю путаницу в умы внесли гибридные униполярные транзисторы, затвор которых прячется за биполярным транзистором. Всегда жалею себя по этому поводу. Когда я серьёзно увлекался радиотехникой мощных униполярных транзисторов вообще не было и сократить потери переключателя можно было разве что с помощью реле. Сейчас же раздолье. Можно построить преобразователь на 10-20 Ампер размером с несколько спичечных головок. |
Автор: | dostuk [ 16 июн 2020, 10:37 ] |
Заголовок сообщения: | Re: Датчик движения на базе HW-MS03 и NodeMCU |
Иногда требуется сформировать импульс управления и по фронту, и по спаду управляющего напряжения. Испытал следующую несложную схему: Вложение: Счетверение элементов используется для умощнения выхода. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |