Скетч для солнечного трекера.

intrtrade
Offline
Зарегистрирован: 15.12.2016

https://youtu.be/lqQ7eXG4Odk
это трекер

int xSize;  // автор программы Торопов Андрей. пишите мне на ящик: intrtrade@gmail.com
int ySize;
int xPos;
int yPos;
unsigned long pereriv=300000; // время между проверками положения панелей в миллисекундах
int pauz=4000; //для срабатывания геркона
int centrX=0; // поправка для азимута в градусах, числа "-" или "+"
int grad=200; // длина дуги по горизонтали в градусах 



#include <DS1302.h>  // библиотеку часов подключаем
DS1302 rtc(2, 3, 4); // на этих пинах "сидит" плата часов
Time t;  // тип переменной такой, да?


int getXpos(int m, int d, int h, int mi){ // начало функции
  // Данные за 1,11 и 21 числа каждого месяца. Время по гринвичу, в минутах от 00:00. 37я ячейка повторяет 1ю 
int voshod[37]={326,323,316,303,287,270,254,234,212,189,168,148,130,114,100,90,85,85,89,97,108,122,136,150,166,180,195,209,224,240,257,273,289,303,315,323,326};
int zahod[37]={822,834,848,866,882,899,912,928,943,960,975,990,1005,1020,1034,1046,1055,1059,1059,1055,1046,1032,1016,997,975,954,933,911,890,871,857,835,823,815,812,814,822};
int azimutV[37]={125,123,120,115,110,105,100,94,88,82,76,70,65,60,56,53,51,51,51,53,56,60,65,70,76,81,87,93,99,105,111,115,120,123,125,126,125};
int azimutZ[37]={234,236,239,244,249,254,259,265,271,277,283,289,294,298,302,306,308,308,308,306,303,299,294,289,283,277,272,266,260,254,248,243,239,236,234,233,234};

int v; //время восхода
int z; //время захода
int azV; // азимут восхода
int azZ; // азимут захода
int v2;
int z2;
int azV2;
int azZ2;
float x;

if (d==1){
   m=m*3;
  m=m-3;
  v=voshod[m];
  z=zahod[m];
  azV=azimutV[m];
  azZ=azimutZ[m];
  goto label;
}
if (d==11){
 m=m*3;
  m=m-2;
  v=voshod[m];
  z=zahod[m];
  azV=azimutV[m];
  azZ=azimutZ[m];
  goto label;  
}
 if (d==21){
 m=m*3;
  m=m-1;
  v=voshod[m];
  z=zahod[m];
  azV=azimutV[m];
  azZ=azimutZ[m];
  goto label;
}
// теперь с остальными датами. Вычисляем восход как средний меж двух дат. Определяем между каких мы дат (3 варианта)
if (d<11){
  d=d-1;
  m=m*3;
  m=m-3;
  v=voshod[m];
  z=zahod[m];
  azV=azimutV[m];
  azZ=azimutZ[m];
  m=m+1; //следующая ячейка в массивах
   v2=voshod[m];
  z2=zahod[m];
  azV2=azimutV[m];
  azZ2=azimutZ[m];
  if (v>v2){
    x=v-v2;
    x=x/9;
     x=x*d; 
    v=v-x; // среднее время восхода вычислено !!!!
  }
else {
  x=v2-v;
   x=x/9;
  x=x*d; 
   v=v+x; // среднее время восхода вычислено
}
 if (z>z2){
    x=z-z2;
    x=x/9;
      x=x*d; 
    z=z-x; // среднее время захода вычислено !!!!
  }
else {
  x=z2-z;
   x=x/9;
     x=x*d; 
   z=z+x; // среднее время захода вычислено
}
 if (azV>azV2){
    x=azV-azV2;
    x=x/9;
     x=x*d; 
    azV=azV-x; //!!!
  }
else {
  x=azV2-azV;
   x=x/9;
      x=x*d; 
    azV=azV+x; 
}
 if (azZ>azZ2){
    x=azZ-azZ2;
    x=x/9;
      x=x*d; 
    azZ=azZ-x; //!!!
  }
else {
  x=azZ2-azZ;
   x=x/9;
     x=x*d; 
   azZ=azZ+x;
}
goto label;
}

if (d<21){
  d=d-11; // переменная больше не понадобится, по этому приводим дату к удобному числу
  m=m*3;
  m=m-2;
  v=voshod[m];
  z=zahod[m];
  azV=azimutV[m];
  azZ=azimutZ[m];
  m=m+1; //следующая ячейка в массивах
   v2=voshod[m];
  z2=zahod[m];
  azV2=azimutV[m];
  azZ2=azimutZ[m];
  if (v>v2){
    x=v-v2;
    x=x/10;
     x=x*d; 
    v=v-x; // среднее время восхода вычислено !!!
  }
else {
  x=v2-v;
   x=x/10;
     x=x*d; 
   v=v+x; // среднее время восхода вычислено
}
 if (z>z2){
    x=z-z2;
    x=x/10;
      x=x*d; 
    z=z-x; // среднее время захода вычислено !!!
  }
else {
  x=z2-z;
   x=x/10;
      x=x*d; 
   z=z+x; // среднее время захода вычислено
}
 if (azV>azV2){
    x=azV-azV2;
    x=x/10;
     x=x*d; 
    azV=azV-x; //!!!!
  }
else {
  x=azV2-azV;
   x=x/10;
      x=x*d; 
    azV=azV+x; 
}
 if (azZ>azZ2){
    x=azZ-azZ2;
    x=x/10;
     x=x*d; 
    azZ=azZ-x; //!!!!
  }
else {
  x=azZ2-azZ;
   x=x/10;
      x=x*d; 
   azZ=azZ+x;
}
goto label;
}

if (d>21){
  d=d-21; // переменная больше не понадобится, по этому приводим дату к удобному числу
  m=m*3;
  m=m-1;
  v=voshod[m];
  z=zahod[m];
  azV=azimutV[m];
  azZ=azimutZ[m];
  m=m+1; //следующая ячейка в массивах
   v2=voshod[m];
  z2=zahod[m];
  azV2=azimutV[m];
  azZ2=azimutZ[m];
  if (v>v2){
    x=v-v2;
    x=x/10;
     x=x*d; 
    v=v-x; // среднее время восхода вычислено !!!!
  }
else {
  x=v2-v;
   x=x/10;
    x=x*d; 
   v=v+x; // среднее время восхода вычислено
}
 if (z>z2){
    x=z-z2;
    x=x/10;
     x=x*d; 
    z=z-x; // среднее время захода вычислено !!!!
  }
else {
  x=z2-z;
   x=x/10;
     x=x*d; 
   z=z+x; // среднее время захода вычислено
}
 if (azV>azV2){
    x=azV-azV2;
    x=x/10;
     x=x*d; 
    azV=azV-x; //!!!!
  }
else {
  x=azV2-azV;
   x=x/10;
      x=x*d; 
    azV=azV+x; 
}
 if (azZ>azZ2){
    x=azZ-azZ2;
    x=x/10;
      x=x*d; 
    azZ=azZ-x; //!!!!
  }
else {
  x=azZ2-azZ;
   x=x/10;
      x=x*d; 
   azZ=azZ+x;
}
goto label;
}

// преобразуем время в минуты
label:
h=h*60;
mi=mi+h;

float az; // вычисляемый азимут
x=z-v; // сколько времени от меньшего азимута до большего
if (mi<v){ // солнце еще не взошло возвращаем азимут восхода
  return azV;
}
if (mi>z){ //солнце уже зашло за горизонт
  return azZ;
}
mi=mi-v; // время от восхода
az=azZ-azV;
az=az/x; 
az=az*mi; 
az=azV+az; //азимут вычислен.
return az;

}  // конец функции




int getUgolY(int m, int d){ // начало функции
int sunUgol[13]={0,2087,3021,4100,5263,6096,6421,6124,5289,4148,3009,2087,1734}; // 21 число каждого месяца в полдень

// дата= дата-21 день,из-за того что массив углов на 21 число
d=d-21;
if (d<1){
  d=30+d;
  if (m<1){
    m=12;
  }
m=m-1;
} // теперь дата преобразована
int x;
if (m!=11){
x=sunUgol[m]-sunUgol[m+1];
}
else {
x=sunUgol[m]-sunUgol[0];  
}
x=x/30;
x=x*d;
x=sunUgol[m]-x;
x=x/100;
return x;
}  // конец функции



int motorX (int obr) {   // функция начинается тут
unsigned long msec;
int pauza =0;
int z=0;
int x;
int y;
y=digitalRead (6); // значение геркона
msec = millis(); 

if (obr>0) // крутим в +
{
digitalWrite (10,HIGH); 
digitalWrite (11,LOW);

while(pauza < pauz){   // цикл продолжаем пару секунд если не срабатывает геркон
  x=digitalRead (6); // геркон горизонтали
  if (x!=y){         // если не равны значит геркон сработал и мотор крутится
    msec = millis(); // обновляем точку отсчета 
    y=x;  // теперь значение геркона является "устаревшим"
 z ++;
 if (z >=obr){
  digitalWrite (10,LOW); 
digitalWrite (11,LOW);
return z;
 } 
 }

  else {
   pauza= (millis()-msec);  // выясняем сколько времени выполняется цикл
  }
}
 digitalWrite (10,LOW); // сработала пауза
digitalWrite (11,LOW);
return z;
}
if (obr<0) // крутим в -
{
digitalWrite (10,LOW); 
digitalWrite (11,HIGH);

while(pauza < pauz){   // цикл продолжаем пару секунд если не срабатывает геркон
  x=digitalRead (6); // геркон горизонтали
  if (x!=y){         // если не равны значит геркон сработал и мотор крутится
    msec = millis(); // обновляем точку отсчета 
    y=x;  // теперь значение геркона является "устаревшим"
 z --;
 if (z <=obr){
  digitalWrite (10,LOW); 
digitalWrite (11,LOW);
return z;
 } 
}
  else {
   pauza= (millis()-msec);  // выясняем сколько времени выполняется цикл
  }
}
 digitalWrite (10,LOW); // сработала пауза
digitalWrite (11,LOW);
return z;
}
return z; // на входе был "0"
} // конец тела функции



int motorY (int obr) {   // функция начинается тут
unsigned long msec;
int pauza =0;
int z=0;
int x;
int y;
y=digitalRead (5); // значение геркона
msec = millis(); 

if (obr>0) // крутим в +
{
digitalWrite (8,HIGH); 
digitalWrite (9,LOW);

while(pauza < pauz){   // цикл продолжаем пару секунд если не срабатывает геркон
  x=digitalRead (5); // геркон горизонтали
  if (x!=y){         // если не равны значит геркон сработал и мотор крутится
    msec = millis(); // обновляем точку отсчета 
    y=x;  // теперь значение геркона является "устаревшим"
 z ++;
 if (z >=obr){
  digitalWrite (8,LOW); 
digitalWrite (9,LOW);
return z;
 } 
 }

  else {
   pauza= (millis()-msec);  // выясняем сколько времени выполняется цикл
  }
}
 digitalWrite (8,LOW); // сработала пауза
digitalWrite (9,LOW);
return z;
}
if (obr<0) // крутим в -
{
digitalWrite (8,LOW); 
digitalWrite (9,HIGH);

while(pauza < pauz){   // цикл продолжаем пару секунд если не срабатывает геркон
  x=digitalRead (5); // геркон горизонтали
  if (x!=y){         // если не равны значит геркон сработал и мотор крутится
    msec = millis(); // обновляем точку отсчета 
    y=x;  // теперь значение геркона является "устаревшим"
 z --;
 if (z <=obr){
  digitalWrite (8,LOW); 
digitalWrite (9,LOW);
return z;
 } 
}
  else {
   pauza= (millis()-msec);  // выясняем сколько времени выполняется цикл
  }
}
 digitalWrite (8,LOW); // сработала пауза
digitalWrite (9,LOW);
return z;
}
return z; // на входе был "0"
} // конец тела функции



int letY(int ugol){  //функция начало
float f;
int x;
int y;
f= (float)ySize/90;
ugol=ugol*f; // угол перевели в нужные обороты актуатора от "0"
if (yPos>ugol){
  x=yPos-ugol;
  x=x*-1; //знак "-" 
 y= motorY(x);
yPos=yPos+y;  // позиция поменялась
return x;
}
if (yPos<ugol){
  x=ugol-yPos;
  y=motorY(x);
  yPos=yPos+y; // позиция поменялась
  return x;
}
return 0; // позиция равна углу
} //конец функции


int letX(int azimut){  //функция начало
float f;
int x;
int y;
int p;
p=360-grad;
p=p/2;
p=p+centrX; // дополнительная поправка
azimut=azimut-p; // попытка номер III
f= (float)xSize/grad;
azimut=(float)azimut*f; // угол перевели в нужные обороты актуатора от "0"

if (xPos>azimut){
  x=xPos-azimut; 
  x=x*-1; //знак "-" 
 y= motorX(x);
xPos=xPos+y;  // позиция поменялась
return x;
}
if (xPos<azimut){
  x=azimut-xPos;
   y=motorX(x);
  xPos=xPos+y; // позиция поменялась
  return x;
}
return 0; // позиция равна углу
} // конец функции





void setup()
{
  Serial.begin(9600);
//rtc.setTime(19, 33, 0);     // Set the time to 12:00:00 (24hr format)
//rtc.setDate(27, 11, 2016);   // Set the date to August 6th, 2010

pinMode (8,OUTPUT);
pinMode (9,OUTPUT);
pinMode (10,OUTPUT);
pinMode (11,OUTPUT); 
t = rtc.getTime(); // получаем текущее время

 Serial.print("mouns: ");
  Serial.print(t.mon,DEC);
 Serial.print("  date: ");
Serial.println(t.date, DEC);
 Serial.print("  ");
    Serial.print(t.hour, DEC);
  Serial.print(" : ");
  Serial.print(t.min, DEC);
  Serial.println();
  

// устанавливаем панели в крайнее верхнее положение для безопасного прогона горизонтали и вертикали последующими шагами.
ySize= motorY (9999);
 
  // прогоняем панели на восток и считаем количество оборотов двигателя
xPos= motorX (9999);
xSize= motorX (-9999);
xSize= xSize*-1; //меняю знак на "+"
int xmedium;
xmedium=xSize/2;
xPos= motorX (xmedium);  // устанавливаем (горизонталь) в среднее положение (на ЮГ)


 // переводим панели в вертикальное положение и считаем обороты в вертикальной оси
ySize= motorY(-9999);
ySize= ySize*-1;  //меняю знак на "+" 
yPos=0;
}

void loop()
{
  
// вычисляем нужный угол по вертикали
int m;
int d;
 m=t.mon;
 d=t.date;


int ugolY;
ugolY=getUgolY(m,d);
letY(ugolY); // функция установит панели в положение угол ugolY
int h;
int mi;
t = rtc.getTime(); // получаем текущее время
h=t.hour;
mi=t.min;
int azimut;
azimut=getXpos(m,d,h,mi);
letX(azimut); // функция установит панели по азимуту

unsigned long stopTime;
stopTime=millis();
unsigned long pauza=0;
while (pauza<pereriv){ // ждем 
    pauza= (millis()-stopTime);
}
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

это надо столько наворотить )))
есть же астрологическая математика

intrtrade
Offline
Зарегистрирован: 15.12.2016

ua6em пишет:

это надо столько наворотить )))
есть же астрологическая математика

Я не математик и не астролог. Если есть скетч который делает то же самое но более совершенным методом, дай мне его. И еще я не программист, я познакомился с ардуино и с языком С++ на этом сайте с месяц назад, и в результате своял программу которая РАБОТАЕТ как и планировалось. Не совершенна, я знаю.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

intrtrade пишет:

я познакомился с ардуино и с языком С++ на этом сайте с месяц назад, и в результате своял программу которая РАБОТАЕТ как и планировалось.

Молодец!

intrtrade
Offline
Зарегистрирован: 15.12.2016

Давайте, гуру-ардуинщики, укажите что и как можно упростить / улучшить. 

nik182
Offline
Зарегистрирован: 04.05.2015

Да. Проблема. Какое отношение ваша программа имеет к "ардуинщикам"? Ардуинщики могут помочь найти ошибку. Если программа работает как надо - зачем трогать? Или вы считаете, что среди ардуинщиков полно людей которым интересен солнечный трекер? Может быть вопрос по алгоритмам задать на ком нибудь астрономическом форуме? Или программистком? Скетч для ардуино пишется на Си, или Си++ . В этом смысле ардунщики не какая то отдельная каста. А копаться в длинном, лично не интересном, листинге и что то делать можно только за деньги. Есть множество других более интересных занятий для души. Задайте конкретный вопрос. И чисто для информации - на форуме длинные листинги положено сворачивать. Есть специальная галочка в свойствах окна кода.  

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Я то как раз код посмотрел.

Забавный. Смена знака умножением на  -1 - это пять! Там много такого.

Расчет эфемерид солца есть в сети во многих вариантах.

Но ведь работает? Вам пямяти контроллера хватает? Ну вот и ответ.

А лучшее - враг хорошего.

=====================================

Всегда помните старый анекдот про программиста и примите его, как руководство:

Сын программиста подходит к отцу и спрашивает:

 - Папа! А почему солнце утром восходит и вечером заходит?

 - Сынок, ты это сам видел?

 - Да.

 - Это происходит каждый день?

 - Да!

 - Всегда одним и тем же образом и ты не встречал сбоев и задержек?

 -Да! Конечно!

 - УМОЛЯЮ ТЕБЯ! НИЧЕГО НЕ ТРОГАЙ! Пусть работает.

-------------------------

intrtrade
Offline
Зарегистрирован: 15.12.2016

Когда говоришь "полно в сети", неплохо бы дать хотя б одну ссылку, ведь это не трудно для тебя сделать, если "их там полно".

intrtrade
Offline
Зарегистрирован: 15.12.2016

 "Смена знака умножением на  -1 - это пять! Там много такого."

Чем плох вариант? и как это сделать было бы правильней?

 

intrtrade
Offline
Зарегистрирован: 15.12.2016

Хочу добавить возможность передавать команды программе во время ее работы. Например в случае шторма надо разворачивать панели горизонтально, во время града вертикально...Еще надо добавить возможность ручной калибровки ориентации на солнце, это еще несколько команд типа " вверх, низ, лево, право, и запомнить"

Какими способами это можно реализовать?

А можно ли научить ардуино принимать голосовые команды?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

intrtrade пишет:

 "Смена знака умножением на  -1 - это пять! Там много такого."

Чем плох вариант? и как это сделать было бы правильней?

 

a = -a;

%-) правда проще?

(надо признать, что в настройках ИДЕ Ардуино включена полная оптимизация у компилятора. Компилятор такие художества сам поправит, так что не стоит напрягаться)

Ты не серчай - я не подкалываю и не глумлюсь.

Все у тебя работает, ну и слава Б..у! Перечитай анекдот!

Я не хочу критиковать человека, который взял и сделал хорошую, рабочую вещь.

Тут полно наглых новичков, которые еще ничего не сделали, но требуют и внимания и помощи.

Вот на таких я, с огромным удовольствием, оттопчусь, а  тебе зачем критика?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

intrtrade пишет:

А можно ли научить ардуино принимать голосовые команды?

в теории был такой модуль, который обучался нескольким командам, на приктике - полное гАвно.

Тут, на форуме, было обсуждение вроде как.

Красиво и удобно - не будет, а с голосом, если плохо, то лучше никак, на мой вкус.

Ищите что-то вроде  voice recognition, easyVRshield и тому подобное, дорого и плохо, но решайте сами.

intrtrade
Offline
Зарегистрирован: 15.12.2016

a = -a;

Если честно то мне кажется что эта команда присваивает знак "-" ? это не совсем то..

А я ждал что предложишь побитовый здвиг двоичного числа, кажется есть такой метод.

Мне критика не нужна, а советы-да. Анекдот перечитал)

 

intrtrade
Offline
Зарегистрирован: 15.12.2016

wdrakula пишет:

intrtrade пишет:

А можно ли научить ардуино принимать голосовые команды?

в теории был такой модуль, который обучался нескольким командам, на приктике - полное гАвно.

Тут, на форуме, было обсуждение вроде как.

Красиво и удобно - не будет, а с голосом, если плохо, то лучше никак, на мой вкус.

Ищите что-то вроде  voice recognition, easyVRshield и тому подобное, дорого и плохо, но решайте сами.

А если не готовый модуль, а просто микрофон, и силами ардуино распознавать подаваемые команды?

Если надо, то добавить кардридер для записи звука на карту памяти, ну и одну кнопку, нажал на нее=говоришь, отпустил=команда записана, распознавать..Вот такую штуку было бы интересно сделать.

intrtrade
Offline
Зарегистрирован: 15.12.2016

Кстати, можно пульт д.у. такой сделать.. Набор колокольчиков или струн разной тональности. Ардуинке только и надо будет, что определять частоту звука. А сам пульт будет переносной и без батареек даже.. Смешной вариант? зато кажется не сложно реализовать.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

intrtrade пишет:

a = -a;

Если честно то мне кажется что эта команда присваивает знак "-" ? это не совсем то..

????? Ш-Ш-Шта?! Мне рассказывали, что когда кажется, нужно некие ритуальные действия производить ;).

------

Нет, это смена знака. Учебник арифметики за ...когда в школе проходят отрицательные числа?

-(-5) = 5, в курсе поговорки "минус на минус  дает плюс"?

---------------------

Вот не нужна Вам критика, сейчас обижаться начнете, а я - старое хамло, я иначе просто не смогу, уж простите.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

intrtrade пишет:

А если не готовый модуль, а просто микрофон, и силами ардуино распознавать подаваемые команды?

Почитайте в сети хоть что-то по распознаванию речи. Уровень задачи - даже не для персоналки, не говоря про ардуино.

intrtrade
Offline
Зарегистрирован: 15.12.2016

wdrakula пишет:

intrtrade пишет:

А если не готовый модуль, а просто микрофон, и силами ардуино распознавать подаваемые команды?

Почитайте в сети хоть что-то по распознаванию речи. Уровень задачи - даже не для персоналки, не говоря про ардуино.

А вот мой попугай распознает речевые команды, не говоря про собаку.. Неужели мощность пк менее мощности попугая? А может дело в алгоритмах распознования а не в гигагерцах и гигабайтах? в чем причина, как считаете?

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

intrtrade пишет:

Когда говоришь "полно в сети", неплохо бы дать хотя б одну ссылку, ведь это не трудно для тебя сделать, если "их там полно".

Дай, дайте, давайте, вот хапуга, было бы желание.

Если жалко сил курить тему, находишь на пример это открываешь потроха, и видишь это:

<SCRIPT language=JavaScript>
function ut(h,m,z)
{ return (h-z+m/60); }

function jd(y,m,d,u)
{ return (367*y)-Math.floor((7/4)*(Math.floor((m+9)/12)+y))+Math.floor(275*m/9)+d-730531.5+(u/24) }

function frm(n)
{ return Math.round(n*1000)/1000 }

function azimuth(lg,la,ye,mo,da,ho,mi,zo)
{ with (Math) {
var uu=ut(ho,mi,zo);
var jj=jd(ye,mo,da,uu);
var T=jj/36525;
var k=PI/180.0;
var M=357.5291+35999.0503*T-0.0001559*T*T-0.00000045*T*T*T
M=M % 360
var Lo=280.46645+36000.76983*T+0.0003032*T*T
Lo=Lo % 360
var DL=(1.9146-0.004817*T-0.000014*T*T)*sin(k*M)+(0.019993-0.000101*T)*sin(k*2*M)+0.00029*sin(k*3*M)
var L=Lo+DL
var eps=23.43999-0.013*T
var delta=(1/k)*asin(sin(L*k)*sin(eps*k))
var RA=(1/k)*atan2(cos(eps*k)*sin(L*k),cos(L*k))
RA=(RA+360) % 360
var GMST=280.46061837+360.98564736629*jj+0.000387933*T*T-T*T*T/38710000
GMST=(GMST+360) % 360
var LMST=GMST+lg
var H=LMST-RA
var eqt=(Lo-RA)*4
var azm=(1/k)*atan2(-sin(H*k),cos(la*k)*tan(delta*k)-sin(la*k)*cos(H*k))
azm=(azm+360) % 360

return azm
}}

function altitude(lg,la,ye,mo,da,ho,mi,zo)
{with (Math) {
var uu=ut(ho,mi,zo);
var jj=jd(ye,mo,da,uu);
var T=jj/36525;
var k=PI/180.0;
var M=357.5291+35999.0503*T-0.0001559*T*T-0.00000045*T*T*T
M=M % 360
var Lo=280.46645+36000.76983*T+0.0003032*T*T
Lo=Lo % 360
var DL=(1.9146-0.004817*T-0.000014*T*T)*sin(k*M)+(0.019993-0.000101*T)*sin(k*2*M)+0.00029*sin(k*3*M)
L=Lo+DL
var eps=23.43999-0.013*T
var delta=(1/k)*asin(sin(L*k)*sin(eps*k))
var RA=(1/k)*atan2(cos(eps*k)*sin(L*k),cos(L*k))
RA=(RA+360) % 360
var GMST=280.46061837+360.98564736629*jj+0.000387933*T*T-T*T*T/38710000
GMST=(GMST+360) % 360
var LMST=GMST+lg
var H=LMST-RA
var eqt=(Lo-RA)*4
var alt=(1/k)*asin(sin(la*k)*sin(delta*k)+cos(la*k)*cos(delta*k)*cos(H*k))
return alt;
}}

function settoday()
{ today=new Date()
thisyear=today.getYear()
if (thisyear<=1900) thisyear=thisyear+1900 // for Netscape on Mac
thismonth=today.getMonth()+1
thisday=today.getDate()
thishour=today.getHours()
thisminute=today.getMinutes()
offset=today.getTimezoneOffset()
if (offset>=1380) offset=offset-1440  // for Netscape on Mac
thiszone=-offset/60

document.sunform.year.value=thisyear;
document.sunform.month.value=thismonth;
document.sunform.day.value=thisday;document.sunform.hour.value=thishour;
document.sunform.min.value=thisminute;
document.sunform.zone.value=thiszone;
}
function setuserday()
{
document.sunform.year.value=1975;
document.sunform.month.value=thismonth;
document.sunform.day.value=thisday;document.sunform.hour.value=thishour;
document.sunform.min.value=thisminute;
document.sunform.zone.value=thiszone;
}


function sunpos()
{
var lg=1.0*document.sunform.longitude.value;
var lgmi=1.0*document.sunform.longmin.value;
var la=1.0*document.sunform.latitude.value;
var lami=1.0*document.sunform.latmin.value;
var ye=1.0*document.sunform.year.value;
var mo=1.0*document.sunform.month.value;
var da=1.0*document.sunform.day.value;
var ho=1.0*document.sunform.hour.value;
var mi=1.0*document.sunform.min.value;
var zo=1.0*document.sunform.zone.value;
var twr=1.0*document.sunform.twilightr.value;
var ewv=document.sunform.ew.options[document.sunform.ew.selectedIndex].value;
var nsv=document.sunform.ns.options[document.sunform.ns.selectedIndex].value;

var k=Math.PI/180.0;
lg=lg+lgmi/60
la=la+lami/60
lgo=lg
lao=la
aa=180.0

if (ewv=="East") { ewvr="Восточной долготы" } else { ewvr="Западной долготы" }
if (nsv=="North") { nsvr="Северной широты" } else { ewvr="Южной широты" } 
if (ewv=="West") { lg=-1.0*lg }
if (nsv=="South") { la=-1.0*la; aa=0.0 }

var alt=altitude(lg,la,ye,mo,da,ho,mi,zo)
var azm=azimuth(lg,la,ye,mo,da,ho,mi,zo)

h1=0
m=0
alt1=altitude(lg,la,ye,mo,da,h1,m,zo)
azm1=azimuth(lg,la,ye,mo,da,h1,m,zo)
s=-0.8333

// find midday interval
for (var h=0; h<24; h++){
h2=h
azm2=azimuth(lg,la,ye,mo,da,h2,m,zo)
if ((azm1<=180)&&(azm2>=180)){
ha1=h1
ha2=h2
}
h1=h2
azm1=azm2
}
// find exact midday time
mino=1.0;
for (h=ha1; h<ha2; h++){
for (m=0; m<60; m++){
azmo=azimuth(lg,la,ye,mo,da,h,m,zo)
dfo=Math.abs(aa-azmo)
if (dfo<=mino) {
mino=dfo
hno=h
mno=m
}}}
mday=""

altnoon=altitude(lg,la,ye,mo,da,hno,mno,zo);
if (altnoon<s){ mday="nigth" }

hr="не происходят"
mr=""
hs="не происходят"
ms=""
htwr="не происходят"
mtwr=""
htws="не происходят"
mtws=""

mintwr=0.1;
minr=0.1

for (h=0; h<=hno; h++){
for (m=0; m<60; m++){
if (60*h+m< 60*hno+mno){
altr=altitude(lg,la,ye,mo,da,h,m,zo)

dftwr=Math.abs(twr-altr)
if (dftwr<=mintwr) {
mintwr=dftwr
htwr=h
mtwr=m
}

if (altnoon > s){
dfr=Math.abs(s-altr)
if (dfr<=minr) {
minr=dfr
hr=h
mr=m
}}}}}

mins=0.1;
mintws=0.1;

for (h=hno; h<24; h++){
for (m=0; m<60; m++){
if (60*h+m >= 60*hno+mno){
alts=altitude(lg,la,ye,mo,da,h,m,zo)

if(altnoon>s){
dfs=Math.abs(s-alts)
if (dfs<=mins) {
mins=dfs
hs=h
ms=m
}}

dftws=Math.abs(twr-alts)
if (dftws<=mintws) {
mintws=dftws
htws=h
mtws=m
}}}}

немножко мозг напрячь и джаву в вринг переписать.

потратил минут 40, самому интересно стало.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

intrtrade пишет:

А вот мой попугай распознает речевые команды, не говоря про собаку.. 

Ардуине до Вашего поугая - как микробу до слона. Про сравнение с собакой я вообще молчу.

intrtrade
Offline
Зарегистрирован: 15.12.2016

это то что надо.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

intrtrade пишет:

А вот мой попугай распознает речевые команды, не говоря про собаку.. Неужели мощность пк менее мощности попугая?

Именно.

Цитата:
А может дело в алгоритмах распознования а не в гигагерцах и гигабайтах? в чем причина, как считаете?

В элементарной арифметике.

У человека порядка 10^11 нейронов. Пусть у попугая или собаки раз в 10 меньше. Некий аналог тактовой частоты - под сотню Гц. Итого, 10^12 операций в секунду. А на современных процессаорах (даже с учетом многоядерности) от силы 10^10. Т.е. минимум в 100 раз не дотягивает до попугая. Это мы еще взяли грубую оценку по числу нейронов, а не по числу дендритов.

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

intrtrade пишет:

А вот мой попугай распознает речевые команды, не говоря про собаку.. Неужели мощность пк менее мощности попугая? А может дело в алгоритмах распознования а не в гигагерцах и гигабайтах? в чем причина, как считаете?

если всё так просто, то почему ты используешь контроллер дуино, а не тушку попугая или собаки?

воткни провода в попугая - пусть распознаёт.

*кстати, мой попугай нихера не распознаёт - исключительно повторяет. заставить попугая исполнять команды не удалось. выход - втыкай провода в собаку. собака - наше фсё!

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

А если воткнуть провода в Клапауций 234, вообще зверь машина будет!!!

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

knack пишет:

А если воткнуть провода в Клапауций 234, вообще зверь машина будет!!!

в себя воткни провода, собака дикая.

intrtrade
Offline
Зарегистрирован: 15.12.2016

andriano пишет:

В элементарной арифметике.

У человека порядка 10^11 нейронов. Пусть у попугая или собаки раз в 10 меньше. Некий аналог тактовой частоты - под сотню Гц. Итого, 10^12 операций в секунду. А на современных процессаорах (даже с учетом многоядерности) от силы 10^10. Т.е. минимум в 100 раз не дотягивает до попугая. Это мы еще взяли грубую оценку по числу нейронов, а не по числу дендритов.

[/quote]

значит, дело все же в гигагерцах и гигабайтах, на Ваш взгляд.

Хорошо, тогда возьмите 100 пк и соединив их в сеть подобно нейронам, залейте нужную программу распознавания речи и вуаля,-получите способности попугая..а человек во сколько там раз умнее попугая? в 100? тогда добавим еще пк и получим сеть из 10000 компов, которые заменят мозг человека?))))

Может и с алгоритмами что-то не так,?))

Тогда смотрите, я сейчас один умный вещ скажу, только ты не обижайся...Человеческий мозг и попугайский тоже, они не появляются целиком и сразу, и программу в них никто не грузит террабайтами, а начинается все с пары клеточек, которые и строят и мозг и весь организм..вам достаточно написать программу подобную  той что в клетке, а далее она сама себя разовьет в любых масштабах, железо ведь не проблема.

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

Клапауций 234 пишет:

knack пишет:

А если воткнуть провода в Клапауций 234, вообще зверь машина будет!!!

в себя воткни провода, собака дикая.

гы, обидилса, а почему дикая то?

intrtrade
Offline
Зарегистрирован: 15.12.2016

Клапауций 234 пишет:

intrtrade пишет:

А вот мой попугай распознает речевые команды, не говоря про собаку.. Неужели мощность пк менее мощности попугая? А может дело в алгоритмах распознования а не в гигагерцах и гигабайтах? в чем причина, как считаете?

если всё так просто, то почему ты используешь контроллер дуино, а не тушку попугая или собаки?

воткни провода в попугая - пусть распознаёт.

*кстати, мой попугай нихера не распознаёт - исключительно повторяет. заставить попугая исполнять команды не удалось. выход - втыкай провода в собаку. собака - наше фсё!

Знаешь, про попугая я наврал, нет у меня попугая, и собаки нет. Но давай возьмем курицу, я лично видел как куры сбегаются когда их зовут голосовой командой типа цып-цып. Заметь, на другие слова того же человека они не реагируют, а на цып-сбегаются,  это значит что они различают на слух отдельные слова, чего и хотелось бы добиться от мк. А касательно твоей идеи использовать тела живых существ..мне кажется что живое существо это не комп, и на самом деле врядли когда-либо пк оживут, несмотря на любой уровень технологий, увы. Но попробовать ведь никто не запрещает, тем более это интересно, поможет лучше понять кто есть Я на самом деле.

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

intrtrade пишет:

вам достаточно написать программу подобную  той что в клетке, а далее она сама себя разовьет в любых масштабах, железо ведь не проблема.

это тебе достаточно, а не andriano

intrtrade
Offline
Зарегистрирован: 15.12.2016

хочу продолжить логическую цепочку.. Если все начинается с пары клеток, которые даже не являются нейронами но со временем из них вырастает целый мозг с 10 в 10 степени нейронов со слов andriano, теперь вопрос, а в какой момент там появляется программа распознования речи? а также изображений, и конечно весь тот алгоритм действий присущий живому существу? Неужели через пуповину загружается от матери ребенку как по USB шнуру?-врядли, потому что пуповина это просто шланг для поступления питательных веществ. А еще есть птицы которые вылупляются из яиц уже с готовыми программами, хотя никаких пуповин у них и не было..

Может быть эти все программы помещаются в одной клетке целиком? и дублируются, перезаписываются в каждую новую клетку?

Или эти программы пишет сам организм в процессе своего развития? Мне кажется этот вариант более реалистичный. А это будет значить, что Даже мощности ARDUINO достаточно, чтоб написать саморазвивающийся скетч, который сможет глобально стать чем угодно, справится с любыми задачами. 

А вы что думаете? 

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

intrtrade пишет:

А вы что думаете? 

ты заблудился? - тут форум дуиноводов, а не генетиков.

*клетки плодятся по воле боха и алляха.

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

intrtrade пишет:

Но давай возьмем курицу, я лично видел как куры сбегаются когда их зовут голосовой командой типа цып-цып. 

у меня рыбы в аквариме сбегаются, когда я стучу по стеклу - купи на рынке селёдку и морочь ей голову.

Nosferatu
Offline
Зарегистрирован: 04.11.2012

intrtrade пишет:

хочу продолжить логическую цепочку.. Если все начинается с пары клеток, которые даже не являются нейронами но со временем из них вырастает целый мозг с 10 в 10 степени нейронов со слов andriano, теперь вопрос, а в какой момент там появляется программа распознования речи? а также изображений, и конечно весь тот алгоритм действий присущий живому существу? Неужели через пуповину загружается от матери ребенку как по USB шнуру?-врядли, потому что пуповина это просто шланг для поступления питательных веществ. А еще есть птицы которые вылупляются из яиц уже с готовыми программами, хотя никаких пуповин у них и не было..

Может быть эти все программы помещаются в одной клетке целиком? и дублируются, перезаписываются в каждую новую клетку?

Или эти программы пишет сам организм в процессе своего развития? Мне кажется этот вариант более реалистичный. А это будет значить, что Даже мощности ARDUINO достаточно, чтоб написать саморазвивающийся скетч, который сможет глобально стать чем угодно, справится с любыми задачами. 

А вы что думаете? 

Эти программы изначально жестко прописаны в клетке в ДНК, как прошивка в МК.  И только когда известно к какой "периферии подключены" какие "датчики", тогда начинают формироваться программы настройки "датчиков" и программы реагирования на сигналы с них (принципы нейронных сетей).

Мощности ардуины хватит чтобы написать саморазвивающейся примитивный организм, который сам сможет находить освещённые места, где можно подзарядится, и сможет убегать при приближении  кого-либо. Вот если обеднить таких саморазвивающиеся  роботов в сеть (рой), да прописать им алгоритм распределенных вычислений...

intrtrade
Offline
Зарегистрирован: 15.12.2016

днк это 100 милиардов атомов, это наверное не меньше 100 гб данных, да, пожалуй туда можно записать любую программу, и еще места под пару фильмов в HD качестве хватит.  Но эти программы "под ключ" ведь никто не писал, только "эволюция" модернизирует код от поколения к поколению..А значит программа должна уметь писать саму себя, из какого-то короткого кода должно все начинатся. Длинный код просто не мог "зародится" случайным образом.

Изначальный алгоритм должен быть  прост, изменять себя по мере необходимости он должен сам, при этом у него не должно быть возможности "сломаться" (типа там зависаний в вечном цикле..)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

intrtrade пишет:

ua6em пишет:

это надо столько наворотить )))
есть же астрологическая математика

Я не математик и не астролог. Если есть скетч который делает то же самое но более совершенным методом, дай мне его. И еще я не программист, я познакомился с ардуино и с языком С++ на этом сайте с месяц назад, и в результате своял программу которая РАБОТАЕТ как и планировалось. Не совершенна, я знаю.

Контроллер поворотного устройства от K3NG вам в помощь в нём есть функция и сантрекера

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

intrtrade пишет:

 А еще есть птицы которые вылупляются из яиц уже с готовыми программами, хотя никаких пуповин у них и не было..

Как не было, есть, идёт на мягкую оболочку яйца, она через неё "дышит" и воду из воздуха забирает, а от чего цыплята вес набирают )))

intrtrade
Offline
Зарегистрирован: 15.12.2016

    

Logik
Offline
Зарегистрирован: 05.08.2014

intrtrade пишет:

днк это 100 милиардов атомов, это наверное не меньше 100 гб данных

Нет. Всего 1.5ГБ. Как кино в херовеньком качестве. И то 50% мусора там (читая форум думаю что и до 99% может доходить ;). Там группа оснований нуклеиновых кислот один бит кодируют, а это довольно много атомов на бит. Но то только база. Циплята не умеют от рождения многое, они учатся на цыпацыпа бежать и эта инфа  - условный рефлекс, он не в днк, он в структуре мозгов. Грубо говоря не в флешке а в ОЗУ.

По теме. Я в курсе что астрономию в школе астрологией заменили, но неужели эту картинку ТС не видел.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Вот только на Земле немного не так. https://goo.gl/SVUAP7. Но ТС не надо стрелять по Солнцу точно. Плюс-минус пару сапогов нормальная точность.

intrtrade
Offline
Зарегистрирован: 15.12.2016

Logik пишет:

intrtrade пишет:

днк это 100 милиардов атомов, это наверное не меньше 100 гб данных

Нет. Всего 1.5ГБ. Как кино в херовеньком качестве. И то 50% мусора там (читая форум думаю что и до 99% может доходить ;). Там группа оснований нуклеиновых кислот один бит кодируют, а это довольно много атомов на бит. Но то только база. Циплята не умеют от рождения многое, они учатся на цыпацыпа бежать и эта инфа  - условный рефлекс, он не в днк, он в структуре мозгов. Грубо говоря не в флешке а в ОЗУ.

По теме. Я в курсе что астрономию в школе астрологией заменили, но неужели эту картинку ТС не видел.

как на этом форуме вырезать цитаты из текста? Теперь по теме, кто такой ТС?? Я? В моей программе все соответствует этой картинке, уверяю :) Вы обязательно гляньте видео моего трекера, неуклюжая ссылка на которое находится в первой строке программы. На видео вы обнаружите, что трекер не так прост и примитивен..моя программа писалась конкретно под мой трекер, и на других она будет работаеть не корректно. Главная особенность в угле осей трекера, они вычисляются исходя из широты, индивидуально. Благодаря этому при наводке на солнце достаточно крутить только по одной оси..

А по поводу 1.5 гигабайта не совсем понял..разве клетка не способна "считывать" инфу о каждом отдельном атоме? А еще там ведь вроде не двоичная система, ведь атомы могут разное положение занимать и вроде вещества разные могут быть? Я профан в этом деле, если вы в курсе вещей, просветите :)

intrtrade
Offline
Зарегистрирован: 15.12.2016

qwone пишет:

Вот только на Земле немного не так. https://goo.gl/SVUAP7. Но ТС не надо стрелять по Солнцу точно. Плюс-минус пару сапогов нормальная точность.

У меня погрешность не более 4 градусов по обоим осям. Это совсем не плохо. Для солнечных батарей вполне достаточно.

Logik
Offline
Зарегистрирован: 05.08.2014

Ну да, аналема как раз до 4 градусов. И это за год. И для батарей пофиг. Потому и намекаю рисунком, что надо просто ось вращения на полюс один оборот в сутки, аппаратно ограничение горизонта  и склонение иногда, раз в неделю например,  поправлять - хоть ручками хоть автоматом, там простая формула. И все. 

Logik
Offline
Зарегистрирован: 05.08.2014

intrtrade пишет:

 А еще там ведь вроде не двоичная система, ведь атомы могут разное положение занимать и вроде вещества разные могут быть? Я профан в этом деле, если вы в курсе вещей, просветите :)

https://ru.wikipedia.org/wiki/Генетический_код

intrtrade
Offline
Зарегистрирован: 15.12.2016

Logik пишет:

Ну да, аналема как раз до 4 градусов. И это за год. И для батарей пофиг. Потому и намекаю рисунком, что надо просто ось вращения на полюс один оборот в сутки, аппаратно ограничение горизонта  и склонение иногда, раз в неделю например,  поправлять - хоть ручками хоть автоматом, там простая формула. И все. 

Мне кажется что именно так у меня и сделано. Нет? Там выше был ответ также на ваш пост о 1.5 Гб..

Logik
Offline
Зарегистрирован: 05.08.2014

Видео посмотрел, механика впечатляет. А код выглядит неоправдано усложненным. Повернуть со скоростю 15град/час да еще и с дискретностю в скокото (как привод позволяет) градусов, можна и проще. Например раз в четыре минуты плюс 1градус пока не уткнулись в горизонт. В полночь поворот на восток до горизонта. И раз в неделю поправку на склонение. Оно так - http://pvcdrom.pveducation.org/RU/SUNLIGHT/DECLIN.HTM image023.png

intrtrade
Offline
Зарегистрирован: 15.12.2016

Logik пишет:

Видео посмотрел, механика впечатляет. А код выглядит неоправдано усложненным. Повернуть со скоростю 15град/час да еще и с дискретностю в скокото (как привод позволяет) градусов, можна и проще. Например раз в четыре минуты плюс 1градус пока не уткнулись в горизонт. Вв полночь поворот на восток до горизонта. И раз в неделю поправку на склонение. Оно так - image023.png

Раз в четыре минуты пока не уткнешся в горизонт-так не получится, потому что уткнешся панелями в столб трекера. Зимой, сечас вот, когда панели под углом всего 17 градусов, свободный ход трекера получается не такой как летом, когда панели смотрят вверх...механика не позволяет вращать на 360 градусов, а только на 200, и то летом...

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

intrtrade пишет:

значит, дело все же в гигагерцах и гигабайтах, на Ваш взгляд.

...

Может и с алгоритмами что-то не так,?))

Почему машина не едет?

Мотор сломался?

Бензин кончился?

Колеса сперли?

Любой из этих причин достаточно, чтобы машина не ехала. Одной!

Выявили одну причину, пока ее не устранили, другие причины искать без толку. Но и утверждать, что раз машина не может ехать из-за отсутствия колес, значит, бензин в ней точно есть, - абсурд.

С другой стороны, и мотор починили, и колеса нашли, и бензин залили, а как ехать, если водителя нет?

Так же и с Ардуино - не хватает вычислительных мощностей - и этого достаточно. Попытайтесь научить распознавать голосовые команды улитку. Да и с курами пример некорректный - это условный рефлекс, к командам никакого отношения не имеющий. Сомневаетесь, - попытайтесь научить курицу именно команде, а не выработать условный рефлекс на еду или опасность.

По теории любая алгоритмическая задача может быть решена машиной с любой производительностью, если ее система команд полна. Но в этой теории подразумевается, что есть ограничения на производительность, но нет ограничения на объем памяти (память теоретической вычислительной машины бесконечна). Поэтому на практике это не работает.

Ардуина не обладает достаточной вычислительной мощностью, чтобы распознать команду в реальном времени, и не рбладает достаточным объемом памяти, чтобы сохранить эту команду для дальнейшего анализа.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

intrtrade пишет:

Изначальный алгоритм должен быть  прост, изменять себя по мере необходимости он должен сам, при этом у него не должно быть возможности "сломаться" (типа там зависаний в вечном цикле..)

Наоборот.

Он должен быть способен сломаться. Но этого недостаточно. Еще он должен уметь воспроизводить себе подобных, при этом воспроизводстве должны быть два качества, которые являлись бы аналогом наследственности и изменчивости.

Иначе вместо прогресса будет тупик.

Logik
Offline
Зарегистрирован: 05.08.2014

intrtrade пишет:

Раз в четыре минуты пока не уткнешся в горизонт-так не получится...механика не позволяет вращать на 360 градусов, а только на 200, и то летом...

Ну знач пока механика позволяет, оно шо горизонт - небесная механика, шо просто механика - аппаратное ограничение ;) В общем по слежению за солнцем понятно- в рамках аппаратных ограничений это просто суточное вращение с редкой коррекцией склонения.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Это не у Ардуины вычислительной мощности не хватает, это у программистов не хватает вычислительной мощности(по простому мозга). 

intrtrade
Offline
Зарегистрирован: 15.12.2016

В памяти ардуино не ограничена, ведь мы можем подключить модули с cd картами. Записать на карту и анализировать хоть день, никто во времени не торопит..главное результат. Так что с ваших слов, andriano, все возможно.