-
Постов
29 -
Зарегистрирован
-
Посещение
Тип контента
Профили
Форумы
Блоги
Сообщения, опубликованные URRS
-
-
Всем привет. Хотел уточнить вопрос по работе 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();
}0 -
Проект: Датчик направления ветра на 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?
Данный проект был задуман для контроля направления ветра (получить информацию), чтоб в сильный ветер поворачивать крупногабаритные радиолюбительские антенны и уменьшить их парусность.
0 -
Проект: Домашняя метеостанция на 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(); //Копирование буфера в ОЗУ дисплея } }
0 -
Урааа, заработало!!!@snn_krs Спасибо большущее! Сейчас допишу и выложу материал, вдруг кому пригодиться. К датчику направления ветра (16 направлений) пришлепаю, будет более функциональнее. Еще раз спасибо!
0 -
43 минуты назад, snn_krs сказал:
если вторая строка вместо -1 станет 28, значит ошибка в библиотеке...
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 спасибо за помощь.
0 -
9 часов назад, snn_krs сказал:
...если у меня таже библиотека, то к РС5.
@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); } }
0 -
Всем здравствуйте. Попался в руки датчик температуры и влажности 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); //Задержка } }
0 -
@Berg ,большущее спасибо!!!! Всё работает. Теперь усовершенствуем до 16 значений (изучим функцию switch), добавим задержки, тестинг и монтаж! Теперь антенна Яги будет под защитой от ветра (лобового порыва). Как соберу, фото прилажу. С уважением, Николай (Rx9chy/8) с полярного круга!
@COKPOWEHEU книга «Язык Си» шикарная, как раз для таких как я!!! Очень интересная! Спасибо!
0 -
@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.
0 -
По поводу void name{....} предположил, что туда вписывают основные настройки портов (предустановки).
А в main{name()....} основной код.
Посоветуйте литературу по Си для чайников с «0»? Для тех кто к программированию отношение не имел (технарь).
0 -
8 минут назад, dm37 сказал:
@URRS а где у вас функция main() в проекте?
Прошляпил. Не совсем понимаю, что вписывать в
void setup{???основные установки?}
далее
int main{setup()while(1){???цикл или циклы выполнения кода?}}.
В общем вопросов море, а книга одна "1000 и одна микроконтроллерная схема". Пока техн часть...
0 -
Всем добрый вечер! Прикрепил код в Си и схему для протеуса (AS 6.1, Proteus 7).Вывод переменной на LCD (Lcd_print(x,y, FONT_1X, (unsigned char*)some_char);)
@COKPOWEHEU , тестил всякие варианты, dir_arr никак не хочет воспринимать .
0 -
Технически анемометр готов. По началу хотел собрать на герконах, да к это банально. Подумав решил сжать в двоичную систему для увеличения количества направлений. 4 фотодиода, 2 ист света и круглая пластинка с прорезями между ними (свет пройдя через вращаемую ветром пластинку попадет на фотодиод нужного бита и сформирует сигнал). Проще, легче и магнит не нужен. А с кодом засада вышла. Как программе сказать вот 4 бита (0,1,2,3), сравни с табличными значениями и выдай текст. Как то так...
0 -
@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(); //Копирование буфера в ОЗУ системы
}0 -
@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. Чую чего то не хватает.
0 -
Нашел ошибку!!!
0 -
Предупреждения на строчки PROGMEM const char str_W[] = "W"; выскакивают (Warning '__progmem__' attribute ignored [-Wattributes] ). Библиотеку поставил #include <avr/pgmspace.h>, а он ругается
0 -
@COKPOWEHEU , спасибо! Сейчас проанализирую каждую строчку и буду реализовывать.
0 -
13 часа назад, COKPOWEHEU сказал:
В PC0-PC3 у вас хранится 4-битный код направления ветра, от 0 до 15. Используйте его в качестве индекса массива, хранящего строки.
@COKPOWEHEU приветствую! Идея замечательная, If{},else{} можно исключить и воспользоваться выводом строки из переменной (LCD_print (x,y,FONT_1X, (unsigned char*) переменная). Почитав, что такое массив, пришел к такому результату (см рисунок). Индексы массива записал в двоичной (правда чую надо 8 битами записывать (иль в шестнадцатеричной системе, что проще)), а значение текстом. Правильно иль нет(всё на интуиции)? Возник вопрос, как связать регистры с индексом. С программированием дело никогда не имел, хотя с двоичными и шестнадцатеричными сист. работаю постоянно на работе.Чую там всё не так, кроме строчки 37,38.
0 -
Всем привет. Нуждаюсь в вашей подсказке. Задумал собрать датчик направления ветра (анемометр). Необходимо отобразить на дисплее 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{}. Подскажите пример и направление, где «КОПНУТЬ»? Заранее благодарен.
0 -
Спасибо, ценная инфа! Никогда б не подумал, работает!!!
Учтем при выполнении других проектов!
0 -
Доделал 7-ой урок! Все супер . Но возник один вопрос. Опорное напряжение камушка 2,56 Вольт, а у меня вышло 2,05 Вольт в тестовом режиме. При уменьшении напряжения на лапке АЦП от 2,05Вольта все норм, как напряжение превышает значение 2,05В (от 2,05 - 2,56 и т.д.) добавляется знак минус и значения уходят вниз. Что за парадокс? В чем "синус"?
0 -
Точнее, держись контроллер !
Привыкли чз Save File As... вот и тупим
0 -
Всем большое спасибо!!! Нашел!!! Мелочь, а затормозила на два дня! Ну держись процессор...
Точнее, держись контроллер !
0
Создать Систему Автоматического Управления - искусственный климат.
в Arduino, ESP32, ESP8266, Raspberry Pi
Опубликовано
Разобрался. В void setup() установил таймер timer.setInterval(1000L, nik); и все заработало. Всем спасибо.