Welcome!

By registering with us, you'll be able to discuss, share and private message with other members of our community.

SignUp Now!
  • Guest, before posting your code please take these rules into consideration:
    • It is required to use our BBCode feature to display your code. While within the editor click < / > or >_ and place your code within the BB Code prompt. This helps others with finding a solution by making it easier to read and easier to copy.
    • You can also use markdown to share your code. When using markdown your code will be automatically converted to BBCode. For help with markdown check out the markdown guide.
    • Don't share a wall of code. All we want is the problem area, the code related to your issue.


    To learn more about how to use our BBCode feature, please click here.

    Thank you, Code Forum.

C++ how to get an Arduino program to identify different letters for If..else statements?

abuet

Coder
Hi I am very new to Arduino and I am having trouble with some if statements I made. I keep getting the error "request for member 'read' in 'file', which is of non-class type 'int'", for each of my if statements. The goal was to make the if statements run when a character in the added text file, was either A, G, T, C, or U. I made five individual "if" statements to make different parameters for each letter, and it was meant to run on the text letter sequences that was on the inserted text file; called "oligo.txt". Here is the complete code:
Code:
#include <Arduino.h>
#include <stdint.h>
#include <SD.h>
#include <SPI.h>

int dataPin = 2; // DIOA
int blPin = 3; // BL
int polPin = 4; // POL
int dirPin = 6; // DIR
int clockPin = 5; // CLK
int latchPin = 7; // LE
int solenoidPin1 = 1; //connected to Digital 1
int solenoidPin2 = 2; //connected to Digital 2
int solenoidPin3 = 3;
int solenoidPin4 = 4;
int solenoidPin5 = 5;
int solenoidPin6 = 6;
int solenoidPin7 = 7;
int solenoidPin8 = 8;
int robotmotor = 9;

uint64_t one = 1;
uint64_t data;
int d = 2000;

void writeData(uint64_t data) {
  char* arr = (char*) &data;
  digitalWrite(latchPin, LOW);
  for (int i=0; i < 8; ++i) {
    char c = arr[i];
    shiftOut(dataPin, clockPin, LSBFIRST, c);
  }
  digitalWrite(latchPin, HIGH);
}

File dataFile;
void open_me(){
dataFile = SD.open("oligo.txt");
if (dataFile) {
  while (dataFile.available()) {
      Serial.write(dataFile.read());

}
dataFile.close();
    open_me();
}
}
int file = "oligo.txt";

char myChar1 = 'A';
char myChar2 = 'G';
char myChar3 = 'C';
char myChar4 = 'T';
char myChar5 = 'U';


void setup() {
  pinMode(13, OUTPUT);
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT); 
  pinMode(clockPin, OUTPUT);
  pinMode(blPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
  pinMode(polPin, OUTPUT);
  pinMode(solenoidPin1, OUTPUT); //Sets the pin as an output
pinMode(2, OUTPUT); //Sets the pin as an output
pinMode(3, OUTPUT); //Sets the pin as an output
pinMode(4, OUTPUT); //Sets the pin as an output
pinMode(5, OUTPUT); //Sets the pin as an output
pinMode(6, OUTPUT); //Sets the pin as an output
pinMode(7, OUTPUT); //Sets the pin as an output
pinMode(8, OUTPUT); //Sets the pin as an output
  Serial.begin(9600);
  digitalWrite(blPin, LOW);
  digitalWrite(polPin, LOW); // INVERTING ALL OUTPUT
  digitalWrite(clockPin, LOW);
  digitalWrite(dataPin, LOW);
  digitalWrite(latchPin, HIGH);
  digitalWrite(dirPin, LOW);
  delay(1000);
  digitalWrite(blPin, HIGH);

 if (file.read = myChar2);{
    digitalWrite(1, HIGH); //Switch Solenoid ON
  delay(1000); //Wait 1 Second
digitalWrite(1, LOW); //Switch Solenoid ON
delay(1000); //Wait 1 Second
digitalWrite(6, HIGH);
delay(1000);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
delay(1000);
digitalWrite(7, LOW);

  }
  else digitalWrite(1, LOW);

 if (file.read = myChar2);{

    digitalWrite(2, HIGH); //Switch Solenoid ON
  delay(1000); //Wait 1 Second
digitalWrite(2, LOW); //Switch Solenoid ON
delay(1000); //Wait 1 Second
digitalWrite(6, HIGH);
delay(1000);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
delay(1000);
digitalWrite(7, LOW);

  }
  else digitalWrite(2, LOW);

 


 if (file.read = myChar3);{
        digitalWrite(3, HIGH); //Switch Solenoid ON
  delay(1000); //Wait 1 Second
digitalWrite(3, LOW); //Switch Solenoid ON
delay(1000); //Wait 1 Second
digitalWrite(6, HIGH);
delay(1000);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
delay(1000);
digitalWrite(7, LOW);

  }
  else digitalWrite(3, LOW);




 if (file.read = myChar4);{
  digitalWrite(4, HIGH); //Switch Solenoid ON
  delay(1000); //Wait 1 Second
digitalWrite(4, LOW); //Switch Solenoid ON
delay(1000); //Wait 1 Second
digitalWrite(6, HIGH);
delay(1000);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
delay(1000);
digitalWrite(7, LOW);

  }
  else digitalWrite(4, LOW);



   if (file.read = myChar5);{
    digitalWrite(5, HIGH); //Switch Solenoid ON
  delay(1000); //Wait 1 Second
digitalWrite(5, LOW); //Switch Solenoid ON
delay(1000); //Wait 1 Second
digitalWrite(6, HIGH);
delay(1000);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
delay(1000);
digitalWrite(7, LOW);

  }
  else digitalWrite(5, LOW);


}

if (File.available())
  digitalWrite(9, LOW);





  }
  else digitalWrite(9, HIGH); //Switch Solenoid ON
  delay(1000); //Wait 1 Second
digitalWrite(9, LOW); //Switch Solenoid ON
delay(1000); //Wait 1 Second
digitalWrite(8, HIGH);
delay(1000);
digitalWrite(8, LOW);


int delayTime = 250;
void loop() {
  writeData(one<<43);
  delay(delayTime);
  writeData(one<<42);
  delay(delayTime);
  writeData(one<<41);
  delay(delayTime);
  writeData(one<<40);
  delay(delayTime);
  writeData(one<<41);
  delay(delayTime);
  writeData(one<<42);
  delay(delayTime);
}

This is the problem statement:
Code:
   if (file.read = myChar5);{
If you have any suggestions to fix this error, it would be very much appreciated!
 
Certainly a problem statement !
1) file.read should probably be file.read()
2) The condition is not a condition but an assignment. Use == instead of =
3) The semicolon should not be there
 
I have tried using this statment:
Code:
if (Serial.readBytes((char*)'U',1)){
and with some other changes, the code compiles. However, the solenoid valves dont activate when tested, although the rest of the code works perfectly.
Here it is:
Code:
#include <Arduino.h>
#include <stdint.h>
#include <SD.h>
#include <SPI.h>

int dataPin = 10; // DIOA
int blPin = 11; // BL
int polPin = 12; // POL
int dirPin = 13; // DIR
int clockPin = 14; // CLK
int latchPin = 15; // LE
int solenoidPin1 = 1;
int solenoidPin2 = 2;
int solenoidPin3 = 3;
int solenoidPin4 = 4;
int solenoidPin5 = 5;

uint64_t one = 1;
uint64_t data;
int d = 2000;
int solenoidPin6 = 6;
int solenoidPin7 = 7;
int solenoidPin8 = 8;
int robotmotor = 9;

void writeData(uint64_t data) {
  char* arr = (char*) &data;
  digitalWrite(latchPin, LOW);
  for (int i=0; i < 8; ++i) {
    char c = arr[i];
    shiftOut(dataPin, clockPin, LSBFIRST, c);
  }
  digitalWrite(latchPin, HIGH);
}






//char solenoidPin1 = A; //connected to Digital 1
//char solenoidPin2 = G; //connected to Digital 2
//char solenoidPin3 = C;
//char solenoidPin4 = T;
//char solenoidPin5 = U;





byte serialData[1];
int nBytes = 0;





/* MIT Open-Source LICENSE:
*
* Copyright 2018 Charles Grassin
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject
* to the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/

// PINS
#define PIN_FEEDBACK (A0)
#define PIN_LE (A1)
#define PIN_CLK (A2)
#define PIN_BL (A3)
#define PIN_DI (A4)
#define PIN_SWA (12)
#define PIN_SWB (11)

// SETTINGS
#define ELECTRODE_ARRAY_WIDTH 8
#define ELECTRODE_ARRAY_HEIGHT 8
const byte HV507_LOOKUP_TABLE [] = {4,5,6,7,12,13,15,14,20,22,23,21,28,31,30,29,36,39,38,37,47,46,45,44,55,62,61,53,54,63,60,52,51,59,56,49,58,50,57,48,43,42,41,40,34,33,32,35,26,25,24,27,18,16,17,19,9,8,10,11,0,1,2,3};
#define BAUD_RATE 115200
#define SERIAL_BUFFER_LENGTH 10
#define TEST_PROG

// VARS
bool electrodes[ELECTRODE_ARRAY_WIDTH][ELECTRODE_ARRAY_HEIGHT];
char serialBuffer[SERIAL_BUFFER_LENGTH];
uint8_t currentIndex=0;

// Electrode array code
void clearElectrodes() {
  for (int x = 0; x <ELECTRODE_ARRAY_WIDTH ; x++)
    for (int y = 0; y <ELECTRODE_ARRAY_HEIGHT ; y++)
      setElectrode(x,y,false);
}

void setElectrodes() {
  for (int x = 0; x <ELECTRODE_ARRAY_WIDTH ; x++)
    for (int y = 0; y <ELECTRODE_ARRAY_HEIGHT ; y++)
    setElectrode(x,y,true);
}

void setElectrode(int x,int y,bool state) {
  if(state != electrodes[x][y]) {
    electrodes[x][y]=state;
    sendElectrode(x,y);
  }
}

void sendElectrode(int x,int y){
  Serial.print(x);
  Serial.print(",");
  Serial.print(y);
  Serial.print(",");
  Serial.print(electrodes[x][y]);
  Serial.print("\n");
}

// Refer to HV507 datasheet
void writeHV507() {
  digitalWrite(PIN_LE, LOW);
  digitalWrite(PIN_CLK, LOW);
  
  for (int i = 0; i <64 ; i++) {
    digitalWrite(PIN_DI,electrodes[HV507_LOOKUP_TABLE[i]%8][HV507_LOOKUP_TABLE[i]/8]);
    digitalWrite(PIN_CLK, HIGH);
    digitalWrite(PIN_CLK, LOW);
  }

  digitalWrite(PIN_LE, HIGH);
  digitalWrite(PIN_LE, LOW);
}
File myFile;
String txtMsg = "";
int relay = 2;

void setup() {
  Serial.begin(BAUD_RATE);
 
  pinMode(PIN_LE, OUTPUT);
  digitalWrite(PIN_LE,LOW);
  pinMode(PIN_CLK, OUTPUT);
  digitalWrite(PIN_CLK,LOW);
  pinMode(PIN_BL, OUTPUT);
  digitalWrite(PIN_BL,HIGH);
  pinMode(PIN_DI, OUTPUT);
  digitalWrite(PIN_DI,LOW);
 
  pinMode(PIN_SWA, INPUT_PULLUP);
  pinMode(PIN_SWB, INPUT_PULLUP);

  clearElectrodes();
  writeHV507();
  digitalWrite(PIN_BL,HIGH);

  for (int x = 0; x <ELECTRODE_ARRAY_WIDTH ; x++)
    for (int y = 0; y <ELECTRODE_ARRAY_HEIGHT ; y++)
      sendElectrode(x,y);

  pinMode(13, OUTPUT);
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT); 
  pinMode(clockPin, OUTPUT);
  pinMode(blPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
  pinMode(polPin, OUTPUT);
  pinMode(solenoidPin1, OUTPUT);
  pinMode(solenoidPin2, OUTPUT);
  pinMode(solenoidPin3, OUTPUT);
  pinMode(solenoidPin4, OUTPUT);
  pinMode(solenoidPin5, OUTPUT);
  pinMode(solenoidPin6, OUTPUT);
  pinMode(solenoidPin7, OUTPUT);
  pinMode(solenoidPin8, OUTPUT);

  pinMode(1, OUTPUT); //Sets the pin as an output
pinMode(2, OUTPUT); //Sets the pin as an output
pinMode(3, OUTPUT); //Sets the pin as an output
pinMode(4, OUTPUT); //Sets the pin as an output
pinMode(5, OUTPUT); //Sets the pin as an output
pinMode(6, OUTPUT); //Sets the pin as an output
pinMode(7, OUTPUT); //Sets the pin as an output
pinMode(8, OUTPUT); //Sets the pin as an output
  Serial.begin(9600);
  digitalWrite(blPin, LOW);
  digitalWrite(polPin, LOW); // INVERTING ALL OUTPUT
  digitalWrite(clockPin, LOW);
  digitalWrite(dataPin, LOW);
  digitalWrite(latchPin, HIGH);
  digitalWrite(dirPin, LOW);
  delay(1000);
  digitalWrite(blPin, HIGH);


Serial.begin(9600);
  pinMode(relay, OUTPUT);
  pinMode(16, OUTPUT);
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
myFile = SD.open("oligo.TXT");
while (myFile.available()) {
      Serial.write(myFile.read());
    }
 

}

 
 



#ifdef TEST_PROG
  int step = 0;
  long unsigned int lastT = millis();
#endif

int delayTime = 250;
void loop() {
  if(serialReadCommand()){
    writeHV507();
  }

  // Test program
  #ifdef TEST_PROG
    if(millis()-lastT>500){
      lastT = millis();
      switch(step){
    
        case 0: setElectrode(4,3,false);
        setElectrode(4,4,true);
        break;
        case 1:setElectrode(4,4,false);
        setElectrode(4,5,true);
        break;
        case 2:setElectrode(4,5,false);
        setElectrode(5,5,true);
        break;
        case 3:setElectrode(5,5,false);
        setElectrode(5,4,true);
        break;
        case 4:setElectrode(5,4,false);
        setElectrode(5,3,true);
        break;
        case 5:setElectrode(5,3,false);
        setElectrode(4,3,true);
        break;
        case 6:setElectrode(3,4,true);
        setElectrode(4,3,true);      }
      writeHV507();
      step ++;
      if(step > 5) step = 0;
    }
 
 
 
 
  #endif

{
  if (Serial.readBytes((char*)'U',1)){
digitalWrite(solenoidPin5, HIGH); //Switch Solenoid ON
  delay(1000); //Wait 1 Second
digitalWrite(solenoidPin5, LOW); //Switch Solenoid ON
delay(1000); //Wait 1 Second
digitalWrite(solenoidPin6, HIGH);
delay(1000);
digitalWrite(solenoidPin6, LOW);
digitalWrite(solenoidPin7, HIGH);
delay(1000);
digitalWrite(solenoidPin7, LOW);
}
 
  if (Serial.readBytes((char*)'T',1)){
    digitalWrite(solenoidPin4, HIGH); //Switch Solenoid ON
  delay(1000); //Wait 1 Second
digitalWrite(solenoidPin4, LOW); //Switch Solenoid ON
delay(1000); //Wait 1 Second
digitalWrite(solenoidPin6, HIGH);
delay(1000);
digitalWrite(solenoidPin6, LOW);
digitalWrite(solenoidPin7, HIGH);
delay(1000);
digitalWrite(solenoidPin7, LOW);
  }
  if (Serial.readBytes((char*)'C',1)){
    digitalWrite(solenoidPin3, HIGH); //Switch Solenoid ON
  delay(1000); //Wait 1 Second
digitalWrite(solenoidPin3, LOW); //Switch Solenoid ON
delay(1000); //Wait 1 Second
digitalWrite(solenoidPin6, HIGH);
delay(1000);
digitalWrite(solenoidPin6, LOW);
digitalWrite(solenoidPin7, HIGH);
delay(1000);
digitalWrite(solenoidPin7, LOW);
  }
  if (Serial.readBytes((char*)'G',1))
{
    digitalWrite(solenoidPin2, HIGH); //Switch Solenoid ON
  delay(1000); //Wait 1 Second
digitalWrite(solenoidPin2, LOW); //Switch Solenoid ON
delay(1000); //Wait 1 Second
digitalWrite(solenoidPin6, HIGH);
delay(1000);
digitalWrite(solenoidPin6, LOW);
digitalWrite(solenoidPin7, HIGH);
delay(1000);
digitalWrite(solenoidPin7, LOW);
}
   if (Serial.readBytes((char*)'A',1)){
    digitalWrite(solenoidPin1, HIGH); //Switch Solenoid ON
  delay(1000); //Wait 1 Second
digitalWrite(solenoidPin1, LOW); //Switch Solenoid ON
delay(1000); //Wait 1 Second
digitalWrite(solenoidPin6, HIGH);
delay(1000);
digitalWrite(solenoidPin6, LOW);
digitalWrite(solenoidPin7, HIGH);
delay(1000);
digitalWrite(solenoidPin7, LOW);
   }
  writeData(one<<43);
  delay(delayTime);
  writeData(one<<42);
  delay(delayTime);
  writeData(one<<41);
  delay(delayTime);
  writeData(one<<40);
  delay(delayTime);
  writeData(one<<41);
  delay(delayTime);
  writeData(one<<42);
  delay(delayTime);

 





}
}


uint8_t serialReadCommand(){
  uint8_t number_of_commands = 0;
  while (Serial.available() > 0) {
    char recieved = Serial.read();

    serialBuffer[currentIndex] = recieved;
    currentIndex ++;
    if (currentIndex >= SERIAL_BUFFER_LENGTH) {
      // Invalid command: command is too long
      currentIndex = 0;
    }

    if (recieved == '\n' || recieved == '\r') {
      // Close string
      serialBuffer[currentIndex-1] = '\0';
      
      // Clear buffer for next serial transaction
      currentIndex = 0;

      // Split the string
      char* commaIndex = strchr(serialBuffer, ',');
      if (commaIndex==NULL) {
        // Invalid command: command is malformed
        continue;
      }
      commaIndex[0] = '\0';
      char* secondCommaIndex = strchr(commaIndex+1, ',');
      if (secondCommaIndex==NULL) {
        // Invalid command: command is malformed
        continue;
      }
      secondCommaIndex[0] = '\0';

      int x = atoi(serialBuffer);
      int y = atoi(commaIndex+1);
      if(x<0 || x>=ELECTRODE_ARRAY_WIDTH || y<0 || y>=ELECTRODE_ARRAY_HEIGHT){
        // Invalid command: out of bound
        continue;
      }
      
      setElectrode(x,y,strcmp(secondCommaIndex+1,"0")!=0);
      number_of_commands += 1;
    }
  }
  return number_of_commands;
}

/*void btnMatrixTest(){
  for (int y = 0; y <ELECTRODE_ARRAY_WIDTH ; y++)
    for (int x = 0; x <ELECTRODE_ARRAY_HEIGHT ; x++){
      clearElectrodes();
      electrodes[x][y]=true;
      writeHV507();
      Serial.print(x);
      Serial.print("\t");
      Serial.println(y);
      delay(500);
      while(digitalRead(PIN_SWA)){}
    }
}*/
Since the program is made to run on reading letters from an SD card, do you think its an issue with the if statements or the SD card insert/array code?
 
As cbreemer pointed out, have you tried to fix the problematic statement?

// this is wrong if (file.read = myChar5);{ // like this if(file.read()) == myChar5) { //do stuff }
 
As cbreemer pointed out, have you tried to fix the problematic statement?

// this is wrong if (file.read = myChar5);{ // like this if(file.read()) == myChar5) { //do stuff }
I have been trying this but it always gives the errors:
Code:
In function 'void loop()':
 error: 'file' was not declared in this scope
    if (file.read()) == myChar1));{
        ^~~~
 note: suggested alternative: 'fileno'
    if (file.read()) == myChar1));{
        ^~~~
        fileno
 error: expected primary-expression before '==' token
    if (file.read()) == myChar1));{
                     ^~
 error: 'myChar1' was not declared in this scope
    if (file.read()) == myChar1));{
                        ^~~~~~~
exit status 1
'file' was not declared in this scope
The reason I changed it to
Code:
   if (Serial.readBytes((char*)'A',1)){
was because I thought the Serial.readBytes function would allow for the reading of the defined text file bytes. it compiles without errors but the solenoid valves wont activate, despite the rest of the code working perfectly.
 
I'm really struggling with this, I just cant figure out whats wrong. My code using
Code:
   if (Serial.readBytes((char*)'A',1)){
was the only one that had been moderately successful, in working the rest of the code other than the solenoids. The goal is to make the solenoid valve code only execute on reading different letters from a text file taken from an SD card, and I cant tell if its the SD card code or the if statements for the valves that are going wrong. I have tried your idea of using the
Code:
if(file.read()) == myChar5) {
but that just led to more declaration issues. Any ideas?
 
Have you tried to se the output of what you are comparing of?

Im not familiar with C++, thought the logic works same in each language.

cout << for what you are comparing and then cout << for what you are comparing. This may open up solution.
 
I have no idea whether you should used file.read() or Serial.readBytes(). But in your code, before the change to serial, I notice that you were using both fileand File, and the compiler would complain that file was not declared.

C++:
   if (file.read = myChar5);{
'''
  else digitalWrite(5, LOW);
}

if (File.available())
  digitalWrite(9, LOW);

Note that C is case sensitive. Should you not be using File.read() ?
 
I keep getting errors like this:
Code:
test4:83:11: error: request for member 'read' in 'file', which is of non-class type 'int'
  if (file.read() = myChar2);{
           ^~~~
test4:96:7: error: expected primary-expression before 'else'
   if (else digitalWrite(1, LOW));
       ^~~~
test4:96:7: error: expected ')' before 'else'
And I understand that C is a case sensitive language, so I changed the
Code:
file.read()
to
Code:
File.read()
however it causes errors like "expected primary expression before "."".
 
I tried coding it like this:
Code:
   if (file.read((char*)'A',1)){
And ended up reducing errors to only this:
Code:
In function 'void loop()':
test5:326:8: error: 'file' was not declared in this scope
    if (file.read((char*)'A',1)){
   
    In function 'void loop()':
test5:326:8: error: 'file' was not declared in this scope
    if (file.read((char*)'A',1)){
   
    exit status 1
'file' was not declared in this scope
Any Ideas on how to declare the file? I thought I had done that on my SD file insert code like this:
Code:
Serial.begin(9600);
  pinMode(relay, OUTPUT);
  pinMode(16, OUTPUT);
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
myFile = SD.open("oligo.TXT");
while (myFile.available()) {
      Serial.write(myFile.read());
    }
 
Have you tried to se the output of what you are comparing of?
When I am testing the code, I monitor the output int he serial monitor of Arduino IDE, if that is what you mean. So far, I have gotten all electrode values I am looking for (x,y), in a loop. The part that baffles me is the fact that the solenoid valves don't activate despite being error less in my new code, as a part of the same loop() function.
 
I have no idea whether you should used file.read() or Serial.readBytes(). But in your code, before the change to serial, I notice that you were using both fileand File, and the compiler would complain that file was not declared.
I tried that, and It helped me understand some of my problems. I tried making new code here to for file.read(), since the main reason I abandoned that was because the command wouldn't compile nor function if it did. Still however, this code below functions the same as before :/
Code:
#include <Arduino.h>
#include <stdint.h>
#include <SD.h>
#include <SPI.h>

int dataPin = 10; // DIOA
int blPin = 11; // BL
int polPin = 12; // POL
int dirPin = 13; // DIR
int clockPin = 14; // CLK
int latchPin = 15; // LE
int solenoidPin1 = 1;
int solenoidPin2 = 2;
int solenoidPin3 = 3;
int solenoidPin4 = 4;
int solenoidPin5 = 5;

uint64_t one = 1;
uint64_t data;
int d = 2000;
int solenoidPin6 = 6;
int solenoidPin7 = 7;
int solenoidPin8 = 8;
int robotmotor = 9;

void writeData(uint64_t data) {
  char* arr = (char*) &data;
  digitalWrite(latchPin, LOW);
  for (int i=0; i < 8; ++i) {
    char c = arr[i];
    shiftOut(dataPin, clockPin, LSBFIRST, c);
  }
  digitalWrite(latchPin, HIGH);
}






//char solenoidPin1 = A; //connected to Digital 1
//char solenoidPin2 = G; //connected to Digital 2
//char solenoidPin3 = C;
//char solenoidPin4 = T;
//char solenoidPin5 = U;





byte serialData[1];
int nBytes = 0;







// PINS
#define PIN_FEEDBACK (A0)
#define PIN_LE (A1)
#define PIN_CLK (A2)
#define PIN_BL (A3)
#define PIN_DI (A4)
#define PIN_SWA (12)
#define PIN_SWB (11)

// SETTINGS
#define ELECTRODE_ARRAY_WIDTH 8
#define ELECTRODE_ARRAY_HEIGHT 8
const byte HV507_LOOKUP_TABLE [] = {4,5,6,7,12,13,15,14,20,22,23,21,28,31,30,29,36,39,38,37,47,46,45,44,55,62,61,53,54,63,60,52,51,59,56,49,58,50,57,48,43,42,41,40,34,33,32,35,26,25,24,27,18,16,17,19,9,8,10,11,0,1,2,3};
#define BAUD_RATE 115200
#define SERIAL_BUFFER_LENGTH 10
#define TEST_PROG

// VARS
bool electrodes[ELECTRODE_ARRAY_WIDTH][ELECTRODE_ARRAY_HEIGHT];
char serialBuffer[SERIAL_BUFFER_LENGTH];
uint8_t currentIndex=0;

// Electrode array code
void clearElectrodes() {
  for (int x = 0; x <ELECTRODE_ARRAY_WIDTH ; x++)
    for (int y = 0; y <ELECTRODE_ARRAY_HEIGHT ; y++)
      setElectrode(x,y,false);
}

void setElectrodes() {
  for (int x = 0; x <ELECTRODE_ARRAY_WIDTH ; x++)
    for (int y = 0; y <ELECTRODE_ARRAY_HEIGHT ; y++)
    setElectrode(x,y,true);
}

void setElectrode(int x,int y,bool state) {
  if(state != electrodes[x][y]) {
    electrodes[x][y]=state;
    sendElectrode(x,y);
  }
}

void sendElectrode(int x,int y){
  Serial.print(x);
  Serial.print(",");
  Serial.print(y);
  Serial.print(",");
  Serial.print(electrodes[x][y]);
  Serial.print("\n");
}

// Refer to HV507 datasheet
void writeHV507() {
  digitalWrite(PIN_LE, LOW);
  digitalWrite(PIN_CLK, LOW);
  
  for (int i = 0; i <64 ; i++) {
    digitalWrite(PIN_DI,electrodes[HV507_LOOKUP_TABLE[i]%8][HV507_LOOKUP_TABLE[i]/8]);
    digitalWrite(PIN_CLK, HIGH);
    digitalWrite(PIN_CLK, LOW);
  }

  digitalWrite(PIN_LE, HIGH);
  digitalWrite(PIN_LE, LOW);
}
File file;
String txtMsg = "";
int relay = 2;

void setup() {
  Serial.begin(BAUD_RATE);
 
  pinMode(PIN_LE, OUTPUT);
  digitalWrite(PIN_LE,LOW);
  pinMode(PIN_CLK, OUTPUT);
  digitalWrite(PIN_CLK,LOW);
  pinMode(PIN_BL, OUTPUT);
  digitalWrite(PIN_BL,HIGH);
  pinMode(PIN_DI, OUTPUT);
  digitalWrite(PIN_DI,LOW);
 
  pinMode(PIN_SWA, INPUT_PULLUP);
  pinMode(PIN_SWB, INPUT_PULLUP);

  clearElectrodes();
  writeHV507();
  digitalWrite(PIN_BL,HIGH);

  for (int x = 0; x <ELECTRODE_ARRAY_WIDTH ; x++)
    for (int y = 0; y <ELECTRODE_ARRAY_HEIGHT ; y++)
      sendElectrode(x,y);

  pinMode(13, OUTPUT);
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT); 
  pinMode(clockPin, OUTPUT);
  pinMode(blPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
  pinMode(polPin, OUTPUT);
  pinMode(solenoidPin1, OUTPUT);
  pinMode(solenoidPin2, OUTPUT);
  pinMode(solenoidPin3, OUTPUT);
  pinMode(solenoidPin4, OUTPUT);
  pinMode(solenoidPin5, OUTPUT);
  pinMode(solenoidPin6, OUTPUT);
  pinMode(solenoidPin7, OUTPUT);
  pinMode(solenoidPin8, OUTPUT);

  pinMode(1, OUTPUT); //Sets the pin as an output
pinMode(2, OUTPUT); //Sets the pin as an output
pinMode(3, OUTPUT); //Sets the pin as an output
pinMode(4, OUTPUT); //Sets the pin as an output
pinMode(5, OUTPUT); //Sets the pin as an output
pinMode(6, OUTPUT); //Sets the pin as an output
pinMode(7, OUTPUT); //Sets the pin as an output
pinMode(8, OUTPUT); //Sets the pin as an output
  Serial.begin(9600);
  digitalWrite(blPin, LOW);
  digitalWrite(polPin, LOW); // INVERTING ALL OUTPUT
  digitalWrite(clockPin, LOW);
  digitalWrite(dataPin, LOW);
  digitalWrite(latchPin, HIGH);
  digitalWrite(dirPin, LOW);
  delay(1000);
  digitalWrite(blPin, HIGH);


Serial.begin(9600);
  pinMode(relay, OUTPUT);
  pinMode(16, OUTPUT);
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
file = SD.open("oligo.TXT");
while (file.available()) {
      Serial.write(file.read());
    }
 

}

 
 



#ifdef TEST_PROG
  int step = 0;
  long unsigned int lastT = millis();
#endif

int delayTime = 250;
void loop() {
  if(serialReadCommand()){
    writeHV507();
  }

  // Test program
  #ifdef TEST_PROG
    if(millis()-lastT>500){
      lastT = millis();
      switch(step){
    
        case 0: setElectrode(4,3,false);
        setElectrode(4,4,true);
        break;
        case 1:setElectrode(4,4,false);
        setElectrode(4,5,true);
        break;
        case 2:setElectrode(4,5,false);
        setElectrode(5,5,true);
        break;
        case 3:setElectrode(5,5,false);
        setElectrode(5,4,true);
        break;
        case 4:setElectrode(5,4,false);
        setElectrode(5,3,true);
        break;
        case 5:setElectrode(5,3,false);
        setElectrode(4,3,true);
        break;
        case 6:setElectrode(3,4,true);
        setElectrode(4,3,true);      }
      writeHV507();
      step ++;
      if(step > 5) step = 0;
    }
 
 
 
 

  if (file.read((char*)'U',1)){
digitalWrite(solenoidPin5, HIGH); //Switch Solenoid ON
  delay(1000); //Wait 1 Second
digitalWrite(solenoidPin5, LOW); //Switch Solenoid ON
delay(1000); //Wait 1 Second
digitalWrite(solenoidPin6, HIGH);
delay(1000);
digitalWrite(solenoidPin6, LOW);
digitalWrite(solenoidPin7, HIGH);
delay(1000);
digitalWrite(solenoidPin7, LOW);
}
 
  if (file.read((char*)'T',1)){
    digitalWrite(solenoidPin4, HIGH); //Switch Solenoid ON
  delay(1000); //Wait 1 Second
digitalWrite(solenoidPin4, LOW); //Switch Solenoid ON
delay(1000); //Wait 1 Second
digitalWrite(solenoidPin6, HIGH);
delay(1000);
digitalWrite(solenoidPin6, LOW);
digitalWrite(solenoidPin7, HIGH);
delay(1000);
digitalWrite(solenoidPin7, LOW);
  }
  if (file.read((char*)'C',1)){
    digitalWrite(solenoidPin3, HIGH); //Switch Solenoid ON
  delay(1000); //Wait 1 Second
digitalWrite(solenoidPin3, LOW); //Switch Solenoid ON
delay(1000); //Wait 1 Second
digitalWrite(solenoidPin6, HIGH);
delay(1000);
digitalWrite(solenoidPin6, LOW);
digitalWrite(solenoidPin7, HIGH);
delay(1000);
digitalWrite(solenoidPin7, LOW);
  }
  if (file.read((char*)'G',1))
{
    digitalWrite(solenoidPin2, HIGH); //Switch Solenoid ON
  delay(1000); //Wait 1 Second
digitalWrite(solenoidPin2, LOW); //Switch Solenoid ON
delay(1000); //Wait 1 Second
digitalWrite(solenoidPin6, HIGH);
delay(1000);
digitalWrite(solenoidPin6, LOW);
digitalWrite(solenoidPin7, HIGH);
delay(1000);
digitalWrite(solenoidPin7, LOW);
}
   if (file.read((char*)'A',1)){
    digitalWrite(solenoidPin1, HIGH); //Switch Solenoid ON
  delay(1000); //Wait 1 Second
digitalWrite(solenoidPin1, LOW); //Switch Solenoid ON
delay(1000); //Wait 1 Second
digitalWrite(solenoidPin6, HIGH);
delay(1000);
digitalWrite(solenoidPin6, LOW);
digitalWrite(solenoidPin7, HIGH);
delay(1000);
digitalWrite(solenoidPin7, LOW);
   }
  writeData(one<<43);
  delay(delayTime);
  writeData(one<<42);
  delay(delayTime);
  writeData(one<<41);
  delay(delayTime);
  writeData(one<<40);
  delay(delayTime);
  writeData(one<<41);
  delay(delayTime);
  writeData(one<<42);
  delay(delayTime);

 


#endif

}



uint8_t serialReadCommand(){
  uint8_t number_of_commands = 0;
  while (Serial.available() > 0) {
    char recieved = Serial.read();

    serialBuffer[currentIndex] = recieved;
    currentIndex ++;
    if (currentIndex >= SERIAL_BUFFER_LENGTH) {
      // Invalid command: command is too long
      currentIndex = 0;
    }

    if (recieved == '\n' || recieved == '\r') {
      // Close string
      serialBuffer[currentIndex-1] = '\0';
      
      // Clear buffer for next serial transaction
      currentIndex = 0;

      // Split the string
      char* commaIndex = strchr(serialBuffer, ',');
      if (commaIndex==NULL) {
        // Invalid command: command is malformed
        continue;
      }
      commaIndex[0] = '\0';
      char* secondCommaIndex = strchr(commaIndex+1, ',');
      if (secondCommaIndex==NULL) {
        // Invalid command: command is malformed
        continue;
      }
      secondCommaIndex[0] = '\0';

      int x = atoi(serialBuffer);
      int y = atoi(commaIndex+1);
      if(x<0 || x>=ELECTRODE_ARRAY_WIDTH || y<0 || y>=ELECTRODE_ARRAY_HEIGHT){
        // Invalid command: out of bound
        continue;
      }
      
      setElectrode(x,y,strcmp(secondCommaIndex+1,"0")!=0);
      number_of_commands += 1;
    }
  }
  return number_of_commands;
}

/*void btnMatrixTest(){
  for (int y = 0; y <ELECTRODE_ARRAY_WIDTH ; y++)
    for (int x = 0; x <ELECTRODE_ARRAY_HEIGHT ; x++){
      clearElectrodes();
      electrodes[x][y]=true;
      writeHV507();
      Serial.print(x);
      Serial.print("\t");
      Serial.println(y);
      delay(500);
      while(digitalRead(PIN_SWA)){}
    }
}*/
 
Just what exactly is now going wrong ? Just tossing multiple trial-and-error iterations of your big chunk code, saying "it works as before" does not help at all. Isolate the problem in as little code as possible and be clear what the issue is. Avoid any Arduino specific terminology, this is a C++ forum. Be very precise in what you write, something like "the main reason I abandoned that was because the command wouldn't compile nor function if it did" is all but useless.
 

New Threads

Latest posts

Buy us a coffee!

Back
Top Bottom