Сухая почва 0 Мокрая почва началась с -162 и убывает дальше до -274, потом загорается 268, это как так?
Достал из земли, получил 0, вставил в землю и вот значения подряд (они отрицательные!): -276 -279 -281 -282 -284 -285 -286 -287 -291 -292 -293 Дошло до -309 и идет дальше вниз.
Достал из горшка на -317 и вставил в воду. Заметил, что если погружать самый кончик, то значения будут в духе: -91 -97 -103 А если опустить в воду до середины, то: 24 19 16
Отрицательных значений не должно быть ни при каких условиях. analogRead возвращает числа от 0 до 1023. Может быть дисплей криво подключен или библиотека чудит.
Библиотека QuadDisplay2 неявно использует пины SCK и MOSI. Код (C++): QuadDisplay::QuadDisplay(uint8_t pinCS) { _pinCS = pinCS; _pinSCK = SCK; _pinDI = MOSI; }
Это я мысли высказываю. Вот распиновка для MOSI и SCK. У вас Arduino UNO? https://www.arduino.cc/en/Reference/SPI
Сделал Код (C++): // Подключаем библиотеку для работы с дальномером #include <NewPing.h> // Подключаем библиотеку для работы с дисплеем #include <QuadDisplay2.h> // Задаем имя пина, к которому подключен силовой ключ помпы #define POMP_PIN 4 // Задаем имя пина, к которому подключен силовой ключ датчика влажности почвы #define DAT_PIN 3 // Задаем имя пина, к которому подключен Триг, который посылает звук #define trig_pin 9 // Задаем имя пина, к которому подключено Эхо, принимающее звук #define echo_pin 8 // Задаем имя пина, к которому подключён датчик влажности почвы #define HUMIDITY_PIN A0 // Задаем переменную минимального порога влажности почвы #define HUMIDITY_MIN 350 // Задаем переменную максимального порога влажности почвы #define HUMIDITY_MAX 600 // Задаем максимальную дистанцию, что мы хотим пингануть в сантиметрах (150 см), предел нашего модуля 400-500 см #define max_dist 150 // Создаём объект класса QuadDisplay и передаём номер пина CS QuadDisplay qd(10); // Задаем переменнуя для хранения показания влажности почвы unsigned int humidity = 0; // NewPing setup of pins and maximum distance. NewPing sonar(trig_pin, echo_pin, max_dist); void setup(void) { // Включаем пин силового ключа помпы в режим выхода pinMode(POMP_PIN, OUTPUT); // Включаем пин силового ключа датчика влажности почвы в режим выхода pinMode(DAT_PIN, OUTPUT); // Начинаем работать с дисплеем qd.begin(); // Open serial monitor at 115200 baud to see ping results. Serial.begin(9600); // Выводим "Load" на дисплей qd.displayDigits(0b11100011, 0b11000101, 0b00000101, 0b10000101); } void loop(void) { delay(50); // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings. Serial.print("Ping: "); Serial.print(sonar.ping_cm()); // Send ping, get distance in cm and print result (0 = outside set distance range) Serial.println("cm"); //даем питание на силовой ключ датчика почвы digitalWrite(DAT_PIN, HIGH); // считываем текущее показания датчика влажности почвы int humidityNow(0); for(int i=0; i< 100; i++) { delay(10); humidityNow += analogRead(HUMIDITY_PIN); } humidityNow /=100; Serial.println(humidityNow); // если показания текущей влажности почвы // не равняется предыдущему запросу if(humidityNow != humidity) { // сохраняем текущие показания влажности humidity= humidityNow; // и выводим показания влажности на дисплей qd.displayInt(humidityNow); } //отключаем питание датчика почвы digitalWrite(DAT_PIN, LOW); // если значение датчика влажности меньше допустимой границы if (humidity < HUMIDITY_MIN) { // включаем помпу digitalWrite(POMP_PIN, HIGH); // ждём 3 секунды delay(3000); // выключаем помпу digitalWrite(POMP_PIN, LOW); } //задержка в 5 секунд - потом цикл по новой delay(5000); } Сунул в воду (до середины), показания монитора и экрана совпали, вот лог монитора: Ping: 17cm 0 Ping: 14cm 23 Ping: 25 41 Ping: 27 41 Ping: 24 47 Сунул во влажную землю (конец) получил совпадение монитора и лога, вот лог (пинг я не стал указывать, он нам не нужен): 143 163 159 158 Почему все стало так?
Должно быть так: Пин SS ( CS ) можно выбрать другой (например 9) и свой выбор передать в . Код (C++): QuadDisplay qd(9); SS (?, например 9) -> CS MOSI (11) -> DI SCK (13) -> прямоугольный импульс.
Такс, сейчас расскажу как у меня. У меня сей монитор подключен по 6 проводам. CS, V и G подключены как на картинке выше, где монитор подключается к шилду, но к 10, а не к 9. А DI, неподписанный контакт и Прямоугольный импульс у меня подключены иначе, а именно: DI к D0 Неподписанный к DI Прямоугольный к прямоугольному (Эти три контакта в нижнем правом углу шилда.) Надо иначе подключить? На картинке мое подключение, только у меня к 10, а на картинке к 9.
Бывает. То скетч не тот загрузят, то еще что. Из того что я увидел должно работать. если без отладки снова глючить начнет, придется глубже копать
И как быть? Прост отказаться от среднего значения и мерить так, как мерил раньше? И такой вопрос - как мне занести данные пинга в переменную, чтобы потом в зависимости от значения этой перменной совершать те или иные действия? (Посмотрите сообщение 39 в этой теме)
Всем доброго времени суток, я так же зелёный пока в написании скетчей для ардуино, но я быстро учусь... Подсказал бы кто то в каком направлении двигаться. Прикупил недавно GSM shield Sim900 для ардуино уно и уже собрал из этого маленькое чудо под названием " Не тронь АКБ " а то выйду тихонько и укушу. НУ в общем всё даже работает если только не одно НО. На сайте амперки я нашёл скетч управления исходящими вызовами с кнопки( в моём случае это концевик под капотом, только вот беда, он не доработан и расчитан на тест шилда. Мне немного повезло и я нарыл инфу и добавил функцию delay(15000). Теперь звонит каждые 15 секунд, а не однократно как было изначально прописано в скетче. А вот в чём собственно вопрос друзья: Как доработать скетч чтоб не использовать делей, но при этом создать определённый цикл, который будет повторяться если вызываемый абонент сбросил или недоступен. НУ или не повторяться а звонить в таком случае на другой номер. ЗАранее благодарю за помощь. Прилагаю скетч оригинал и слегка доработанный мной. Код (C++): Call_button.ino #include <SoftwareSerial.h> SoftwareSerial gprsSerial(7, 8); int btnPin = 12; boolean prevBtn = LOW; void setup() { gprsSerial.begin(19200); } void loop() { boolean currBtn = digitalRead(btnPin); if (prevBtn != currBtn && currBtn == HIGH) { //сразу после нажатия кнопки начинаем звонить по заданному номеру gprsSerial.println("ATD + +79031034424;"); } prevBtn = currBtn; } Это оригинал. Код (C++): SoftwareSerial gprsSerial(7, 8); int btnPin = 12; boolean prevBtn = HIGH; void setup() { gprsSerial.begin(19200); //Включаем GPRS Shield, эмулируя нажатие кнопки POWER pinMode(9, OUTPUT); digitalWrite(9, HIGH); // Подаем High на пин 9 delay(3000); // на 3 секунды digitalWrite(9, LOW); // и отпускаем в Low. delay(5000); // Ждём 5 секунд для старта шилда } void loop() { boolean currBtn = digitalRead(btnPin); if (prevBtn != currBtn && currBtn == LOW) { //сразу после нажатия кнопки начинаем звонить по заданному номеру gprsSerial.println("ATD + +380686617468;"); delay(10000); } prevBtn = currBtn; } А вот это с моими криворукими доработками)