Перейти к содержанию

URRS

Members
  • Постов

    29
  • Зарегистрирован

  • Посещение

Весь контент URRS

  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(); //Копирование буфера в ОЗУ системы }
  16. @COKPOWEHEU, приветствую! Не выходит задумка. сжал код до 2 бит на прием (4 комбинации). "dir_arr" не признает (variable 'dir_arr' must be const in order to be put into read-only section by means of '__attribute__((progmem))')... //Atmega8 #define F_CPU 8000000 //частота 8МГц #include <avr/pgmspace.h> //Библиотека PROGMEM #include <avr/io.h> #include "n5110.h" //Библиотека LCD Nokia3310 #include <util/delay.h> //Библиотека задержки PROGMEM const char string_N[] = "N"; //массив PROGMEM const char string_NNW[] = "NNW"; // PROGMEM const char string_NW[] = "NW"; // PROGMEM const char string_NWW[] = "NWW";//ключевого слова const декларирует размещение данных в памяти программ (flash) PROGMEM const char *dir_arr[] = {string_N, string_NNW, string_NW, string_NWW}; //массив, в котором хранятся _адреса_ всех строк //процедура отображения на дисплей текстового значения направления //аргумент - индекс направления (0 - 15) void ShowDir(unsigned char dir){ char *index; //адрес нужной строки //dir = dir & 0b00000011; //"защита от дурака" //if( dir > 15 )lcd_str_P(PSTR("E: ShowDir")); //другой вариант защиты - отображение ошибки на дисплее memcpy_P(&index, &dir_arr[ dir ], sizeof(char*) ); //Обращение к страке //копирование адреса нужной строки в переменную index lcd_str_P( index ); //отображение строки (из flash!) на дисплей Lcd_print(1,1, FONT_1X, index); // Вывод строки из переменной Lcd_update();// Копирование буфера в ОЗУ дисплея } ShowDir (PINC & 0b00000011 ); не могу сообразить, как программа поймет при какой комбинации регистров (РС0, РС1) выдать ту или иную строчку??? Жаль в интернете мало примеров с PROGMEM. Чую чего то не хватает.
  17. Предупреждения на строчки PROGMEM const char str_W[] = "W"; выскакивают (Warning '__progmem__' attribute ignored [-Wattributes] ). Библиотеку поставил #include <avr/pgmspace.h>, а он ругается
  18. @COKPOWEHEU приветствую! Идея замечательная, If{},else{} можно исключить и воспользоваться выводом строки из переменной (LCD_print (x,y,FONT_1X, (unsigned char*) переменная). Почитав, что такое массив, пришел к такому результату (см рисунок). Индексы массива записал в двоичной (правда чую надо 8 битами записывать (иль в шестнадцатеричной системе, что проще)), а значение текстом. Правильно иль нет(всё на интуиции)? Возник вопрос, как связать регистры с индексом. С программированием дело никогда не имел, хотя с двоичными и шестнадцатеричными сист. работаю постоянно на работе.Чую там всё не так, кроме строчки 37,38.
  19. Всем привет. Нуждаюсь в вашей подсказке. Задумал собрать датчик направления ветра (анемометр). Необходимо отобразить на дисплее LCD Nokia3310 инфу поступающую на 4 регистра (в моём случае РС0 – РС3), т.е. 4 бита. Например: 1011 – ветер северный, при входе на регистры 1010 – ветер южный и т.д. Четырёх разрядов вполне хватит на 16 направлений (0000 – 1111). Реализую на МК Atmega8 в ПО Atmel Studio 6.1. Легко получается с одним регистром (см. рис 2), а как считать в один момент времени 4 бита и сделать вывод не могу сообразить? В чём СИНУС? Пользовался фишкой «проверка некоторого разряда переменной на наличие лог.1» (If{} else {}). Предположил записать 15 значений (0001 – 1111) If{}, в противном случае при 0000 (на регистрах) else{}. Подскажите пример и направление, где «КОПНУТЬ»? Заранее благодарен.
×
×
  • Создать...