Помогите с кодом

Doramirs
Offline
Зарегистрирован: 20.07.2015
#include <math.h>
#define FIRST_LED_PIN 2
#define LED_COUNT 10
void setup()
{
  for (int i = 0; i < LED_COUNT; ++i)
    pinMode(i + FIRST_LED_PIN, OUTPUT);
}
void loop()
{
  float voltage = analogRead(A0) * 5.0 / 1023.0;
  float temperature = 1.0 / (log(voltage / 2.5) / 4300.0 +
                             1.0 / 298.0) - 273.0;
  for (int i = 0; i < LED_COUNT; ++i) {
    boolean enableSegment = (temperature >= 20 + i);
    digitalWrite(i + FIRST_LED_PIN, enableSegment);
  }
 
  delay(2000);
#define FIRST_LED_PIN 2
#define LAST_LED_PIN 11
  void setup()
  {
    for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin)
      pinMode(pin, OUTPUT);
  }
  void loop()
  {
    unsigned long int ms = millis();
    int pin =  FIRST_LED_PIN + (ms / 120) % 10;
    digitalWrite(pin, HIGH);
    delay(10);
    digitalWrite(pin, LOW);
 
  }
выдает ошибку :a function-definition is not allowed here before '{' token
dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

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

Doramirs
Offline
Зарегистрирован: 20.07.2015
#include <math.h>
#define FIRST_LED_PIN 2
#define LED_COUNT 10
void setup()
{
  for (int i = 0; i < LED_COUNT; ++i)
    pinMode(i + FIRST_LED_PIN, OUTPUT);
}
void loop()
{
  float voltage = analogRead(A0) * 5.0 / 1023.0;
  float temperature = 1.0 / (log(voltage / 2.5) / 4300.0 +
                             1.0 / 298.0) - 273.0;
  for (int i = 0; i < LED_COUNT; ++i) {
    boolean enableSegment = (temperature >= 20 + i);
    digitalWrite(i + FIRST_LED_PIN, enableSegment);
  }
}
#define FIRST_LED_PIN 2
#define LAST_LED_PIN 11
  void setup()
  {
    for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin)
      pinMode(pin, OUTPUT);
  }
  void loop()
  {
    unsigned long int ms = millis();
    int pin =  FIRST_LED_PIN + (ms / 120) % 10;
    digitalWrite(pin, HIGH);
    delay(10);
    digitalWrite(pin, LOW);

  }

нужно соединить 2 скетча в один чтобы в ночале работал первый скетч через некоторое время второй 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Doramirs пишет:

нужно соединить 2 скетча в один чтобы в ночале работал первый скетч через некоторое время второй 

Понятие "некоторое время" неприменимо к программированию. Нужно точно представлять себе по каким условиям должна начаться обработка другого фрагмента, и по каким условиям закончится и вернуться к первому.

Doramirs
Offline
Зарегистрирован: 20.07.2015

10 секунд

Doramirs
Offline
Зарегистрирован: 20.07.2015

условие возврата к первому когда второй проработал 10 секунд

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Doramirs, каждые 10 секунд меняется флаг n, а по флагу запускается первая или вторая функция.

#include <math.h>
#define FIRST_LED_PIN 2
#define LED_COUNT 10
unsigned long prevmillis;
boolean n=true;; //флаг очереди

void setup(){
  for (int i = 0; i < LED_COUNT; ++i)
   pinMode(i + FIRST_LED_PIN, OUTPUT);
}

void loop() {

  if (millis()-prevmillis>10000) {
    prevmillis=millis();
    n=!n;
    } //каждые 10 сек менять флаг

n? first_prog() : second_prog();
} // если n "true" -перейти в функцию first_prog() иначе на second_prog()



void first_prog(){
  float voltage = analogRead(A0) * 5.0 / 1023.0;
  float temperature = 1.0 / (log(voltage / 2.5) / 4300.0 +
                             1.0 / 298.0) - 273.0;
  for (int i = 0; i < LED_COUNT; ++i) {
    boolean enableSegment = (temperature >= 20 + i);
    digitalWrite(i + FIRST_LED_PIN, enableSegment);
    }
}

void second_prog(){
    int pin =  FIRST_LED_PIN + (millis() / 120) % 10;
    digitalWrite(pin, HIGH);
    delay(10);
    digitalWrite(pin, LOW);
}
  

 

Doramirs
Offline
Зарегистрирован: 20.07.2015

Большое СПАСИБО

xOreoNx
Offline
Зарегистрирован: 20.07.2015

Здравствуйте товарищи знатоки!!! 

Подскажите пожалуйста, насчет одного непонятного момента. У меня в коде считываются прерывания (rpmcount) допусоим ее значение 500. Ну когда я ее вывожу на дисплей(я делаю линию типо графика, и числовое значение) нокиа 5510 (китай) то она отображается несовсем коректно. А точнее заместь постоянно показывать число 500, оно каждые 100мс плюсует это число, и так постоянно циклично так сказать перенасыщает переменную, потом идет в минуса!!! я так думаю чтото связано с буфером дисплея, или с переменными. Подскажите пожалуйста! Пытался сам решить, не одну неделю голову сушил!!! Вот код!

#include <LCD5110_Graph.h>

LCD5110 myGLCD(7,6,5,3,4);
extern uint8_t SmallFont[];

int button = 9;
int fix = 0;
int pin = 2;
volatile int rpmcount = 0;
unsigned long lastmillis = 0;
int x,y,z=0;


void setup()
{ myGLCD.InitLCD();
  myGLCD.setFont(SmallFont);
  randomSeed(analogRead(7));
 myGLCD.setContrast(50);
  pinMode(button,INPUT);
  
  attachInterrupt(0, rpm_fan, FALLING);
}
 
void loop(){
  
 
 
  myGLCD.setFont(SmallFont);
  myGLCD.printNumI(rpmcount, CENTER, 0);
  myGLCD.update();
  delay(100);
 
  y = map(rpmcount, 0, 600, 47, 0);
  myGLCD.drawLine(x, z, x+1, y);
  myGLCD.update();
  z=y;
  x++;
  if(x>=83){x=0;myGLCD.clrScr();}
      

   if (millis() - lastmillis == 100){ /*Uptade every one second, this will be equal to reading frecuency (Hz).*/

detachInterrupt(0); //Disable interrupt when calculating

rpmcount = 0; // Restart the RPM counter
lastmillis = millis(); // Uptade lasmillis
attachInterrupt(0, rpm_fan, FALLING); //enable interrupt
}
}

void rpm_fan(){ /* this code will be executed every time the interrupt 0 (pin2) gets low.*/
rpmcount++;
} 

 

xOreoNx
Offline
Зарегистрирован: 20.07.2015

Коментарии к коду не совсем корректны! 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

xOreoNx, из режущего глаза -посмотрите 41 строку. Во первых нельзя там ставить ==, т.к. велика вероятность, что проскочет  данное значение, и не сработает. Нужно ставить  .. lastmillis > 100  Во вторых в комментарии написано каждую секунду, а стоит 100ms.

xOreoNx
Offline
Зарегистрирован: 20.07.2015

Да! насчет коментов там была секунда, я менял на 100мс, ну если там поставить 1000мс оно будет плюсоватся каждую секунду.

Radjah
Offline
Зарегистрирован: 06.08.2014

А нахрена прерывания дергаешь?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Radjah пишет:

А нахрена прерывания дергаешь?


Нравиться ему, вот и дергает. Но код забавный. Счетчик от прерываний. А основной код изолентой примотан. :) он походу и выполняться не успевает. Ибо весь в прерываниях.

xOreoNx
Offline
Зарегистрирован: 20.07.2015

Спасибо за изоленту я электрик!)))) Так может подскажите?

xOreoNx
Offline
Зарегистрирован: 20.07.2015

И к стати! Код выполняется, проблема только в одном ( више описанном).

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

xOreoNx пишет:

Спасибо за изоленту я электрик!)))) Так может подскажите?


А я дальнобойщик. Что тут подсказывать? Фигня какая-то. Есть предложение как и к предыдущим подобным просьбам. Взять листик бумаги (можно рулон туалетной) и карандаши и нарисовать на нем алгоритм вашей программы.

xOreoNx
Offline
Зарегистрирован: 20.07.2015

47, 48 строчки там можно убирать они не нужны.

xOreoNx
Offline
Зарегистрирован: 20.07.2015

уже убрал.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

xOreoNx пишет:

И к стати! Код выполняется, проблема только в одном ( више описанном).


Да ваще не вопрос. Ввполняется, пользуйтесь тогда на здоровье.
Маяк работает, проблема только в одном, лампочку сперли.

xOreoNx
Offline
Зарегистрирован: 20.07.2015

Ладно спасибо и за такой совет!)

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Про рулон я не пошутил. Удобно разматывай и дорисовывай.