if (pulseIn(5, HIGH, 5000000L) == 0) { // если нет напряжения на фазе 5 секунд пишет ошибку и пытается начать сначала.
Serial.print("A Fail");
return;
}
if (pulseIn(5, HIGH, 5000000L) == 0) { // если нет напряжения на фазе 5 секунд пишет ошибку и пытается начать сначала.
Serial.print("A Fail");
return;
}
уважаемый, я вам еще 3 страницы назад писал, что pulsein не будет работать на трех фазах. Чтож вы по три раза на одни и те же грабли наступаете???
Админы, добавьте ДедСимену прав на редактирование и закрывание веток на форуме.
не нужно ничего закрывать и писать тоже не нужно в эту тему, я старался, объяснял... вы тоже пытались это сделать - смеритесь, мы не всемогущие (мучителя). Может кто и поможет ТС - в том смысле, что напишет ему код...
ей богу, мы пытались, и даже никто не матерился... больше чем... требовали обстоятельства.
Даю задержку в 3 сек по одной фазе - работает нормально и выводит 3 сек. Как только подключаю все три , то вторая пишет задержку иногда 1 сек то третья 2 сек а то и вовсе 1 больше 5 сек (авария).
Почему не работает ? чего-то не учитываю ?
#include "SPI.h"
#include "Adafruit_GFX.h" // Библиотека обработчика графики
#include "Adafruit_ILI9341.h" // Программные драйвера для дисплеев ILI9341
#define TFT_DC 9 // Пин подключения вывода D/C дисплея
#define TFT_CS 10 // Пин подключения вывода CS дисплея
#define TFT_RST -1 // Если вывод дисплея RESET подключен к питанию или через кнопку RESET на Arduino
// Mega 2560 Hardware SPI
#define TFT_MOSI 51 // Пин подключения вывода дисплея SDI(MOSI)
#define TFT_CLK 52 // Пин подключения вывода дисплея SCK
#define TFT_MISO 50 // Пин подключения вывода дисплея SDO(MISO)
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);
// Создаем объект дисплея и сообщаем библиотеке распиновку для работы с графикой
int Size;
byte last_pin_state1=1,last_pin_state2=1, last_pin_state3=1;
unsigned long timer1 = 0,timer2 = 0,timer3 = 0;
unsigned long GlobalTik = millis();
int a,b,c;
//-----------------------------------------------
void setup(){
Size=2;
pinMode(5,INPUT);
pinMode(6,INPUT);
pinMode(7,INPUT);
Serial.begin(9600);
tft.begin(); // Инициализируем начало работы с графическим дисплеем
tft.setRotation(1); // Переводим дисплей в альбомную ориентацию
tft.fillScreen(ILI9341_DARKGREY);
//-------------------------------------------------
tft.setTextSize(Size); // Определяем размер шрифта для вывода на дисплей
tft.fillRect (10, 10, 300, 60, ILI9341_WHITE); //созадаем стоп и 1 этаж в начале
tft.setTextColor(ILI9341_GREEN);
tft.setCursor(90, 30);
tft.println(utf8rus("КОНТРОЛЬ ФАЗ"));
tft.setTextColor(ILI9341_GREEN); // Определяем цвет текста для вывода на экран
tft.fillRect (40, 90, 50, 60, ILI9341_WHITE);
tft.setTextColor(ILI9341_GREEN);
tft.setCursor(53,100); // Определяем координаты верхнего левого угла области вывода
tft.setTextSize(5);
tft.print("A"); // Выводим текст
tft.fillRect (140, 90, 50, 60, ILI9341_WHITE);
tft.setTextColor(ILI9341_GREEN);
tft.setCursor(153,100); // Определяем координаты верхнего левого угла области вывода
tft.setTextSize(5);
tft.print("B"); // Выводим текст
tft.fillRect (240, 90, 50, 60, ILI9341_WHITE);
tft.setTextColor(ILI9341_GREEN);
tft.setCursor(253,100); // Определяем координаты верхнего левого угла области вывода
tft.setTextSize(5);
tft.print("C"); // Выводим текст
tft.setTextSize(Size); // Определяем размер шрифта для вывода на дисплей
tft.fillRect (10, 170, 300, 60, ILI9341_WHITE);
tft.setTextColor(ILI9341_GREEN);
tft.setCursor(75, 190);
tft.println(utf8rus("ПИТАНИЕ В НОРМЕ"));
tft.setTextColor(ILI9341_GREEN); // Определяем цвет текста для вывода на экран
//--------------------------------------------------
}
void loop() {
byte status1 = digitalRead(5);
if(status1 != last_pin_state1) // состояние пина поменялось
{
last_pin_state1 = status1; // сохраняем текущее
if(status1 == LOW) // включили
{
timer1 = millis();a =1; // запоминаем время включения
}
else // выключили
{ // печатаем продолжительность работы
Serial.print("Фаза A - фазы не было: ");
Serial.println((millis() - timer1)/1000);
if ((millis()-timer1 < 5000)){
tft.setTextSize(Size); // Определяем размер шрифта для вывода на дисплей
tft.fillRect (10, 170, 300, 60, ILI9341_WHITE);
tft.setTextColor(ILI9341_GREEN);
tft.setCursor(75, 180);
tft.println(utf8rus("ПИТАНИЕ В НОРМЕ"));
tft.setCursor(30, 205);
tft.print(utf8rus("фазы A не было : "));
tft.print((millis() - timer1)/1000);
tft.print(utf8rus(" сек"));
tft.setTextColor(ILI9341_GREEN); // Определяем цвет текста для вывода на экран
tft.fillRect (40, 90, 50, 60, ILI9341_WHITE);
tft.setTextColor(ILI9341_GREEN);
tft.setCursor(53,100); // Определяем координаты верхнего левого угла области вывода
tft.setTextSize(5);
tft.print("A"); // Выводим текст
}
if ((millis()-timer1 >= 5000)&&(a==1))
{Serial.println("Фаза A - АВАРИЯ ФАЗЫ ");
tft.setTextSize(Size); // Определяем размер шрифта для вывода на дисплей
tft.fillRect (10, 170, 300, 60, ILI9341_WHITE);
tft.setTextColor(ILI9341_RED);
tft.setCursor(75, 190);
tft.println(utf8rus("АВАРИЯ ФАЗЫ А"));
tft.setTextColor(ILI9341_GREEN); // Определяем цвет текста для вывода на экран
tft.fillRect (40, 90, 50, 60, ILI9341_WHITE);
tft.setTextColor(ILI9341_RED);
tft.setCursor(53,100); // Определяем координаты верхнего левого угла области вывода
tft.setTextSize(5);
tft.print("A");
a=0;
}
}
}
byte status2 = digitalRead(6);
if(status2 != last_pin_state2) // состояние пина поменялось
{
last_pin_state2 = status2; // сохраняем текущее
if(status2 == LOW) // включили
{
timer2 = millis();b=1; // запоминаем время включения
}
else // выключили
{ // печатаем продолжительность работы
Serial.print("Фаза B - фазы не было: ");
Serial.println((millis() - timer2)/1000);
if ((millis()-timer2 < 5000)){
tft.setTextSize(Size); // Определяем размер шрифта для вывода на дисплей
tft.fillRect (10, 170, 300, 60, ILI9341_WHITE);
tft.setTextColor(ILI9341_GREEN);
tft.setCursor(75, 180);
tft.println(utf8rus("ПИТАНИЕ В НОРМЕ"));
tft.setCursor(30, 205);
tft.print(utf8rus("фазы B не было : "));
tft.print((millis() - timer2)/1000);
tft.print(utf8rus(" сек"));
tft.setTextColor(ILI9341_GREEN); // Определяем цвет текста для вывода на экран
tft.fillRect (140, 90, 50, 60, ILI9341_WHITE);
tft.setTextColor(ILI9341_GREEN);
tft.setCursor(153,100); // Определяем координаты верхнего левого угла области вывода
tft.setTextSize(5);
tft.print("B"); // Выводим текст
}
if ((millis()-timer2 >= 5000)&&(b==1))
{Serial.println("Фаза B - АВАРИЯ ФАЗЫ ");
tft.setTextSize(Size); // Определяем размер шрифта для вывода на дисплей
tft.fillRect (10, 170, 300, 60, ILI9341_WHITE);
tft.setTextColor(ILI9341_RED);
tft.setCursor(75, 190);
tft.println(utf8rus("АВАРИЯ ФАЗЫ В"));
tft.setTextColor(ILI9341_GREEN); // Определяем цвет текста для вывода на экран
tft.fillRect (140, 90, 50, 60, ILI9341_WHITE);
tft.setTextColor(ILI9341_RED);
tft.setCursor(153,100); // Определяем координаты верхнего левого угла области вывода
tft.setTextSize(5);
tft.print("B"); // Выводим текст
b=0;
}
}
}
byte status3 = digitalRead(7);
if(status3 != last_pin_state3) // состояние пина поменялось
{
last_pin_state3 = status3; // сохраняем текущее
if(status3 == LOW) // включили
{
timer3 = millis(); c=1; // запоминаем время включения
}
else // выключили
{ // печатаем продолжительность работы
Serial.print("Фаза C - фазы не было: ");
Serial.println((millis() - timer3)/1000);
if ((millis()-timer3 < 5000)){
tft.setTextSize(Size); // Определяем размер шрифта для вывода на дисплей
tft.fillRect (10, 170, 300, 60, ILI9341_WHITE);
tft.setTextColor(ILI9341_GREEN);
tft.setCursor(75, 180);
tft.println(utf8rus("ПИТАНИЕ В НОРМЕ"));
tft.setCursor(30, 205);
tft.print(utf8rus("фазы C не было : "));
tft.print((millis() - timer3)/1000);
tft.print(utf8rus(" сек"));
tft.setTextColor(ILI9341_GREEN); // Определяем цвет текста для вывода на экран
tft.fillRect (240, 90, 50, 60, ILI9341_WHITE);
tft.setTextColor(ILI9341_GREEN);
tft.setCursor(253,100); // Определяем координаты верхнего левого угла области вывода
tft.setTextSize(5);
tft.print("C"); // Выводим текст
}
if ((millis()-timer3 >= 5000)&&(c==1))
{Serial.println(" Фаза C - АВАРИЯ ФАЗЫ ");
tft.setTextSize(Size); // Определяем размер шрифта для вывода на дисплей
tft.fillRect (10, 170, 300, 60, ILI9341_WHITE);
tft.setTextColor(ILI9341_RED);
tft.setCursor(75, 190);
tft.println(utf8rus("АВАРИЯ ФАЗЫ С"));
tft.setTextColor(ILI9341_GREEN); // Определяем цвет текста для вывода на экран
tft.fillRect (240, 90, 50, 60, ILI9341_WHITE);
tft.setTextColor(ILI9341_RED);
tft.setCursor(253,100); // Определяем координаты верхнего левого угла области вывода
tft.setTextSize(5);
tft.print("C");
c=0; // Выводим текст
}
}
}
}
/* Recode russian fonts from UTF-8 to Windows-1251 */
String utf8rus(String source)
{
int i,k;
String target;
unsigned char n;
char m[2] = { '0', '\0' };
k = source.length(); i = 0;
while (i < k) {
n = source[i]; i++;
if (n >= 0xBF){
switch (n) {
case 0xD0: {
n = source[i]; i++;
if (n == 0x81) { n = 0xA8; break; }
if (n >= 0x90 && n <= 0xBF) n = n + 0x2F;
break;
}
case 0xD1: {
n = source[i]; i++;
if (n == 0x91) { n = 0xB7; break; }
if (n >= 0x80 && n <= 0x8F) n = n + 0x6F;
break;
}
}
}
m[0] = n; target = target + String(m);
}
return target;
}
опять нахреначили в код TFT экран? - я вам на первой странице написал - пока контроль фаз не заработает - экран не добавлять.
Теперь разбирайтесь сами.
По коду - Написать код для одной фазы. а потом размножить его три раза копированием - так только неграмотные индусы пишут. Откройте для себя процедуры и функции.
опять нахреначили в код TFT экран? - я вам на первой странице написал - пока контроль фаз не заработает - экран не добавлять.
Теперь разбирайтесь сами.
По коду - Написать код для одной фазы. а потом размножить его три раза копированием - так только неграмотные индусы пишут. Откройте для себя процедуры и функции.
Но что-то подсказывает что можно все сделать проще
правильно подсказывает.
Скажите, вы знаете, зачем нужны процедуры? - чтобы не копировать повторяющийся код. А вы что делаете? - написали процедуру для ФазыА - и потом тупо скопировали ее трижды. Ваши процедуры APhase , BPhase, Cphase - абсолютно одинаковы, нужно оставить одну и вызывать ее для разных фаз.
Тоже самое относится к коду вывода сообщений на экран - три абсолютно одинаковых куска кода по сотне строк, которые отличаются только именем фазы А В или С.
Ну и еще по мелочи - например вы в сетапе аж 7 раз вызываете tft.setTextColor(ILI9341_GREEN); хотя цвет шрифта у вас не меняется.... тоже самое с размером букв...
процедуры Фаз у вас написаны верно, все зависимые от конкретной фазы величины передаются как параметры (что-то мне подсказывает. что написано не вами... ну да ладно)
Поэтому можете в строчках 79-81 заменить во всех трех вызовах процедуру на APhase:
unsigned long tim_F1 = APhase(5, &phaseTime_A);
unsigned long tim_F2 = APhase(6, &phaseTime_B);
unsigned long tim_F3 = APhase(7, &phaseTime_C);
После этого сами процедуры BPhase CPhase из кода можно удалить, они не нужны.
С выводом на экран посложнее - там надо написать такую же процедуру, в которую как параметр будет передаваться имя фазы и координаты на экране.
А как же время &phaseTime_A я ведь в функции unsigned longtim_F1 = APhase(5, &phaseTime_A);
его указываю а не &phaseTime_C
когда вы вызываете процедуру для фазы А, вы в нее передаете параметр phaseTime_A, а когда вызываете для фазы С (строка 81) - то и переджаете параметр phaseTime_С, так что все верно.
А как называется параметр внутри функции - phaseTime_A или еще как - значения не имеет, с переменной phaseTime_A в loop() это две совершенно разные переменные
Чтобы не путаться, я бы вам посоветовал переменовать процедуру APhase в просто PHase - ведь эта процедура теперь не завязана только на фазу А. А параметр phaseTime_A внутри процедуры - на phaseTime
А вообще, вам стоит отложить на денек написание кода, найти учебник и проштудировать главу "процедуры и функции". Там обязательно будет и передача параметров
строка почему-то не работает и код идет дальше
строка почему-то не работает и код идет дальше
уважаемый, я вам еще 3 страницы назад писал, что pulsein не будет работать на трех фазах. Чтож вы по три раза на одни и те же грабли наступаете???
уважаемый
Он уже не уважаемый, он уже ТТП на этом форуме.
Он уже не уважаемый, он уже ТТП на этом форуме.
а все твоя жадность :) - закрыл бы ветку на второй странице...
Кто ни будь может объяснить как это все работает ?
Шо, опять? :)))))))))))))
а все твоя жадность :) - закрыл бы ветку на второй странице...
Я её только удалить могу, а жалка, вдруг кто зайдёт, поржёт.
Не опять а снова !!!
Для усвояемости пройденного материала !!!
Видите как много усвоил.
Не опять а снова !!!
Для усвояемости пройденного материала !!!
Видите как много усвоил.
У тебя в голове вообще пусто.
И не усвоил ты нихрена.
Покажи хоть одну строчку конструктивного кода (все Serial'ы не имеют к конструктиву никакого отношения), которую ТЫ написал САМ и которая РАБОТАЕТ .
О. ТС взялся свои посты удалять. :)
Видимо, чтоб не ржали.
О. ТС взялся свои посты удалять. :)
Видимо, чтоб не ржали.
Вместо того, чтоб учиться? у дебила, прости господи, и методы дебильные...
У кого есть право, закройте ветку.
Админы, добавьте ДедСимену прав на редактирование и закрывание веток на форуме. Думаю, ни у кого нет сомнений, что кандидат достоин :)))
###
Админы, добавьте ДедСимену прав на редактирование и закрывание веток на форуме.
не нужно ничего закрывать и писать тоже не нужно в эту тему, я старался, объяснял... вы тоже пытались это сделать - смеритесь, мы не всемогущие (мучителя). Может кто и поможет ТС - в том смысле, что напишет ему код...
ей богу, мы пытались, и даже никто не матерился... больше чем... требовали обстоятельства.
Удалил не нужное. Ну что учимся дальше - справитесь !
О. ТС взялся свои посты удалять. :)
Видимо, чтоб не ржали.
Вроде того.
Деда, а может указатель ему?
Давно мы его не доставали, запылился уже...
Удалил не нужное. Ну что учимся дальше - справитесь !
клиент наглеет
Удалил не нужное. Ну что учимся дальше - справитесь !
клиент наглеет
Не наглеет а все-таки пытается грызть гранит науки.
Деда, а может указатель ему?
Я б ему сперва сертификат пожаловал, а потом бы отправил по указателю. :)
Разберусь для начала с этим как докумекаю отпишусь , а то ведь всем уже интересно чем все закончится.
всем уже интересно чем все закончится.
Вангую, хоть это здесь и запрещено: закончится всё сертификатом и указателем.
Вы хоть скажите что это
увидишь, когда всё закончится.
Написал - но появились новые непонятные вещи.
Даю задержку в 3 сек по одной фазе - работает нормально и выводит 3 сек. Как только подключаю все три , то вторая пишет задержку иногда 1 сек то третья 2 сек а то и вовсе 1 больше 5 сек (авария).
Почему не работает ? чего-то не учитываю ?
опять нахреначили в код TFT экран? - я вам на первой странице написал - пока контроль фаз не заработает - экран не добавлять.
Теперь разбирайтесь сами.
По коду - Написать код для одной фазы. а потом размножить его три раза копированием - так только неграмотные индусы пишут. Откройте для себя процедуры и функции.
С функцией тоже самое выходит - с одной работает с тремя нет ерунду выдает.
Что не так делаю?
опять нахреначили в код TFT экран? - я вам на первой странице написал - пока контроль фаз не заработает - экран не добавлять.
Теперь разбирайтесь сами.
По коду - Написать код для одной фазы. а потом размножить его три раза копированием - так только неграмотные индусы пишут. Откройте для себя процедуры и функции.
Без дисплея в порт выводит нормально а с ним нет
Что не так делаю?
Всё
А пасторы Шлагги все падали и падали.))))
Закрывать не буду, всеж песочница и ТС, вроде не хамит.
То ТС, а за тертые посты, предупреждение. В следующий раз, тему в небытие.
Понял, спасибо.
Запутался я совсем то с функциями то с флагами (с нормальным алгоритмом беда).
Всего по чуть чуть а в итоге каша получается.
Если в порт выводить вроде работает как только подключаешь дисплей какое-то кикасо получается !
Скажите если одновременно вызвать функцию для трех пинов она будет работать или нет. Стоит ли с этим возиться?
Когда первая фаза пропадает остальные тоже обнуляются.
грубо говоря первой нет 2 сек второй 3 третей 4. А выводит по всем только 2 сек.
Написал код с дисплеем и тремя отдельными функциями.
Можно ли его оптимизировать сделать проще ?
Написал код с дисплеем и тремя отдельными функциями.
работает?
зачем? если работает...
А если не работает, то не оптимизировать надо...
да работает.
Но что-то подсказывает что можно все сделать проще
Но что-то подсказывает что можно все сделать проще
правильно подсказывает.
Скажите, вы знаете, зачем нужны процедуры? - чтобы не копировать повторяющийся код. А вы что делаете? - написали процедуру для ФазыА - и потом тупо скопировали ее трижды. Ваши процедуры APhase , BPhase, Cphase - абсолютно одинаковы, нужно оставить одну и вызывать ее для разных фаз.
Тоже самое относится к коду вывода сообщений на экран - три абсолютно одинаковых куска кода по сотне строк, которые отличаются только именем фазы А В или С.
Ну и еще по мелочи - например вы в сетапе аж 7 раз вызываете tft.setTextColor(ILI9341_GREEN); хотя цвет шрифта у вас не меняется.... тоже самое с размером букв...
про процедуры буду читать (я и догадывался что так можно но как реализовать пока не знаю).
Подскажите хоть маленький пример.
А функцию можно одну использовать для трех фаз как-то
процедуры Фаз у вас написаны верно, все зависимые от конкретной фазы величины передаются как параметры (что-то мне подсказывает. что написано не вами... ну да ладно)
Поэтому можете в строчках 79-81 заменить во всех трех вызовах процедуру на APhase:
После этого сами процедуры BPhase CPhase из кода можно удалить, они не нужны.
С выводом на экран посложнее - там надо написать такую же процедуру, в которую как параметр будет передаваться имя фазы и координаты на экране.
А как же время &phaseTime_A я ведь в функции
unsigned
long
tim_F1 = APhase(5, &phaseTime_A);
его указываю а не &phaseTime_C
А как же время &phaseTime_A я ведь в функции
unsigned
long
tim_F1 = APhase(5, &phaseTime_A);
его указываю а не &phaseTime_C
когда вы вызываете процедуру для фазы А, вы в нее передаете параметр
phaseTime_A, а когда вызываете для фазы С (строка 81) - то и переджаете параметр
phaseTime_С, так что все верно.
А как называется параметр внутри функции
- phaseTime_A или еще как - значения не имеет, с переменной
phaseTime_A в loop() это две совершенно разные переменные
Чтобы не путаться, я бы вам посоветовал переменовать процедуру APhase в просто PHase - ведь эта процедура теперь не завязана только на фазу А. А параметр
phaseTime_A внутри процедуры - на
phaseTime
Сейчас попробую. Спасибо Вам за совет.
Работает и код стал меньше.
Удивительно сколько еще всякого можно узнать !!!
и функция одна и считает все три фазы !!!
А вывод на дисплей наверное не получится - непонятно как на экран в разные места выводить?
А вывод на дисплей наверное не получится - непонятно как на экран в разные места выводить?
ну не настолько они и разные. Достаточно передать в процедуру координаты первой строки текста, а в процедуре все вычислять относительно этой точки
Да код значительно уменьшился когда удалил все лишнее по Вашим советам.
еще раза в два можно сократить точно
Я еще не знаю как в процедуру передавать координаты.
Вопрос: когда я задаю пин это же одно и тоже (передаю в процедуру номер пина) ?
Не то наверное
Я еще не знаю как в процедуру передавать координаты.
ну вот когда вы вызываете
- вы передаете в процедуру два параметра, номер пина и таймер. Первый параметр передается по значению, а второй по ссылке
Идею понял но пока даже не могу сообразить - буду искать в интернете
А вообще, вам стоит отложить на денек написание кода, найти учебник и проштудировать главу "процедуры и функции". Там обязательно будет и передача параметров
Понял учим процедуры и функции более детально
Практики нет как карандаш в стакане с ними !!!