Arduino error assignment of read only variable

Доброго времени суток. Только начал прользоваться ARDUINO. Чтоб не сжечь плату я пробую все делать сперва на эмуляторе https://123d.circuits.io Повторив несколько несложных схем, решил сдеать чтото свое. Но проблема при компилации выдает ошибки. Большую часть я исправил а вот с оставшимися не могу разобраться. привожу код ниже.

немогу разобраться с ошибками при компиляци

Offline

Зарегистрирован: 19.02.2016

Доброго времени суток. Только начал прользоваться ARDUINO.

Чтоб не сжечь плату я пробую все делать сперва на эмуляторе https://123d.circuits.io

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

// библиотека с коммандами для сервоприводов
#include <Servo.h> 
//описание библиотеки по ссылке - arduino.cc/en/Reference/Servo
 
const int LED_GO = 7;	//обьявляем константу для лампы движения и номер пина 7
const int LED_STOP = 6; //объявляем константу для лампы остановки и номер пина 6
const int knopka1 = 5; //Объявляем константу для кнопки и номер пина 5
Servo servo1;  // объект сервопривод №1
Servo servo2; // серво привод №2 
void setup()
{
  pinMode(LED_GO, OUTPUT);
  pinMode(LED_STOP, OUTPUT);
  pinMode(knopka1, INPUT);
  servo2.attach(11); // Серво привод подключен к пину 11
  servo1.attach(9); // Сервопривод подключен к цифровому выходу 9
  //servo1.detach() для расслабления мотора сервопривода
}
 
void loop()
{
 int knopkaStatus;
  knopkaStatus = digitalRead(knopka1);
 if (knopkaStatus == HIGT)
 {
   digitalWrite(LED_GO = HIGT);
       // Крутилка на полной скорости:
  servo1.write(90);    // повернись на 90 град.
  delay(1000);         // пауза чтобы он успел повернуться
  servo2.write(90);		//второй серво привод поворот 90 град
  delay(1000);			//пуза второго
  servo1.write(180);   // повернись на 180 град.
  delay(1000);         // пауза
  servo2.write(180);	//поворот второго привода на 180 град
  delay(1000);			//пауза второго
  servo1.write(0);     // повернись до уровня 0 град.
  delay(1000);         // пауза
  servo2.write(0);		//поворот второго на 0 град
  delay(1000);			//пауза второго
 }
  else
  {
   digitalWrite(LED_STOP = LOW);
  }
}

Вот ошибки 

 In function 'void loop()':
24:22: error: 'HIGT' was not declared in this scope
43:26: error: assignment of read-only variable 'LED_STOP'
43:31: error: too few arguments to function 'void digitalWrite(uint8_t, uint8_t)'
1:0:
126:6: note: declared here

Схема ткая. Два сервопривода. Задан темп вращения. Два светодиода. Кнопка. итог. Жмешь кнопку серва приводы круятся в заданном темпе зеленый светодиод горит. Отпускаешь кнопку свето диод горит красный сервомоторы останавливаются.

  1. имеется код

    //pins for the LEDs:
    const int redPin = 3;
    const int greenPin = 5;
    const int bluePin = 6;

    const int redPin2 = 9;
    const int greenPin2 = 10;
    const int bluePin2 = 11;

    #define REDPIN 3
    #define GREENPIN 5
    #define BLUEPIN 6

    #define FADESPEED 5

    void setup() {
    // initialize serial:
    Serial.begin(9600);

    // make the pins outputs:
    pinMode(redPin, OUTPUT);
    pinMode(greenPin, OUTPUT);
    pinMode(bluePin, OUTPUT);

    pinMode(redPin2, OUTPUT);
    pinMode(greenPin2, OUTPUT);
    pinMode(bluePin2, OUTPUT);

    Serial.print(«Arduino control RGB LEDs Connected OK ( Sent From Arduinno Board )»);
    Serial.print(‘n’);
    }

    void loop() {

    // if there’s any serial available, read it:
    while (Serial.available() > 0) {
    // look for the next valid integer in the incoming serial stream:
    int red = Serial.parseInt();
    // do it again:
    int green = Serial.parseInt();
    // do it again:
    int blue = Serial.parseInt();

    int red2 = Serial.parseInt();
    // do it again:
    int green2 = Serial.parseInt();
    // do it again:
    int blue2 = Serial.parseInt();

    // look for the newline. That’s the end of your
    // sentence:
    if (Serial.read() == ‘n’) {

             
      // constrain the values to 0 — 255 and invert
      // if you’re using a common-cathode LED, just use «constrain(color, 0, 255);»

     
      // This is for COMMON ANODE
      //red = 255 — constrain(red, 0, 255);
      //green = 255 — constrain(green, 0, 255);
      //blue = 255 — constrain(blue, 0, 255);

     
      red = constrain(red, 0, 255);
      green = constrain(green, 0, 255);
      blue = constrain(blue, 0, 255);

     
      red2 = constrain(red2, 0, 255);
      green2 = constrain(green2, 0, 255);
      blue2 = constrain(blue2, 0, 255);

      // fade the red, green, and blue legs of the LED:
      analogWrite(redPin, red);
      analogWrite(greenPin, green);
      analogWrite(bluePin, blue);

     
      analogWrite(redPin2, red2);
      analogWrite(greenPin2, green2);
      analogWrite(bluePin2, blue2);

      // print the three numbers in one string as hexadecimal:
        Serial.print(«Data Response : «);
      Serial.print(red, HEX);
      Serial.print(green, HEX);
      Serial.println(blue, HEX);
    }
    }

    }

    подключаю ардуино к смартфону по ЮСБ выбираю цвет РГБ светодиода. После отключения смартфона все сбивается. Возможно в коде можно что-то дописать чтобы значение сохранялось в памяти ардуино после отключения от смарта ?

  2. Сохраните данные в EEPROM.

  3. извините а можно более подробно ?

  4. В начало скетча
    #include <EEPROM.h>
    В setup() после задания режима пинов

    red = EEPROM.read(1);
    analogWrite(redPin, red);

    Поскольку значение 0-255 хватит и одной ячейки EEPROM для каждого цвета.
    Для других цветов аналогично, только указать в качестве номера ячейки не 1, а что-то другое.

    В loop() после строки if (Serial.read() == ‘n’) {
    т.е. когда ввод уже завершен.

    EEPROM.write(1, red);

    Для других цветов аналогично, только указать в качестве номера ячейки не 1, а что-то другое.

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

    Есть альтернатива, только, мягко говоря, несколько избыточная в данном конкретном случае — запись в конфигурационный файл на SD карту.

  5. #include <EEPROM.h>
    //pins for the LEDs:
    const int redPin = 3;
    const int greenPin = 5;
    const int bluePin = 6;

    const int redPin2 = 9;
    const int greenPin2 = 10;
    const int bluePin2 = 11;

    #define REDPIN 3
    #define GREENPIN 5
    #define BLUEPIN 6

    #define FADESPEED 5

    void setup() {
    // initialize serial:
    Serial.begin(9600);

    // make the pins outputs:
    pinMode(redPin, OUTPUT);
    pinMode(greenPin, OUTPUT);
    pinMode(bluePin, OUTPUT);

    redPin = EEPROM.read(1);
    analogWrite(redPin, red)
    greenPin = EEPROM.read(2);
    analogWrite(greenPin, green)
    bluePin = EEPROM.read(3);
    analogWrite(bluePin, blue)

    pinMode(redPin2, OUTPUT);
    pinMode(greenPin2, OUTPUT);
    pinMode(bluePin2, OUTPUT);

    Serial.print(«Arduino control RGB LEDs Connected OK ( Sent From Arduinno Board )»);
    Serial.print(‘n’);
    }

    void loop() {

    // if there’s any serial available, read it:
    while (Serial.available() > 0) {
    // look for the next valid integer in the incoming serial stream:
    int red = Serial.parseInt();
    // do it again:
    int green = Serial.parseInt();
    // do it again:
    int blue = Serial.parseInt();

    int red2 = Serial.parseInt();
    // do it again:
    int green2 = Serial.parseInt();
    // do it again:
    int blue2 = Serial.parseInt();

    // look for the newline. That’s the end of your
    // sentence:
    if (Serial.read() == ‘n’)
    EEPROM.write(1, red);
    EEPROM.write(2, green);
    EEPROM.write(3, blue);{

         
      // constrain the values to 0 — 255 and invert
      // if you’re using a common-cathode LED, just use «constrain(color, 0, 255);»
      // This is for COMMON ANODE
      //red = 255 — constrain(red, 0, 255);
      //green = 255 — constrain(green, 0, 255);
      //blue = 255 — constrain(blue, 0, 255);
      red = constrain(red, 0, 255);
      green = constrain(green, 0, 255);
      blue = constrain(blue, 0, 255);
      red2 = constrain(red2, 0, 255);
      green2 = constrain(green2, 0, 255);
      blue2 = constrain(blue2, 0, 255);

      // fade the red, green, and blue legs of the LED:
      analogWrite(redPin, red);
      analogWrite(greenPin, green);
      analogWrite(bluePin, blue);
      analogWrite(redPin2, red2);
      analogWrite(greenPin2, green2);
      analogWrite(bluePin2, blue2);

      // print the three numbers in one string as hexadecimal:
        Serial.print(«Data Response : «);
      Serial.print(red, HEX);
      Serial.print(green, HEX);
      Serial.println(blue, HEX);
    }
    }

    }

    Так Должно получится ? выдает ошибку

    Arduino: 1.6.2 (Windows 7), Плата»Arduino Uno»

    sketch_jun04a.ino: In function ‘void setup()’:

    sketch_jun04a.ino:23:8: error: assignment of read-only variable ‘redPin’

    sketch_jun04a.ino:24:21: error: ‘red’ was not declared in this scope

    sketch_jun04a.ino:26:1: error: expected ‘;’ before ‘pinMode’

    sketch_jun04a.ino:30:10: error: assignment of read-only variable ‘greenPin’

    sketch_jun04a.ino:31:23: error: ‘green’ was not declared in this scope

    sketch_jun04a.ino:32:1: error: expected ‘;’ before ‘bluePin’

    sketch_jun04a.ino:33:22: error: ‘blue’ was not declared in this scope

    sketch_jun04a.ino:36:1: error: expected ‘;’ before ‘pinMode’

  6. assignment of read-only variable ‘redPin’ — нельзя присвоить значение константной переменной.
    ‘red’ was not declared in this scope — переменная red не объявлена.
    expected ‘;’ before ‘pinMode’ — пропущена ; перед ‘pinMode’.

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

  7. redPin = EEPROM.read(1); — это неправильно.
    Во-первых redPin объявлена как const, т.е. не может меняться.
    Во-вторых, по смыслу это совсем другая переменная (номер пина, а не переменная для уровня цвета).

    Выводы:
    Первое, надо объявления переменных вынести перед loop
    int red;
    и т.д.
    Второе, результат вызова EEPROM.read(…); присваивать не номерам пинов, а этим самым переменным.
    Естественно, также придется убрать int перед переменной red внутри loop(), чтобы использовать ранее объявленное, а не объявлять в этом месте новое.

  8. Ребята вы меня ваще запутали. Если не сложно напишите как оно должно получится в итоге.

I’m very new to Arduino and experimenting with examples. I have a number of problems when using the following code:

#include <ctype.h>
#include <Arduino.h>
#include "Telegraph.h"
//#include <Telegraph.h>

char* LETTERS[]  =  {
  ".-", "-...", "-.-.", "-..", ".",      // A-E
  "..-.", "--.", "....", "..", ".---",   // F-J
  "-.-", ".-..", "--", "-.", "---",      // K-O
  ".--.", "--.-", ".-.", "...", "-",     // P-T
  "..-", "...-", ".--", "-..-", "-.--",  // U-Y
  "--.."                                 // Z
};

char* DIGITS[]  =  {
  "-----", ".----", "..---", "...--",     //0-3
  "....-", ".....", "-....", "--...",     //4-7
  "---..", "----."                        //8-9
};

Telegraph::Telegraph(const int outputPin, const int ditLength){
  _outputPin  =  outputPin;
  _ditLength  =  ditLength;
  _dahLength  =  dahLength;
  pinMode(_outputPin, OUTPUT);
}

void Telegraph::outputCode(const char* code){
  for(int i=0; i<strlen(code); i++){
    if( code[i]  ==  '.' )
      dit();
    else
      dah();
  }
}

void Telegraph::dit(){
  Serial.print(".");
  outputSymbol(_ditLength);
}

void Telegraph::dah(){
  Serial.print("-");
  outputSymbol(_dahLength);
}

void Telegraph::outputSymbol(const int length){
  digitalWrite(_outputPin, HIGH);
  delay(length);
  digitalWrite(_outputPin, LOW);
  delay(length);
}

void Telegraph::sendMessage(const char* message){
  for(int i=0;  i  <  strlen(message); i++){
    const char currentChar  =  toupper(message[i]);
    if( isalpha(currentChar) ){
      outputCode(LETTERS[currentChar  -  'A']);
      delay(_dahLength);
    }else if(isdigit(currentChar) ){
      outputCode(DIGITS[currentChar  -  '0']);
      delay(_dahLength);
    }else if(currentChar  =  ' '){
      Serial.print(" ");
      delay(_ditLength * 7);
    }
  }
  Serial.println();
}

I get the following errors:

Telegraph.cpp:6:15: error: two or more data types in declaration of ‘LETTERS’
Telegraph.cpp: In constructor ‘Telegraph::Telegraph(int, int)’:
Telegraph.cpp:24:18: error: ‘dahLength’ was not declared in this scope
Telegraph.cpp: In member function ‘void Telegraph::sendMessage(const char*)’:
Telegraph.cpp:58:18: error: ‘LETTERS’ was not declared in this scope
Telegraph.cpp:63:30: error: assignment of read-only variable ‘currentChar’

Sorry if this question is too general but as I mentioned, I’m very new and don’t entirely understand the code.

As is my wont, I’m going to provide a bit of background technical information into the whys and wherefores of this this error.

I’m going to inspect four different ways of initializing C strings and see what the differences between them are. These are the four ways in question:

char *text = "This is some text";
char text[] = "This is some text";
const char *text = "This is some text";
const char text[] = "This is some text";

Now for this I am going to want to change the third letter «i» into an «o» to make it «Thos is some text». That could, in all cases (you would think), be achieved by:

text[2] = 'o';

Now let’s look at what each way of declaring the string does and how that text[2] = 'o'; statement would affect things.

First the most commonly seen way: char *text = "This is some text";. What does this literally mean? Well, in C, it literally means «Create a variable called text which is a read-write pointer to this string literal which is held in read-only (code) space.». If you have the option -Wwrite-strings turned on then you get a warning as seen in the question above.

Basically that means «Warning: You have tried to make a variable that is read-write point to an area you can’t write to». If you try and then set the third character to «o» you would in fact be trying to write to a read-only area and things won’t be nice. On a traditional PC with Linux that results in:

Segmentation Fault

Now the second one: char text[] = "This is some text";. Literally, in C, that means «Create an array of type «char» and initialize it with the data «This is some text». The size of the array will be big enough to store the data». So that actually allocates RAM and copies the value «This is some text» into it at runtime. No warnings, no errors, perfectly valid. And the right way to do it if you want to be able to edit the data. Let’s try running the command text[2] = 'o':

Thos is some text

It worked, perfectly. Good.

Now the third way: const char *text = "This is some text";. Again the literal meaning: «Create a variable called «text» that is a read only pointer to this data in read only memory.». Note that both the pointer and the data are now read-only. No errors, no warnings. What happens if we try and run our test command? Well, we can’t. The compiler is now intelligent and knows that we are trying to do something bad:

error: assignment of read-only location ‘*(text + 2u)’

It won’t even compile. Trying to write to read-only memory is now protected because we have told the compiler that our pointer is to read-only memory. Of course, it doesn’t have to be pointing to read-only memory, but if you point it to read-write memory (RAM) that memory will still be protected from being written to by the compiler.

Finally the last form: const char text[] = "This is some text";. Again, like before with [] it allocates an array in RAM and copies the data into it. However, now this is a read-only array. You can’t write to it because the pointer to it is tagged as const. Attempting to write to it results in:

error: assignment of read-only location ‘*(text + 2u)’

So, a quick summary of where we are:

This form is completely invalid and should be avoided at all costs. It opens the door to all sorts of bad things happening:

char *text = "This is some text";

This form is the right form if you are wanting to make the data editable:

char text[] = "This is some text";

This form is the right form if you want strings that won’t be edited:

const char *text = "This is some text";

This form seems wasteful of RAM but it does have its uses. Best forget it for now though.

const char text[] = "This is some text";

sssemil

4 / 4 / 0

Регистрация: 29.01.2013

Сообщений: 91

1

Ошибки при компиляции

29.08.2013, 17:06. Показов 2740. Ответов 7

Метки нет (Все метки)


Привет. Помогите с ошибками разобратся:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdlib.h>
#include <iostream>
#include <stdio.h>
#include <string.h>
 
using namespace std;
 
int main(int argc, char *argv[])
{
   const char log_path[249] = "";
   if(argc != 2)
   {
      log_path = "/var/log/auth.log";
   }
   else
   {
      log_path = argv[1];
   }
   system("export DISPLAY=:0 && tail -fn0 /var/log/auth.log | while read line ; do echo "$line" | grep "Accepted" ; if [ $? = 0 ] ; then notify-send "Security Warning" "$(echo "$line" | grep "Accepted")" -u critical -i /usr/local/alert/icon.png ; fi ; done &>" + log_path);
}

g++ tes.cpp -o tes
tes.cpp: In function ‘int main(int, char**)’:
tes.cpp:13:16: error: assignment of read-only variable ‘log_path’
log_path = «/var/log/auth.log»;
^
tes.cpp:13:16: error: incompatible types in assignment of ‘const char [18]’ to ‘const char [249]’
tes.cpp:17:16: error: assignment of read-only variable ‘log_path’
log_path = argv[1];
^
tes.cpp:17:16: error: incompatible types in assignment of ‘char*’ to ‘const char [249]’
tes.cpp:19:276: error: invalid operands of types ‘const char [249]’ and ‘const char [249]’ to binary ‘operator+’
system(«export DISPLAY=:0 && tail -fn0 /var/log/auth.log | while read line ; do echo «$line» | grep «Accepted» ; if [ $? = 0 ] ; then notify-send «Security Warning» «$(echo «$line» | grep «Accepted»)» -u critical -i /usr/local/alert/icon.png ; fi ; done &>» + log_path);
^

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

29.08.2013, 17:06

7

alsav22

5493 / 4888 / 831

Регистрация: 04.06.2011

Сообщений: 13,587

29.08.2013, 17:21

2

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main(int argc, char *argv[])
{
   char log_path[249] = "";
   if(argc != 2)
   {
      strcpy(log_path, "/var/log/auth.log");
   }
   else
   {
      strcpy(log_path, argv[1]);
   }
   
   char str[500] = "export DISPLAY=:0 && tail -fn0 /var/log/auth.log | while read line ; do echo "$line" | grep "Accepted" ; if [ $? = 0 ] ; then notify-send "Security Warning" "$(echo "$line" | grep "Accepted")" -u critical -i /usr/local/alert/icon.png ; fi ; done &>";
   strcat(str, log_path);
   
   system(str);
}



1



4 / 4 / 0

Регистрация: 29.01.2013

Сообщений: 91

29.08.2013, 17:27

 [ТС]

3

alsav22, Премного благодарен)



0



alsav22

5493 / 4888 / 831

Регистрация: 04.06.2011

Сообщений: 13,587

29.08.2013, 17:29

4

Или так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main(int argc, char *argv[])
{
   const char *log_path;
   if(argc != 2)
   {
      log_path = "/var/log/auth.log";
   }
   else
   {
      log_path = argv[1];
   }
   
   char str[500] = "export DISPLAY=:0 && tail -fn0 /var/log/auth.log | while read line ; do echo "$line" | grep "Accepted" ; if [ $? = 0 ] ; then notify-send "Security Warning" "$(echo "$line" | grep "Accepted")" -u critical -i /usr/local/alert/icon.png ; fi ; done &>";
   strcat(str, log_path);
   
   system(str);
}



1



25 / 25 / 0

Регистрация: 10.03.2010

Сообщений: 206

29.08.2013, 17:36

5

Цитата
Сообщение от sssemil
Посмотреть сообщение

const char log_path[249]

элементы массива изменять нельзя



1



sssemil

4 / 4 / 0

Регистрация: 29.01.2013

Сообщений: 91

29.08.2013, 18:15

 [ТС]

6

Теперь немного другая проблема…почкму то лог в нужный фаил не идет, а на консоль выводится(хотя если написать эту команду в терминале то все норм робит)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdlib.h>
#include <iostream>
#include <stdio.h>
#include <string.h>
 
using namespace std;
 
int main(int argc, char *argv[])
{
   char log_path[249] = "";
   if(argc != 2)
   {
      strcpy(log_path, "/var/log/ssh_alert.log");
   }
   else
   {
      strcpy(log_path, argv[1]);
   }
   
   char str[500] = "(export DISPLAY=:0 && tail -fn0 /var/log/auth.log | while read line ; do echo "$line" | grep "Accepted" ; if [ $? = 0 ] ; then notify-send "Security Warning" "$(echo "$line" | grep "Accepted")" -u critical -i /usr/local/alert/icon.png ; fi ; done) &> ";
   strcat(str, log_path);
   cout<<str<<endl;
   system(str);
}



0



347 / 292 / 37

Регистрация: 23.03.2012

Сообщений: 838

29.08.2013, 18:22

7

Цитата
Сообщение от sssemil
Посмотреть сообщение

Теперь немного другая проблема…почкму то лог в нужный фаил не идет, а на консоль выводится(хотя если написать эту команду в терминале то все норм робит)

А где файл вообще? Я не вижу открытия.



0



4 / 4 / 0

Регистрация: 29.01.2013

Сообщений: 91

29.08.2013, 18:23

 [ТС]

8

Цитата
Сообщение от Nekto
Посмотреть сообщение

А где файл вообще? Я не вижу открытия.

там запуск shell команды которая делает &> /log)



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

29.08.2013, 18:23

Помогаю со студенческими работами здесь

Ошибки при компиляции
Если кто желает помочь и разомнуть свои навыки то прошу скомпилировать c++, я сам не смог, много…

Ошибки при компиляции
Вот такие ошибки у меня выдает при компиляции:
error: stray ‘320’ in program

error: stray…

Ошибки при компиляции
Добрый день, задача : Занести в массив значения функции
f (x, y) = x − y , 0 ≤ x…

Ошибки при компиляции
#include &lt;vcl.h&gt;
#pragma hdrstop
#include &quot;CDPlayer_.h&quot;

#pragma package(smart_init)
#pragma…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

8

Понравилась статья? Поделить с друзьями:
  • Ballu bhdn 80 ошибка e1
  • Application initialization error code 45
  • B2575 04 ошибка опель
  • Application context not configured for this file как исправить
  • B2424 ошибка lexus