Помощь с кодом
- Войдите на сайт для отправки комментариев
Есть два кода. Один определяет температуру с датчика, и пишет её в монитор 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 }
можете нажать Нажмите ctrl-T в ардуиноIDE - что-бы четче было видно "кто в кого вложен". Отформатировать скобки и т.п.
А проблема в том, что вы пытаетесь определить функцию внутри функции
Вам нужно либо выносить printTemperature() из loop() и толкьо вызвать его, либо копировать только ее содержимое внутрь, но не само ее объявление.
Попробуйте так:
Не вникал, выкинул только попытку объявить функцию. "либо копировать..." вы похоже уже сами сделали.
Не знаю работает ли, но компилируется
Спасибо, заработало.
Ещё вопрос: нужно сделать их тела программы цикл, повторяющийся каждые, например, 5 секунд. Как это можно сделать? Void loop я так понимаю, здесь не может работать.
Спасибо, заработало.
Ну и славно. Только на будущие - пожалуста называйте свои темы более уникально/информативно. "Помогите с кодом" - под это название подходит 98% тем на форуме. Не называть же их все одинаково. В вашем случае, что-то типа "запись показаний DS18B20 на SD" , или "сохранение показаний датчика на карту" и т.п. - было бы намного более информативным
Ещё вопрос: нужно сделать их тела программы цикл, повторяющийся каждые, например, 5 секунд. Как это можно сделать? Void loop я так понимаю, здесь не может работать.
Ошибаетесь. Может. Вся жизнь крутится внутри loop().
Посмотрите в разделе Программирование (в шапке сайта) пример "Мигаем светодиодом без delay...".
А еще можете восопльзоватся поиском или просто проглядеть темы обсуждаемые за последние несколько дней/неделю. Там обсуждалось это не раз (про большие сроки - я и не говорю)
Но начните с разбора примера. Возможно хватит и его.
Ладно. Я вставил void loop(), оптимизировал код - перенес часть, отвечающую за нахождение температуры и запись её на SD, в void loop(), но компилятор ругается на фигурных скобках после loop - пишет
"TempSD.ino: In function 'void setup()':
TempSD:30: error: a function-definition is not allowed here before '{' token"
Автоформатирование не работает, пишет - слишком много левых скобок, но все скобки, вроде бы, на месте...
Я конечно хорошо понимаю английский, но "function-definition is not allowed here before '{' token" не могу толково перевести.
Возьмите свой текст и аккуратно посчитайтк количество символов '{' и '}'.
Может быть, это даст ответ:?
Строки 27-29.
Вы пытаетесь объявить функцию loop() внутри if-блока. Который, сам, в свою очередь объявлен в функции setup().
Вообщем вы снова пытаетесь объявить одну функцию, внутри другой. Пройдитесь внимательно. Посмотрите где у вас начинается функцию setup(), где заканчивает.
Раз автоформатирвание не работает, значит руками и глазами внимательно самому. Например строка 21. Если верить форматированию, это фигурная скобка закрывает скобку открытую в строке 11. А если всмотрется внимателей, то стаент видно, что на самом деле она закрывает { из строки 18-ть.
Вообщем раставляйте форматирование аккуратно. Поправляйте "кто на ком стоял". Вот такого как строки 44,45,46 - не должно быть.
Если 44, 45 вложены в 46, то они толожны иметь отступ вправо (и все что внути их). Тогда и будет видно кто где начался и где закончился, а не "все сливается". Не удивительно что вы путаетесь.
Вообщем вот такое код:
Это лажа. Хоть и верно синтаксически, а запутатся в скобках - раз плюнуть, должно быть
Количество открывающих и закрывающих - должно совпадать. И объявления каки-то функций не может быть внутри других функций. Нет тут понятия "локальная функция".
Компилятор он такой, всё время ему что не нравится! :)