Помощь с кодом

Nickalaich
Nickalaich аватар
Offline
Зарегистрирован: 07.04.2013

Есть два кода. Один определяет температуру с датчика, и пишет её в монитор com-порта. Другой -тестовый кусок, для работы с SD-картой - записывает тестовый файл на карту, и немножко болтает по тому же com-порту. Я попробовал вставить одну программу в другую - программу определения температуры в тестовую программу для работы с SD-картой, и поначалу, всё завелось, но ничего не писалось. Подредактировав код, компилятор версии 1.0.2 стал выдавать ошибки:
sketch_apr07b.ino: In function 'void setup()':
sketch_apr07b:28: error: a function-definition is not allowed here before '{' token
sketch_apr07b:52: error: expected `}' at end of input
sketch_apr07b:52: error: expected `}' at end of input
Что ему не так - ума не приложу. Можете помочь, и по возможности поправить? Заранее спасибо.
Программа температуры:
 

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 3
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress insideThermometer = { 0x28, 0x42, 0x91, 0x2F, 0x02, 0x00, 0x00, 0xDA };
void setup(void)
{
  // start serial port
  Serial.begin(9600);
  // Start up the library
  sensors.begin();
  // set the resolution to 10 bit (good enough?)
  sensors.setResolution(insideThermometer, 10);
}
void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) {
    Serial.print("Error getting temperature");
  } else {
    Serial.print("C: ");
    Serial.print(tempC);
    Serial.print(" F: ");
    Serial.print(DallasTemperature::toFahrenheit(tempC));
  }
}
void loop(void)
{ 
  delay(2000);
  Serial.print("Getting temperatures...\n\r");
  sensors.requestTemperatures();
  
  Serial.print("Inside temperature is: ");
  printTemperature(insideThermometer);
  Serial.print("\n\r");
  }

Тестовая программа для SD:
 

void setup()
{
  Serial.begin(9600);
  Serial.print("Initializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin 
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output 
  // or the SD library functions will not work. 
   pinMode(10, OUTPUT);
 
  if (!SD.begin(10)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
 
  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  myFile = SD.open("test.txt", FILE_WRITE);
 
  // if the file opened okay, write to it:
  if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println("testing 1, 2, 3.");
	// close the file:
    myFile.close();
    Serial.println("done.");
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
}
 
void loop()
{
	// nothing happens after setup
}

Моё поделие:

#include <OneWire.h>
#include <DallasTemperature.h>
#include <SD.h>
#define ONE_WIRE_BUS 3
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress insideThermometer = { 0x28, 0x42, 0x91, 0x2F, 0x02, 0x00, 0x00, 0xDA };
File myFile;
void setup()
{
  Serial.begin(9600);
  Serial.print("Initializing SD card...");pinMode(10, OUTPUT);
 sensors.begin();
  // set the resolution to 10 bit (good enough?)
  sensors.setResolution(insideThermometer, 10);
  if (!SD.begin(10)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
 
  myFile = SD.open("test.txt", FILE_WRITE);
 
  // if the file opened okay, write to it:
  if (myFile) 
  {
    void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) 
  {
    Serial.print("Error getting temperature");
  } else 
  {
    Serial.print("Writing to temp.txt...");
    myFile.print("C: ");
    myFile.print(tempC);
    myFile.close();
    Serial.println("done.");
  }
}
    
    
  } else 
  {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
}
 
void loop()
{
	// nothing happens after setup
}

 

leshak
Offline
Зарегистрирован: 29.09.2011

можете нажать Нажмите ctrl-T в ардуиноIDE - что-бы четче было видно "кто в кого вложен". Отформатировать скобки и т.п.

А проблема в том, что вы пытаетесь определить функцию внутри функции 

Вам нужно либо выносить printTemperature() из loop() и толкьо вызвать его, либо копировать только ее содержимое внутрь, но не само ее объявление.

 

leshak
Offline
Зарегистрирован: 29.09.2011

Попробуйте так:

Не вникал, выкинул только попытку объявить функцию. "либо копировать..." вы похоже уже сами сделали.

Не знаю работает ли, но компилируется

 

#include <OneWire.h>
#include <DallasTemperature.h>
#include <SD.h>
#define ONE_WIRE_BUS 3
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress insideThermometer = { 
  0x28, 0x42, 0x91, 0x2F, 0x02, 0x00, 0x00, 0xDA };
File myFile;
void setup()
{
  Serial.begin(9600);
  Serial.print("Initializing SD card...");
  pinMode(10, OUTPUT);
  sensors.begin();
  // set the resolution to 10 bit (good enough?)
  sensors.setResolution(insideThermometer, 10);
  if (!SD.begin(10)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

  myFile = SD.open("test.txt", FILE_WRITE);

  // if the file opened okay, write to it:
  if (myFile) 
  {

      float tempC = sensors.getTempC(insideThermometer );
      if (tempC == -127.00) 
      {
        Serial.print("Error getting temperature");
      } 
      else 
      {
        Serial.print("Writing to temp.txt...");
        myFile.print("C: ");
        myFile.print(tempC);
        myFile.close();
        Serial.println("done.");
      }

  } 
  else 
  {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
}

void loop()
{
  // nothing happens after setup
}

 

Nickalaich
Nickalaich аватар
Offline
Зарегистрирован: 07.04.2013

Спасибо, заработало.
Ещё вопрос: нужно сделать их тела программы цикл, повторяющийся каждые, например, 5 секунд. Как это можно сделать? Void loop я так понимаю, здесь не может работать.

leshak
Offline
Зарегистрирован: 29.09.2011

Nickalaich пишет:

Спасибо, заработало.

Ну и славно. Только на будущие - пожалуста называйте свои темы более уникально/информативно. "Помогите с кодом" - под это название подходит 98% тем на форуме. Не называть же их все одинаково. В вашем случае, что-то типа "запись показаний DS18B20 на SD" , или "сохранение показаний датчика на карту" и т.п. - было бы намного более информативным

Nickalaich пишет:

Ещё вопрос: нужно сделать их тела программы цикл, повторяющийся каждые, например, 5 секунд. Как это можно сделать? Void loop я так понимаю, здесь не может работать.

Ошибаетесь. Может. Вся жизнь крутится внутри loop().

Посмотрите в разделе Программирование (в шапке сайта) пример "Мигаем светодиодом без delay...".

А еще можете восопльзоватся поиском или просто проглядеть темы обсуждаемые за последние несколько дней/неделю. Там обсуждалось это не раз (про большие сроки - я и не говорю)

Но начните с разбора примера. Возможно хватит и его. 

Nickalaich
Nickalaich аватар
Offline
Зарегистрирован: 07.04.2013

Ладно. Я вставил void loop(), оптимизировал код - перенес часть, отвечающую за нахождение температуры и запись её на SD, в void loop(), но компилятор ругается на фигурных скобках после loop - пишет

"TempSD.ino: In function 'void setup()':
TempSD:30: error: a function-definition is not allowed here before '{' token"
 

#include <OneWire.h>
#include <DallasTemperature.h>
#include <SD.h>
#define ONE_WIRE_BUS 3
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress insideThermometer = { 
  0x28, 0x42, 0x91, 0x2F, 0x02, 0x00, 0x00, 0xDA };
File myFile;
void setup()
{
  Serial.begin(9600);
  Serial.print("Initializing SD card...");
  pinMode(10, OUTPUT);
  sensors.begin();
  // set the resolution to 10 bit (good enough?)
  sensors.setResolution(insideThermometer, 10);
  if (!SD.begin(10)) {
    Serial.println("initialization failed!");
    return;
}
  Serial.println("initialization done.");

  myFile = SD.open("temp.txt", FILE_WRITE);

  // if the file opened okay, write to it:
  if (myFile) 
{
   void loop()
{
  float tempC = sensors.getTempC(insideThermometer );
  if (tempC == -127.00) 
{
    Serial.print("Error getting temperature");
} 
  else
{
    Serial.print("Writing to temp.txt...");
    myFile.print("C: ");
    myFile.print(tempC);
    myFile.close();
    Serial.println("done.");
    delay(2000);// nothing happens after setup
}
}
}

Автоформатирование не работает, пишет - слишком много левых скобок, но все скобки, вроде бы, на месте...
Я конечно хорошо понимаю английский, но "function-definition is not allowed here before '{' token" не могу толково перевести.

tsostik
Offline
Зарегистрирован: 28.02.2013

Возьмите свой текст и аккуратно посчитайтк количество символов '{' и '}'.

Может быть, это даст ответ:?

leshak
Offline
Зарегистрирован: 29.09.2011

Строки 27-29.

Вы пытаетесь объявить функцию loop() внутри if-блока. Который, сам, в свою очередь объявлен в функции setup().

Вообщем вы снова пытаетесь объявить одну функцию, внутри другой. Пройдитесь внимательно. Посмотрите где у вас начинается функцию setup(), где заканчивает.

Раз автоформатирвание не работает, значит руками и глазами внимательно самому. Например строка 21. Если верить форматированию, это фигурная скобка закрывает скобку открытую в строке 11. А если всмотрется внимателей, то стаент видно, что на самом деле она закрывает { из строки 18-ть.

Вообщем раставляйте форматирование аккуратно. Поправляйте "кто на ком стоял". Вот такого как строки 44,45,46 - не должно быть.

Если 44, 45 вложены в  46, то они толожны иметь отступ вправо (и все что внути их). Тогда и будет видно кто где начался и где закончился, а не "все сливается". Не удивительно что вы путаетесь.

Вообщем вот такое код:

       if(Условий1){
    if(Условие2){
if(Условие3){
}
}
}

Это лажа. Хоть и верно синтаксически, а запутатся в скобках - раз плюнуть, должно быть

if(Условие1){
      Еще какой-токод 1
       if(Условие2){
              Еще какой-токод 2
               if(Условие3){
               }
              Еще какой-токод 3
       }
}

Количество открывающих и закрывающих - должно совпадать.  И объявления каки-то функций не может быть внутри других функций. Нет тут понятия "локальная функция".

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Компилятор он такой, всё время ему что не нравится! :)