Benjamin_:В общем не осилил я написать скетч для бортовика своего. посему если кто может это сделать за твёрдую белорусскую валюту- в ЛС. Туда же и описание задачи скину.
А можно, хотя бы в двух словах, но здесь?
Benjamin_:В общем не осилил я написать скетч для бортовика своего. посему если кто может это сделать за твёрдую белорусскую валюту- в ЛС. Туда же и описание задачи скину.
А можно, хотя бы в двух словах, но здесь?
ARTexpress:Benjamin_:В общем не осилил я написать скетч для бортовика своего. посему если кто может это сделать за твёрдую белорусскую валюту- в ЛС. Туда же и описание задачи скину.
А можно, хотя бы в двух словах, но здесь?
данные с датчиков (темп., давления, наклона) выводить на ТФТ . Жмём кнопку- данные одного датчика, ещё раз жмём- другого и т.д. И ГСМ модуль связать с датчиком наклона. Меняется уровень наклона- гсм звонит на мобилку. Как то так.
Benjamin_:ARTexpress:Benjamin_:В общем не осилил я написать скетч для бортовика своего. посему если кто может это сделать за твёрдую белорусскую валюту- в ЛС. Туда же и описание задачи скину.
А можно, хотя бы в двух словах, но здесь?
данные с датчиков (темп., давления, наклона) выводить на ТФТ . Жмём кнопку- данные одного датчика, ещё раз жмём- другого и т.д. И ГСМ модуль связать с датчиком наклона. Меняется уровень наклона- гсм звонит на мобилку. Как то так.
А что у вас не получилось? Может вам просто помочь дописать скетч?
ARTexpress:Benjamin_:ARTexpress:Benjamin_:В общем не осилил я написать скетч для бортовика своего. посему если кто может это сделать за твёрдую белорусскую валюту- в ЛС. Туда же и описание задачи скину.
А можно, хотя бы в двух словах, но здесь?
данные с датчиков (темп., давления, наклона) выводить на ТФТ . Жмём кнопку- данные одного датчика, ещё раз жмём- другого и т.д. И ГСМ модуль связать с датчиком наклона. Меняется уровень наклона- гсм звонит на мобилку. Как то так.
А что у вас не получилось? Может вам просто помочь дописать скетч?
ну последний мой крик о помощи остался без ответа, поэтому от безысходности решил кинуть затею самому писать. А не получается работа с прерываниями. Я пытался уже с помощью прерываний и диоды зажигать по кнопке, что бы как то понять принцип работы прерываний, но слабо выходило. Вот как то так.
Benjamin_, скиньте пример вашего кода с прерываниями, может где то мелкий недочет... там же вроде ничего сложного нет
Drosha:Benjamin_, скиньте пример вашего кода с прерываниями, может где то мелкий недочет... там же вроде ничего сложного нет
врядли мелкий.
тут я пытался на одном экране данные температуры, потом по кнопке переключался на второй экран просто с надписью.
// Подключение ТФТ
#define TFT_CS 10
#define TFT_RST 8
#define TFT_DC 9
#define TFT_SCLK 13
#define TFT_MOSI 11
//Инициализируем дисплей
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
// Параметры датчика DS18B
// Устанавливаем пин 3 на DS18B20
#define ONE_WIRE_BUS 3
OneWire oneWire(ONE_WIRE_BUS);
float tempMin = 999;
float tempMax = 0;
int barra = 0;
int RegimCount = 0;
int KNOPKA = 2;
int flagKNOPKA = 0;
char conta = 0;
DallasTemperature sensors(&oneWire);
DeviceAddress sensor1;
// обработка таймера
volatile bool timerKNOPKAOn; //переменная вкл/выкл таймера
unsigned long int timerKNOPKALoop; //переменная для хранения значения таймера
bool KNOPKAOn; //переменная для хранения состояния кнопки
volatile unsigned long int timerKNOPKA; //переменная подсчета миллисекунд - значение таймера
ISR (TIMER0_COMPA_vect) //функция, вызываемая таймером-счетчиком каждые 0,001 сек.
{
if(timerKNOPKAOn) //если включен миллисекудный таймер для REGIM
timerKNOPKA++; //инкремент переменной таймера (+1)
}
void setup() {
pinMode(KNOPKA, INPUT);
Serial.begin(9600);
sensors.begin();
tft.initR(INITR_BLACKTAB); // You will need to do this in every sketch
//attachInterrupt(KNOPKA, regim, RISING);
/**** настройка прерывания по таймеру каждую 0,001 сек (вызов функции ISR (TIMER0_COMPA_vect)) ****/
TCCR0A |= (1 << WGM01); //сброс при совпадении
OCR0A = 0xF9; //начало отсчета до переполнения (249)
TIMSK0 |= (1 << OCIE0A); //разрешить прерывание при совпадении с регистром А
TCCR0B |= (1 << CS01) | (1 << CS00); //установить делитель частоты на 64
sei(); //разрешить прерывания
}
void loop()
{
if(digitalRead(2) == 1 && KNOPKAOn == 0) //флаг работы таймера == 0
{
timerKNOPKAOn = 1000; // запустить таймер на 1 сек;
KNOPKAOn == 1; //флаг работы таймера = 1;
flagKNOPKA == 1; // флаг нажатия кнопки = 1;
if(RegimCount != 2) //переменная-счетчик экранов !=
{
RegimCount++; //переменная-счетчик экранов++;
}
else
RegimCount = 1; //переменная-счетчик экранов = 0
}
if(timerKNOPKALoop < 1000)
{
cli();
timerKNOPKALoop = timerKNOPKA;
sei();
}
else
{
KNOPKAOn = 0;
timerKNOPKAOn = 0;
timerKNOPKAOn = 0;
}
if(flagKNOPKA == 1 && RegimCount == 1)
{
flagKNOPKA == 0;
regim1 (); //функция вывода экрана №1();
}
if(flagKNOPKA == 1 && RegimCount == 2)
{
flagKNOPKA == 0;
regim2 (); //функция вывода экрана №1();
}
}
void regim1(void)
{
//tft print function!
tft.setTextColor(ST7735_YELLOW);
tft.setRotation(3);
tft.setTextSize(2);
tft.setCursor(35, 10);
tft.println(" TEMP = C");
tft.setTextSize(1);
tft.setCursor(131, 10);
tft.println("O");
termo();
tft.setTextColor(ST7735_WHITE);
tft.setTextSize(0);
tft.setCursor(19, 59);
tft.print("50");
tft.setTextSize(0);
tft.setCursor(19, 106);
tft.print("0");
tft.setTextSize(0);
tft.setCursor(19, 7);
tft.print("100");
tft.setTextSize(0);
tft.setCursor(19, 82);
tft.print("25");
tft.setTextSize(0);
tft.setCursor(19, 32);
tft.print("75");
tft.setTextColor(ST7735_BLUE);
tft.setTextSize(2);
tft.setCursor(10, 40);
tft.print(" CUR");
tft.setTextSize(2);
tft.setCursor(20, 65);
tft.print(" MIN");
tft.setTextSize(2);
tft.setCursor(20, 90);
tft.print(" MAX");
// Информация датчика темп.
if (sensors.getAddress(sensor1, 0))
{
sensors.requestTemperatures();
float tempC = sensors.getTempC(sensor1);
// Atualiza temperaturas minima e maxima
if (tempC < tempMin)
{
tempMin = tempC;
}
if (tempC > tempMax)
{
tempMax = tempC;
}
barra = (int)tempC;
// Отображаем на ТФТ
tft.setTextColor(ST7735_RED);
apaga_linha(100, 40);
tft.setTextSize(2);
tft.setCursor(100, 40);
tft.println(tempC, 1);
//tft.print("C");
tft.setTextColor(ST7735_GREEN);
apaga_linha(100, 65);
tft.setCursor(100, 65);
tft.println(tempMin, 1);
tft.setTextColor(ST7735_YELLOW);
apaga_linha(100, 90);
tft.setCursor(100, 90);
tft.println(tempMax, 1);
tft.setTextColor(ST7735_GREEN);
tft.setTextSize(1);
apaga_linha(99, 104);
tft.setCursor(45, 110);
tft.print(" SENSOR OK ");
if (tempMin > 50)
tempMin = 999;
tft.fillRect(5, 12, 7, 99, ST7735_RED);
tft.fillRect(5, 12, 7, 100 - barra, ST7735_BLACK);
conta++;
if (conta == 1)
{
tft.setTextSize(1);
tft.setCursor(45, 110);
tft.print(" |");
}
if (conta == 2)
{
tft.setTextSize(1);
tft.setCursor(45, 110);
tft.print(" /");
}
if (conta == 3)
{
tft.setTextSize(1);
tft.setCursor(45, 110);
tft.print(" -");
}
if (conta == 4)
{
tft.setTextSize(1);
tft.setCursor(45, 110);
tft.print(" \\");
conta = 1;
}
}
else (!sensors.getAddress(sensor1, 0));
{
tft.setTextColor(ST7735_RED);
tft.setTextSize(1);
apaga_linha(99, 104);
tft.setCursor(45, 110);
tft.print(" SENSOR ERRO ");
tempMin = 999;
tempMax = 0;
}
}
void regim2(void)
{
tft.fillScreen(ST7735_BLACK);
tft.setRotation(3);
tft.setTextSize(2); // Определяем размер шрифта
tft.setCursor(5, 60); // Устанавливаем курсор в левый верхний угол области вывода
tft.setTextColor(ST7735_BLUE); // Определяем цвет вывода на дисплей
tft.print("loading...");
}
void apaga_linha (int16_t x, int16_t y)
{
tft.fillRect(x, y, 50, 16, ST7735_BLACK);
}
void termo ()
{
tft.drawRect(4, 11, 9, 100, ST7735_WHITE);
// tft.fillRect(5, 12, 7, barra, ST7735_YELLOW);
tft.drawRect(40, 4, 119, 122, ST7735_MAGENTA);
//Рисунок термометра
tft.drawLine(14, 11, 17, 11, ST7735_WHITE); // LINHA DE 100
tft.drawLine(13, 86, 16, 86, ST7735_WHITE); // LINHA DE 75
tft.drawLine(13, 36, 16, 36, ST7735_WHITE); // LINHA DE 25
tft.drawLine(13, 61, 16, 61, ST7735_WHITE); // LINHA DE 50
tft.drawLine(14, 110, 16, 110, ST7735_WHITE); // LINHA DE 0
tft.drawLine(13, 98, 14, 98, ST7735_WHITE); //
tft.drawLine(13, 73, 14, 73, ST7735_WHITE); //
tft.drawLine(13, 48, 14, 48, ST7735_WHITE); //
tft.drawLine(13, 23, 14, 23, ST7735_WHITE); // L
tft.drawCircle(8, 118, 8, ST7735_WHITE);
tft.fillCircle(8, 118, 7, ST7735_RED);
}
ARTexpress:Поясните еще раз, что вы ждете от прерываний?
https://forum.onliner.by/viewtopic.php?t=4683606&p=97097530#p97097530
вот тут хорошо сформулировано то, что мне нужно от прерываний.
Benjamin_, из того что сразу в глаза бросается
if(digitalRead(2) == 1 && KNOPKAOn == 0) //флаг работы таймера == 0
{
timerKNOPKAOn = 1000; // запустить таймер на 1 сек;
KNOPKAOn == 1; //флаг работы таймера = 1;
flagKNOPKA == 1; // флаг нажатия кнопки = 1;
if(RegimCount != 2) //переменная-счетчик экранов !=
{
RegimCount++; //переменная-счетчик экранов++;
} else {
RegimCount = 1; //переменная-счетчик экранов = 0
}
}
flagKNOPKA == 1; // флаг нажатия кнопки = 1; - это сравнение а не присваивание, дальше по коду тоже есть такое
прерывание привязано к функции regim а такой функции в коде нет
Benjamin_:ARTexpress:Поясните еще раз, что вы ждете от прерываний?
https://forum.onliner.by/viewtopic.php?t=4683606&p=97097530#p97097530
вот тут хорошо сформулировано то, что мне нужно от прерываний.
Пробовали библиотеку TimerOne?
Я пока не смотрел ваш код, но по вашей ссылке я видел совет отрисовывать экран в обработчике прерывания по таймеру. Не советую, не успеете, если только таймер на единицы секунд не настроите, но тогда смысла тем более нету.
Еще раз, простите мне мою лень и нежелание выискивать ваши сообщения - повторите еще раз целиком, что вы хотите получить.
если вам надо переключаться между двумя экранами можно сделать что то вроде
int displayNum = 1;
void regim() {
displayNum = 3 - displayNum;
renderDisplay(displayNum);
}
void renderDisplay(int number) {
/**код отрисовки нужного экрана в зависимости от number*/
}
ARTexpress:Benjamin_:ARTexpress:Поясните еще раз, что вы ждете от прерываний?
https://forum.onliner.by/viewtopic.php?t=4683606&p=97097530#p97097530
вот тут хорошо сформулировано то, что мне нужно от прерываний.Пробовали библиотеку TimerOne?
Я пока не смотрел ваш код, но по вашей ссылке я видел совет отрисовывать экран в обработчике прерывания по таймеру. Не советую, не успеете, если только таймер на единицы секунд не настроите, но тогда смысла тем более нету.Еще раз, простите мне мою лень и нежелание выискивать ваши сообщения - повторите еще раз целиком, что вы хотите получить.
библиотеку не пробовал. данные с датчиков (темп., давления, наклона) выводить на ТФТ . Жмём кнопку- данные одного датчика, ещё раз жмём- другого и т.д.
Drosha, спасибо , попробую.
По итогу всё стало налаживаться. Ушёл от прерываний и по рекоммендации начал использовать функцию millis (). Получилось loop сократить до 4-х строчек. Пока что всё гуд.
Всем привет, построил машину по этому видео:
но что-то пошло не так, блютуз не работает, а машина ездит рывками по кругу сама В чем может быть проблема? У чувака на видео два аккума по 3.6V, а у меня 4 простых батарейки, может быть дело в питании?Ссылка на его проект: http://www.instructables.com/id/Smartphone-Controlled-Arduino-Rover/
RadioKid:а у меня 4 простых батарейки, может быть дело в питании?
Это не питание, что-то с подключением напутали или в проге косяк, либо блютуз.
Блютуз должен не зависимо от ардуины работать и видеться телефоном при подаче питания
если кому чего написать, подгребай https://baraholka.onliner.by/viewtopic.php?t=18051618
Кто нибудь калибровал датчик давления bmp 280 ? В инете много информации по bmp 180, но они ни разу не одинаково калибруются. Если кто знает как справиться с 280-м - откликнитесь плиз.
Benjamin_, пару лет юзаю bmp280, мне и заводской калибровки хватает. заметил глюк\баг, перед считыванием давления надо прочитать температуру.
bonza2:Benjamin_, пару лет юзаю bmp280, мне и заводской калибровки хватает. заметил глюк\баг, перед считыванием давления надо прочитать температуру.
высота над уровнем моря отличается от гугловской на 40 пунктов. давление в среднем на 10-15. Глюков не заметил, но возникает вопрос: прав гугл или датчик? ибо в первом случае это не погрешность, а кривая работа датчика.
офлайн
Snoop_Lion
Neophyte Poster
|
|
4 |
8 лет на сайте Город:
|
Ребята такой вопрос,есть у меня светодиоды по 3вата,к ним драйвер 18-36v,можно ли их диммировать ардуино спомощью платки на irf520?
Snoop_Lion:Ребята такой вопрос,есть у меня светодиоды по 3вата,к ним драйвер 18-36v,можно ли их диммировать ардуино спомощью платки на irf520?
Можно.