Jump to content

URRS

Members
  • Content Count

    29
  • Joined

  • Last visited

Community Reputation

0 Обычный

About URRS

  • Rank
    Новенький

Информация

  • Пол
    Мужчина
  • Город
    Заолярный, ЯНАО

Электроника

  • Стаж в электронике
    10-20 лет
  • Сфера радиоэлектроники
    Радиосвязь!

Recent Profile Visitors

547 profile views
  1. Разобрался. В void setup() установил таймер timer.setInterval(1000L, nik); и все заработало. Всем спасибо.
  2. Всем привет. Хотел уточнить вопрос по работе void nik(). При выполнении скетча программа в упор не хочет ее выполнять. А все задачи в Blynk выполняются без проблем. Почему игнорит void nik()? Хотя компилирует без проблем. Пример скетча: #define PIN_DIG_RAIN_KITCHEN D0 #define PIN_MOTOR1_A1A D1 #define PIN_MOTOR1_A1B D2 #define BLYNK_PRINT Serial #include <ESP8266WiFi.h> #include <BlynkSimpleEsp8266.h> char auth[] = "ччч"; char ssid[] = "ччч"; char pass[] = "ччч"; void setup() { Serial.begin(115200); Blynk.begin(auth, ssid, pass); //УСТАНОВКА КОНТАКТОВ НА ВХОД ИЛИ ВЫХОД pinMode(PIN_MOTOR1_A1A, OUTPUT); pinMode(PIN_MOTOR1_A1B, OUTPUT); pinMode(PIN_DIG_RAIN_KITCHEN, INPUT); void nik(){ int sensorValue = digitalRead(PIN_DIG_RAIN_KITCHEN);//& digitalRead(PIN_DIG_RAIN_BATHROOM); //|(PIN_DIG_RAIN_TOILET); Serial.print("Цифра: "); Serial.println(sensorValue); switch (sensorValue) { case 0: Serial.print("ПРОТЕЧКА");//выполняется, когда sensorValue равно 0 digitalWrite(PIN_MOTOR1_A1A, LOW); digitalWrite(PIN_MOTOR1_A1B, HIGH); break; case 1: Serial.print("СИСТЕМА ВОДОСНОБЖЕНИЯ В РАБОТЕ");//выполняется когда sensorValue равно 1 digitalWrite(PIN_MOTOR1_A1A, HIGH); digitalWrite(PIN_MOTOR1_A1B, LOW); break; } } BLYNK_WRITE(V1){ //опция "MENU" switch(param.asInt()){ case 1: //Item 1 digitalWrite(PIN_MOTOR1_A1B, HIGH); digitalWrite(PIN_MOTOR1_A1A, LOW); Serial.println("Закрыть кран"); delay (10000); digitalWrite(PIN_MOTOR1_A1B, LOW); break; case 2: //Item 2 digitalWrite(PIN_MOTOR1_A1B, LOW); digitalWrite(PIN_MOTOR1_A1A, HIGH); Serial.println("Открыть кран"); delay (10000); digitalWrite(PIN_MOTOR1_A1A, LOW); break; } } void loop() { Blynk.run(); timer.run(); }
  3. Проект: Датчик направления ветра на ATMEGA8 и выводом на LCD_5110(Nokia_3310) Представляю вариант датчика направления ветра с точностью до 16 направлений (22,5 градуса). Принцип его действия прост и основан на оптическом формировании информации. А именно: сверху ставиться ИК светодиод, снизу (по направлению друг к другу) ИК фотодиод, а между ними пластинка с отверстием. При прохождении света через отверстие свет поступает на ИК фотодиод и он посылает сигнал на МК (см.рисунок). Существуют два сигнала: есть свет или нет, т.е. логический «0» или «1». Можем получить два значения, но если установить 4 свето и фото диода, то получим 42=16 значений (4 бита информации). Плюсы оптической схемы формирования сигнала информации: лёгкость исполнения, точность, сжатие информации (4 бита = 16 значений), широкое применение в сфере электроники (пож.датчик, волоконно-оптические системы передач и т.д., малые энергозатраты (и т.д.), низкая цена реализации. //Atmega8 #define F_CPU 8000000 //частота 8МГц #include <avr/io.h> #include "n5110.h" //Библиотека LCD Nokia3310 #include <util/delay.h> #include <stdlib.h> int main(void) { Lcd_init(); //Инициализация дисплея Lcd_clear(); //Чистка дисплея PORTC |= (1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC3); //Порт 0,1,2,3 включены на приём while(1) { switch(PINC & 0x0F) //Вывод направления ветра на дисплей (PINC & 0b1111) { case 15: Lcd_prints(0,1,FONT_1X,(unsigned char *)PSTR("ВОСТОЧНЫЙ ")); break; case 14: Lcd_prints(0,1,FONT_1X,(unsigned char *)PSTR("В-В-СЕВЕРНЫЙ ")); break; case 13: Lcd_prints(0,1,FONT_1X,(unsigned char *)PSTR("С-С-ВОСТОЧНЫЙ ")); break; case 12: Lcd_prints(0,1,FONT_1X,(unsigned char *)PSTR("СЕВЕРО-ВОСТОЧНЫЙ")); break; case 11: Lcd_prints(0,1,FONT_1X,(unsigned char *)PSTR("З-З-СЕВЕРНЫЙ ")); break; case 10: Lcd_prints(0,1,FONT_1X,(unsigned char *)PSTR("СЕВЕРО-ЗАПАДНЫЙ ")); break; case 9: Lcd_prints(0,1,FONT_1X,(unsigned char *)PSTR("СЕВЕРНЫЙ ")); break; case 8: Lcd_prints(0,1,FONT_1X,(unsigned char *)PSTR("С-С-ЗАПАДНЫЙ ")); break; case 7: Lcd_prints(0,1,FONT_1X,(unsigned char *)PSTR("В-В-ЮЖНЫЙ ")); break; case 6: Lcd_prints(0,1,FONT_1X,(unsigned char *)PSTR("ЮГО-ВОСТОЧНЫЙ ")); break; case 5: Lcd_prints(0,1,FONT_1X,(unsigned char *)PSTR("ЮЖНЫЙ ")); break; case 4: Lcd_prints(0,1,FONT_1X,(unsigned char *)PSTR("Ю-Ю-ВОСТОЧНЫЙ ")); break; case 3: Lcd_prints(0,1,FONT_1X,(unsigned char *)PSTR("ЗАПАДНЫЙ ")); break; case 2: Lcd_prints(0,1,FONT_1X,(unsigned char *)PSTR("З-З-ЮЖНЫЙ ")); break; case 1: Lcd_prints(0,1,FONT_1X,(unsigned char *)PSTR("Ю-Ю-ЗАПАДНЫЙ ")); break; case 0: Lcd_prints(0,1,FONT_1X,(unsigned char *)PSTR("ЮГО-ЗАПАДНЫЙ ")); break; default: break; } //Вывод на дисплей LCD_5110(Nokia3310) Lcd_prints(4,0, FONT_1X, (unsigned char*)PSTR("ВЕТЕР:")); Lcd_update(); //Копирование буфера в ОЗУ дисплея _delay_ms(200); //Задержка } } Весь наработанный материал размещен в архиве (код с++, схема, коды направлений, фото разработки, схема в Proteus 7.10 SP0, библиотека). Проект находится на стадии разработки и любые внедрения и модернизации будут приветствоваться. Если кто подскажет с помощью какой функции можно собрать датчик скорости ветра (частотомер) с моделью: замерить количество импульсов за 10 секунд (таймер и буфер), после сравнить результат с табличным (10-20 импульсов = 2м/с, 20-30 имп = 3м/с и т.д.) и вывести на экран LCD? Данный проект был задуман для контроля направления ветра (получить информацию), чтоб в сильный ветер поворачивать крупногабаритные радиолюбительские антенны и уменьшить их парусность. Wind_direction_proj.rar
  4. Проект: Домашняя метеостанция на Atmega8 датчик DHT11 с выводом на LCD_Nokia3310(5110). Выкладываю готовый проект с кодом для Atmel Studio 6.1, схемой для Proteus 7.10 SP0 (т.к. библиотека дисплея подходит только под эту версию), фото для выставления Fuses и всеми необходимыми библиотеками (LCD_3310(5110), DHT11). Вдруг кого заинтересует. Проект делал для дополнения функционала датчика направления ветра, далее и его выложу. Все коды были исправлены и написаны при участии ребят с местного форума. Сам слабоват в коде С++, за что им респект и уважение! Прикрепляю код с более крупным шрифтом и возможным выводом дробного значения (закомпилирован)... //Atmega8 #define F_CPU 8000000 //частота 8МГц #include <avr/io.h> //Библиотека #include "n5110.h" //Библиотека LCD Nokia3310 #include <util/delay.h> #include <stdlib.h> #include "dht11.h" char buffer[8]; //Переменная buffer int main( void ){ Lcd_init(); // Инициализация LCD дисплея Lcd_clear(); // Очистка дисплея int8_t temperature = 0; //Установка параметров из библиотеки dht11.h int8_t humidity = 0; //Установка параметров из библиотеки dht11.h while(1){ temperature = dht11_gettemperature(); //Присвоение переменной - температура _delay_ms(800); //Задержка humidity = dht11_gethumidity(); //Присвоение переменной - влажность _delay_ms(800); //Задержка Lcd_prints(0,3, FONT_1X, (unsigned char*)PSTR("ТЕМПЕР ВЛАЖН")); Lcd_print(0,5,FONT_2X,(unsigned char*) itoa(temperature, buffer, 10)); //Вывод на дисплей переменную //Lcd_printf(0,5, FONT_2X, temperature, 1); //Пример вывод переменной с дробной частью Lcd_prints(4,5, FONT_2X, (unsigned char*)PSTR("C")); Lcd_print(8,5,FONT_2X,(unsigned char*) itoa(humidity, buffer, 10)); //Вывод на дисплей переменную Lcd_prints(12,5, FONT_2X, (unsigned char*)PSTR("%")); _delay_ms(200); //Задержка Lcd_update(); //Копирование буфера в ОЗУ дисплея } } DHT11_proj.rar
  5. Урааа, заработало!!!@snn_krs Спасибо большущее! Сейчас допишу и выложу материал, вдруг кому пригодиться. К датчику направления ветра (16 направлений) пришлепаю, будет более функциональнее. Еще раз спасибо!
  6. humidity = 30;//dht11_gethumidity(); temperature = 5;//dht11_gettemperature(); Lcd_print(0,0,FONT_1X,(unsigned char*) itoa(humidity, buffer, 10)); //Вывод на дисплей переменную Lcd_print(0,1,FONT_1X,(unsigned char*) itoa(temperature, buffer, 10)); //Вывод на дисплей переменную Как только поменял, 30 и 5 на дисплее появились. Значит вопросы к библиотеке... И в макетке так же отображается. Попробую библиотеку поискать и заменить. @snn_krs спасибо за помощь.
  7. @snn_krs приветствую! Перед сборкой схемы поменял в библиотеке на РС4. Так по схеме удобно. Надо выполнить 3 этапа: 1 Объявляем переменную (char buffer[8]); 2 присвоение переменной ...ххх... значения; 3 выводим полученного значения переменной на экран. Чую что значение не присвоил переменной... (пункт 2 пропущен). Вот код предложенный одним из пользователей к датчику, но дисплей у него другой. char buffer[8]; int main( void ) { LCDinit(); // Инициализация LCD LCDcursorOFF(); // Выключаем курсоор LCDclr(); // Очищаем дисплей int8_t temperature = 0; //ХЗ что это int8_t?? int8_t humidity = 0; //ХЗ что это int8_t?? while(1) { humidity = dht11_gethumidity(); //Обращение к установкам в библиотеке (значение) влажности temperature = dht11_gettemperature(); //...-...- //по коду видно, что переменная и ее значения присутствуют со статическим тексттом LCDGotoXY(0,0); //Координаты на дисплее sprintf(buffer, "T=%02d", temperature); //Переменная и ее значение + статика LCDstring(buffer,4); //Переменная и количество знаков после запятой LCDGotoXY(0,1); sprintf(buffer, "H=%02d", humidity); LCDstring(buffer,4); } }
  8. Всем здравствуйте. Попался в руки датчик температуры и влажности DHT11, решил приляпать к atmege8, а в результате переменную не могу вывести. Подскажите по коду, где слажал. Жаль примеров почти нет. Картинки и код прилагаются. Заранее спасибо! //Atmega8 #define F_CPU 8000000 //частота 8МГц #include <avr/io.h> #include "n5110.h" //Библиотека LCD Nokia3310 #include <util/delay.h> #include <stdlib.h> #include "dht11.h" char buffer[8]; //Переменная int main( void ){ Lcd_init(); // Инициализация LCD Lcd_clear(); // Очистка дисплея int8_t temperature = 0; //Установка параметров из библиотеки dht11.h int8_t humidity = 0; //Установка параметров из библиотеки dht11.h while(1) { humidity = dht11_gethumidity(); temperature = dht11_gettemperature(); itoa(temperature, buffer, 10); Lcd_printf(0,1, FONT_1X, humidity, 0); //Вывод дробного значения (и так уже попробовал) Lcd_printf(0,2, FONT_1X, temperature, 0); //Вывод дробного значения (и так уже попробовал) Lcd_print(0,3,FONT_1X,(unsigned char*) buffer); //Вывод на дисплей переменную Lcd_update(); //Копирование буфера в ОЗУ дисплея _delay_ms(200); //Задержка } }
  9. @Berg ,большущее спасибо!!!! Всё работает. Теперь усовершенствуем до 16 значений (изучим функцию switch), добавим задержки, тестинг и монтаж! Теперь антенна Яги будет под защитой от ветра (лобового порыва). Как соберу, фото прилажу. С уважением, Николай (Rx9chy/8) с полярного круга! @COKPOWEHEU книга «Язык Си» шикарная, как раз для таких как я!!! Очень интересная! Спасибо!
  10. @S1BaR1T , приветствую. Свой дисплей подсоединил нормально. Контакты и в правду на твоём как то по другому. Но от перемены слагаемых... // Распиновка порта (из библиотеки n5110.h) LCD_DC_PIN PB1 // DC LCD_CE_PIN PB2 // SCE SPI_MOSI_PIN PB3 // SDIN LCD_RST_PIN PB4 // RESET SPI_CLK_PIN PB5 // SCLK Твоя распиновка: 1 Vcc - +5V( или 3.3V) 2 GND -5V 3 LCD_CE_PIN PB2 // SCE 4 LCD_RST_PIN PB4 // RESET 5 LCD_DC_PIN PB1 // DC 6 SPI_MOSI_PIN PB3 // SDIN 7 SPI_CLK_PIN PB5 // SCLK 8 подсветка дисплея +5В или 3,3 (на усмотрение). Во вложении рабочий код с библиотекой на дисплей, схема протеуса 7. LCD_5110.zip LCD proj.rar lcd_5110.DSN
  11. По поводу void name{....} предположил, что туда вписывают основные настройки портов (предустановки). А в main{name()....} основной код. Посоветуйте литературу по Си для чайников с «0»? Для тех кто к программированию отношение не имел (технарь).
  12. Прошляпил. Не совсем понимаю, что вписывать в void setup{???основные установки?} далее int main{setup()while(1){???цикл или циклы выполнения кода?}}. В общем вопросов море, а книга одна "1000 и одна микроконтроллерная схема". Пока техн часть...
  13. Всем добрый вечер! Прикрепил код в Си и схему для протеуса (AS 6.1, Proteus 7).Вывод переменной на LCD (Lcd_print(x,y, FONT_1X, (unsigned char*)some_char);) @COKPOWEHEU , тестил всякие варианты, dir_arr никак не хочет воспринимать . Анемометр.rar
  14. Технически анемометр готов. По началу хотел собрать на герконах, да к это банально. Подумав решил сжать в двоичную систему для увеличения количества направлений. 4 фотодиода, 2 ист света и круглая пластинка с прорезями между ними (свет пройдя через вращаемую ветром пластинку попадет на фотодиод нужного бита и сформирует сигнал). Проще, легче и магнит не нужен. А с кодом засада вышла. Как программе сказать вот 4 бита (0,1,2,3), сравни с табличными значениями и выдай текст. Как то так...
  15. @dm37 , приветствую! Читал. все вроде просто, а в переменную никак не могу заставить работать. Точнее правильно ли я формирую. Думал так: const char string_0[] PROGMEM = "String 0"; // "String 0" и т.д. - это содержимое строк; если необходимо меняйте его const char string_1[] PROGMEM = "String 1"; const char string_2[] PROGMEM = "String 2"; const char string_3[] PROGMEM = "String 3"; const char string_4[] PROGMEM = "String 4"; const char string_5[] PROGMEM = "String 5"; // Теперь создаем таблицу с отсылками к этим строкам: const char* const string_table[] PROGMEM = {string_0, string_1, string_2, string_3, string_4, string_5}; char buffer[30]; Дальше надо работать с переменной и выводить на дисплей ???(тут стопор) //Все пишут по разному //Обращение к такой строке идет через специальные команды strcpy_P, memcpy_P, pgm_read_byte и т.д. Lcd_print(x,y, FONT_1X, переменная???)// вывод на дисплей nokia3310 Вот тут работает на Ура... Но смысла сжатия входной логич. 1 нету. //Atmega8 //Анемометр, направление ветра #define F_CPU 8000000 //частота 8МГц #include <avr/io.h> #include "n5110.h" //Библиотека LCD Nokia3310 #include <util/delay.h> #include <avr/delay.h> void presets(){ DDRC = 0x0f; //Порт С настроен на вход PORTC = 0x00; //Обнуление порта С Lcd_init(); //инициализация дисплея LCD Nokia3310 Lcd_clear(); //Очистка буфера дисплея } int main(void){ presets(); while(1) { if (PINC &(1<<0)) //Регистр РС0 { Lcd_prints(0,0, FONT_1X, (unsigned char*)PSTR("ВЕТЕР:")); Lcd_prints (0,1, FONT_1X, (unsigned char*)PSTR("Север")); Lcd_update(); //Копирование буфера в ОЗУ системы _delay_ms(1000); } else { Lcd_clear(); //Очистка буфера дисплея Lcd_prints(0,0, FONT_1X, (unsigned char*)PSTR("ВЕТЕР:")); Lcd_update(); //Копирование буфера в ОЗУ системы } if (PINC &(1<<1)) //Регистр РС1 { Lcd_prints(0,0, FONT_1X, (unsigned char*)PSTR("ВЕТЕР:")); Lcd_prints (0,1, FONT_1X, (unsigned char*)PSTR("Восток")); Lcd_update(); //Копирование буфера в ОЗУ системы _delay_ms(1000); } else { Lcd_clear(); //Очистка буфера дисплея Lcd_prints(0,0, FONT_1X, (unsigned char*)PSTR("ВЕТЕР:")); Lcd_update(); //Копирование буфера в ОЗУ системы }
×
×
  • Create New...