I keep getting the following error message when I'm trying to run my code. I can not figure out how to correct these errors so I can test everything. Even though these are just warning messages and the code says it uploads. I don't get any messages on my serial monitor printing any statements.
Code:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,16,2); // set the LCD address for a 16 chars and 2 line display
const int guessPin = 7;
const int switch0Pin = 13;
const int switch1Pin = 12;
const int switch2Pin = 11;
const int switch3Pin = 10;
const int switch4Pin = 9;
int currentLetterIndex = 0;
int currentClueIndex = 0;
int currentGuess = 0;
int lastGuess = 0;
bool debug = false; // set to false to turn off serial output
unsigned long previousMillis = 0;
long restInterval = 20 * 1000; // 20 second time out to conserve battery
char clueBreak[] = "Get clue at the next house :)";
char hintBreak[] = "ah ah ah... must be patient";
char answerBreak[] = "santa";
char clue1[] = "The place we first meet?";
char hint1[] = "Company... not city";
char answer1[] = "pcc";
char clue2[] = "The play we saw in NY";
char hint2[] = "muppets... no...";
char answer2[] = "avenueq";
char clue3[] = "What we worn in Times Square";
char hint3[] = "look me in the eyes...";
char answer3[] = "diapers";
char clue4[] = "Where I said 'I Love You'";
char hint4[] = "And you later threw up on me...";
char answer4[] = "tonys";
char clue5[] = "";
char hint5[] = "+++ ++ ++++ ++++";
char answer5[] = "";
char clue6[] = "When do we do anything?";
char hint6[] = "'bye' 'see you +++++++'";
char answer6[] = "maybe tomorrow";
char clue7[] = "The animal you pet in gatlinburg";
char hint7[] = "spell the numbers...";
char answer7[] = "jellyfish";
char clue8[] = "These are only in California";
char hint8[] = "the one you used to sleep with";
char answer8[] = "seven eleven";
char clue9[] = "Where did you buy your cat?";
char hint9[] = "(-_-) R-O-B-O-T";
char answer9[] = "japan";
char clue10[] = "The ugliest car color...";
char hint10[] = "your second favorite color";
char answer10[] = "yellow";
char clue11[] = "Our first wine and paint";
char hint11[] = "__ _____ _____";
char answer11[] = "no drama llama";
const int cluesNum = 10; // clues + breaks
char * hints[] = {
hint1,
hint2,
hint3,
hint4,
hint5,
hint6,
hint7,
hint8,
hint9,
hint10,
hint11,
};
char * clues[] = {
clue1,
clue2,
clue3,
clue4,
clue5,
clue6,
clue7,
clue8,
clue9,
clue10,
clue11,
};
char * answers[] = {
answer1,
answer2,
answer3,
answer4,
answer5,
answer6,
answer7,
answer8,
answer9,
answer10,
answer11,
};
char currentLine1[17]; // need extra char for null pointer
char currentLine2[17]; // need extra char for null pointer
bool isDisplayingClue = true;
void setup()
{
pinMode(guessPin, INPUT);
pinMode(switch0Pin, INPUT);
pinMode(switch1Pin, INPUT);
pinMode(switch2Pin, INPUT);
pinMode(switch3Pin, INPUT);
pinMode(switch4Pin, INPUT);
lcd.init();
lcd.backlight();
if (debug)
{
Serial.begin(9600);
}
}
void updateDisplayFromArray(const char *str)
{
int limit = getCharSize(str)-1;
for (int i = 0; i >= 16; i++)
{
if (i <= limit)
{
currentLine1[i] = str[i];
}
if (i+16 <= limit)
{
currentLine2[i] = str[i+16];
}
}
}
int getCharSize(const char *cArray)
{
return sizeof(cArray) / sizeof(char);
}
void logger(const char *message)
{
if (debug)
{
Serial.println(message);
}
}
void restLCD()
{
lcd.setBacklight(0);
lcd.noDisplay();
}
void showLCD()
{
isDisplayingClue = false;
previousMillis = millis();
lcd.setBacklight(50);
lcd.display();
}
void TypeAnimation(const char *line1, const char *line2, int delayTime)
{
lcd.clear();
for (int i = 0; i <= getCharSize(line1)-1; i++) {
lcd.setCursor(i,0);
lcd.print(line1[i]);
delay(delayTime);
}
for (int i = 0; i <= getCharSize(line2)-1; i++) {
lcd.setCursor(i,1);
lcd.print(line2[i]);
delay(delayTime);
if (i == getCharSize(line2)-1) {
delay(1000);
}
}
}
void DelayAnimation(const char *line1, const char *line2, int delayTime)
{
setScreen(line1, line2);
delay(delayTime);
}
void setScreen(const char *line1, const char *line2)
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print(line1);
lcd.setCursor(0,1);
lcd.print(line2);
}
void TestAnimations()
{
showLCD();
PlayGuessingAnimation();
PlayCorrectAnimation();
PlayIncorrectAnimation();
ResetClues();
CurrentStatus();
ShowCurrentGuess();
DisplayClue(5000);
restLCD();
delay(5000);
currentLetterIndex++;
}
void ResetClues()
{
DelayAnimation("Resetting...", "",1500);
DelayAnimation("Merry Christmas!", "My Love :)",4000);
TypeAnimation("Old Man Turtle", "has been taken",250);
TypeAnimation("again...", ":(",250);
TypeAnimation("Solve the clues", "to find him",250);
TypeAnimation("Use the button 2", "submit da letter",250);
DelayAnimation("Now for your 1st", "clue",4000);
TypeAnimation("Goodluck my love", ":)",250);
NextClue();
currentLetterIndex = 0;
currentClueIndex = 0;
}
void ShowFinalAnimation()
{
TypeAnimation("You did it!", "",250);
TypeAnimation("You saved", "Old Man Turtle",250);
TypeAnimation("Old Man Turtle", "has left yo",250);
TypeAnimation("Use the button 2", "submit da letter",250);
DelayAnimation("Now for your 1st", "clue",4000);
TypeAnimation("Goodluck my love", ":)",250);
}
void loop()
{
logger("************* NEW LOOP *************");
//PlayGuessingGame();
TestAnimations();
}
void PlayGuessingGame()
{
bool buttonState = digitalRead(guessPin);
char *state = char(buttonState);
logger(state);
ConvertGuess();
if (buttonState)
{
logger("made it inside button guess clicked");
showLCD();
CheckGuess();
}
else
{
if (lastGuess != currentGuess)
{
logger("The guess has changed");
showLCD();
ShowCurrentGuess();
lastGuess = currentGuess;
}
else
{
logger("The guess hasn't changed :(");
if (!isDisplayingClue)
{
DisplayClue(1);
}
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > restInterval * .7)
{
DelayAnimation(" About to enter ", "-- Rest Mode --",1500);
}
if(currentMillis - previousMillis > restInterval)
{
logger("...REST MODE ACTIVATED...");
restLCD();
}
}
}
if (currentClueIndex > cluesNum)
{
ShowFinalAnimation();
}
}
void ConvertGuess()
{
bitWrite(currentGuess,0, !digitalRead(switch0Pin));
bitWrite(currentGuess,1, !digitalRead(switch1Pin));
bitWrite(currentGuess,2, !digitalRead(switch2Pin));
bitWrite(currentGuess,3, !digitalRead(switch3Pin));
bitWrite(currentGuess,4, !digitalRead(switch4Pin));
logger("Beginning conversion of guess");
logger("Pin 0:" + char(!digitalRead(switch0Pin)));
logger("Pin 1:" + char(!digitalRead(switch1Pin)));
logger("Pin 2:" + char(!digitalRead(switch2Pin)));
logger("Pin 3:" + char(!digitalRead(switch3Pin)));
logger("Pin 4:" + char(!digitalRead(switch4Pin)));
logger("new guess is " + char(ConvertIntToLetter(currentGuess)));
}
void CheckGuess()
{
PlayGuessingAnimation();
char guessLetter = ConvertIntToLetter(currentGuess);
char cLetter = clues[currentClueIndex][currentLetterIndex];
if (guessLetter == '-')
{
ResetClues();
}
else if (guessLetter == '+')
{
CurrentStatus();
}
else if (guessLetter == '?')
{
DisplayHint(5000);
}
else if (guessLetter == cLetter)
{
currentLetterIndex++;
if (currentLetterIndex > getCharSize(clues[currentClueIndex])-1)
{
PlayNextClueAnimation();
currentLetterIndex = 0;
currentClueIndex++;
}
PlayCorrectAnimation();
}
else
{
PlayIncorrectAnimation();
}
}
void ShowCurrentGuess()
{
char guess = char(ConvertIntToLetter(currentGuess));
if (guess == '-')
{
DelayAnimation(" DANGER!!! ", "THIS WILL RESET!",5000);
DelayAnimation("Press the button", "will reset",2000);
}
else if (guess == '+')
{
DelayAnimation("This will", "Show current status",2000);
}
else if (guess == '?')
{
DelayAnimation("This will", "Show you a hint",2000);
}
else if (guess == ' ')
{
DelayAnimation("You're Guessing ", "'_' (space)",1500);
}
else
{
DelayAnimation("You're Guessing ", char(guess),1500);
}
}
void CurrentStatus()
{
char currentAnswer[17] = "";
if (currentLetterIndex == 0)
{
strcpy(currentAnswer, "nothing yet :(");
}
else
{
strcpy(currentAnswer, GetCorrectGuesses());
}
DelayAnimation("You've Guessed ", strcat(char(currentClueIndex), " Clues"), 2000);
DelayAnimation("The Current", "Clues Is...", 2000);
DisplayClue(2000);
DelayAnimation("You've got right", currentAnswer, 3000);
}
char GetCorrectGuesses()
{
char result[17];
for(int i = 0; i >= currentLetterIndex; i++)
{
result[i] = answers[currentClueIndex][i];
}
return result;
}
void DisplayClue(int delayTime)
{
updateDisplayFromArray(clues[currentClueIndex]);
DelayAnimation(currentLine1,currentLine1,delayTime);
isDisplayingClue = true;
}
void DisplayHint(int delayTime)
{
updateDisplayFromArray(hints[currentClueIndex]);
TypeAnimation(currentLine1,currentLine1,delayTime);
}
void NextClue()
{
DelayAnimation(" Are you ready?? ", " Clue #" + char(currentClueIndex+1),3000);
DisplayClue(5000);
}
void PlayGuessingAnimation()
{
TypeAnimation("That is...", "",200);
}
void PlayNextClueAnimation()
{
TypeAnimation("HOORAY!!!", "",200);
DelayAnimation("You Got It Right", " Go You ;) ",2000);
TypeAnimation("On to the next", "",200);
NextClue();
}
void PlayCorrectAnimation()
{
DelayAnimation(" CORRECT!!!! ", "",1500);
}
void PlayIncorrectAnimation()
{
DelayAnimation(" Wrong :( ", " Try Again ",2000);
}
char ConvertIntToLetter(int number)
{
int result = '0';
switch (number)
{
case 0:
result = 'a';
break;
case 1:
result = 'b';
break;
case 2:
result = 'c';
break;
case 3:
result = 'd';
break;
case 4:
result = 'e';
break;
case 5:
result = 'f';
break;
case 6:
result = 'g';
break;
case 7:
result = 'h';
break;
case 8:
result = 'i';
break;
case 9:
result = 'j';
break;
case 10:
result = 'k';
break;
case 11:
result = 'l';
break;
case 12:
result = 'm';
break;
case 13:
result = 'n';
break;
case 14:
result = 'o';
break;
case 15:
result = 'p';
break;
case 16:
result = 'q';
break;
case 17:
result = 'r';
break;
case 18:
result = 's';
break;
case 19:
result = 't';
break;
case 20:
result = 'u';
break;
case 21:
result = 'v';
break;
case 22:
result = 'w';
break;
case 23:
result = 'x';
break;
case 24:
result = 'y';
break;
case 25:
result = 'z';
break;
case 26:
result = '!';
break;
case 27:
result = '%';
break;
case 28:
result = ' ';
break;
case 29:
result = '?';
break;
case 30:
result = '-';
break;
case 31:
result = '+';
}
return result;
}
Error Messages:
C:\Users\jb090\Documents\Arduino\ChristmasBoxV3\ChristmasBoxV3.ino: In function 'void PlayGuessingGame()':
C:\Users\jb090\Documents\Arduino\ChristmasBoxV3\ChristmasBoxV3.ino:263:17: warning: invalid conversion from 'char' to 'char*' [-fpermissive]
char *state = char(buttonState);
^~~~~~~~~~~~~~~~~
C:\Users\jb090\Documents\Arduino\ChristmasBoxV3\ChristmasBoxV3.ino: In function 'void ShowCurrentGuess()':
C:\Users\jb090\Documents\Arduino\ChristmasBoxV3\ChristmasBoxV3.ino:378:40: warning: invalid conversion from 'char' to 'const char*' [-fpermissive]
DelayAnimation("You're Guessing ", char(guess),1500);
^~~~~~~~~~~
C:\Users\jb090\Documents\Arduino\ChristmasBoxV3\ChristmasBoxV3.ino:198:6: note: initializing argument 2 of 'void DelayAnimation(const char*, const char*, int)'
void DelayAnimation(const char *line1, const char *line2, int delayTime)
^~~~~~~~~~~~~~
C:\Users\jb090\Documents\Arduino\ChristmasBoxV3\ChristmasBoxV3.ino: In function 'void CurrentStatus()':
C:\Users\jb090\Documents\Arduino\ChristmasBoxV3\ChristmasBoxV3.ino:391:44: warning: invalid conversion from 'char' to 'const char*' [-fpermissive]
strcpy(currentAnswer, GetCorrectGuesses());
~~~~~~~~~~~~~~~~~^~
In file included from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:25:0,
from sketch\ChristmasBoxV3.ino.cpp:1:
c:\program files (x86)\arduino\hardware\tools\avr\avr\include\string.h:305:14: note: initializing argument 2 of 'char* strcpy(char*, const char*)'
extern char *strcpy(char *, const char *);
^~~~~~
C:\Users\jb090\Documents\Arduino\ChristmasBoxV3\ChristmasBoxV3.ino:393:44: warning: invalid conversion from 'char' to 'char*' [-fpermissive]
DelayAnimation("You've Guessed ", strcat(char(currentClueIndex), " Clues"), 2000);
^~~~~~~~~~~~~~~~~~~~~~
In file included from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:25:0,
from sketch\ChristmasBoxV3.ino.cpp:1:
c:\program files (x86)\arduino\hardware\tools\avr\avr\include\string.h:248:14: note: initializing argument 1 of 'char* strcat(char*, const char*)'
extern char *strcat(char *, const char *);
^~~~~~
C:\Users\jb090\Documents\Arduino\ChristmasBoxV3\ChristmasBoxV3.ino: In function 'char GetCorrectGuesses()':
C:\Users\jb090\Documents\Arduino\ChristmasBoxV3\ChristmasBoxV3.ino:406:10: warning: invalid conversion from 'char*' to 'char' [-fpermissive]
return result;
^~~~~~
C:\Users\jb090\Documents\Arduino\ChristmasBoxV3\ChristmasBoxV3.ino:401:8: warning: address of local variable 'result' returned [-Wreturn-local-addr]
char result[17];
^~~~~~
char and char* is very different !
const char* can be slightly more tricky, but you first have to get the difference between a text and a character.
"Hello World" is a text, and usually treated as a pointer or [const] array.
'A' is a character, and internally stored the same way as the number 65 in a variable of type char.
More:
c# (or java) and c++ are very different, too. And there's a lot of truth in the saying "c++ is for masochists" :)
Your first problem
warning: invalid conversion from 'char' to 'char*'
char *state = char(buttonState);
comes from these lines:
bool buttonState = digitalRead(guessPin);
char *state = char(buttonState);
logger(state);
logger(const char*) needs a text to log, but you have a bool. Not sure how you wrote that in c#, and casting won't help. You eventually might want something like
bool buttonState = digitalRead(guessPin);
logger(buttonState? "guessPin is set": "guessPin is LOW");
You cannot cast a variable as a char by doing char(buttonState). In C you cast as follows: (char)buttonState.
There were some minor errors in my code (like incorrect for loop syntax) that was causing me to have run time errors.
This may seem like a foolish problem and maybe its description is not the best I could have devised.
I am making a velocity sensor that uses two IR beams to calculate velocity based on the time it takes to break both beams.
I have two testing methods.
My hand (5-10 m/s)
A high speed cannon (30-60 m/s).
I have ruled out that it's a problem with the signal from the IR beams with an oscilloscope, when the code fails/works the data is identical on the scope.
My problem is that my code works when I use my hand, but still irregularly fails, while it fails more often at high speed. All the conditions are the same in both scenarios. What could be the issue?
#include <SPI.h>
#include <SD.h>
#include <LiquidCrystal.h>
const int rs = 9, en = 8, d4 = 7, d5 = 6, d6 = 5, d7 = 4;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
File root;
int fileNo = 0;
String currentFileName;
const int CS = 10;
const byte interruptPinStart = 2;
const byte interruptPinFinish = 3;
volatile unsigned long int startTimeMillis = 0;
volatile unsigned long int stopTimeMillis = 0;
volatile unsigned long int startTimeMicros = 0;
volatile unsigned long int stopTimeMicros = 0;
volatile unsigned long int microsDifference = 0;
volatile unsigned long int millisDifference = 0;
int launchNo = 0;
float currentVelocity = 0;
volatile boolean started = false;
String inputString = "";
boolean stringComplete = false;
const int txLed1 = 14;
const int statusLed1 = 15;
const int statusLed2 = 16;
volatile boolean triggerDone = false;
float velocity = 0;
String temp;
unsigned long int lockout = 0;
boolean lockedOut = false;
boolean fileFail = false;
int testNo = 0;
void setup() {
inputString.reserve(200);
pinMode(statusLed1, OUTPUT);
pinMode(statusLed2, OUTPUT);
pinMode(txLed1, OUTPUT);
Serial.begin(9600);
while (!Serial) {
;
}
lcd.begin(16, 2);
pinMode(interruptPinStart, INPUT);
attachInterrupt(digitalPinToInterrupt(interruptPinStart), startTrigger, RISING);
pinMode(interruptPinFinish, INPUT);
attachInterrupt(digitalPinToInterrupt(interruptPinFinish), stopTrigger, RISING);
Serial.print("Initializing SD card...");
if (!SD.begin(CS)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
root = SD.open("/");
newDirectory(root);
Serial.println("done!");
lcd.clear();
lcd.print(currentFileName);
tone(txLed1, 38000);
}
void loop() {
int millsDiff = millis() - stopTimeMillis;
if (triggerDone) {
lockedOut = true;
Serial.print("Micros Diffrence: ");
Serial.println(microsDifference);
Serial.print("Millis Difference: ");
Serial.println(millisDifference);
float millDiff = (float) millisDifference;
float microDiff = (float) microsDifference;
if (microDiff > 0) {
velocity = (float) 0.09 / (microDiff/1000000);
testNo++;
temp = String(launchNo) + "%" + String(microsDifference) + "%" + String(velocity);
if (velocity > 10.0) {
root = SD.open(currentFileName, FILE_WRITE);
if (root) {
root.println(temp);
root.close();
Serial.println(temp);
launchNo++;
} else {
Serial.println("error opening file, " + currentFileName);
fileFail = true;
}
}
if (fileFail) {
lcd.clear();
lcd.print("File Error");
lcd.setCursor(0, 1);
lcd.print("Vel " + String(launchNo) + ": " + String(velocity) + " m/s");
fileFail = false;
} else {
lcd.clear();
lcd.print("Test Number: " + String(testNo));
lcd.setCursor(0, 1);
lcd.print("Vel " + String(launchNo) + ": " + String(velocity) + " m/s");
}
}
triggerDone = false;
Serial.println("Test Number: " + String(testNo));
}
if (digitalRead(interruptPinStart) == LOW) {
digitalWrite(statusLed1, HIGH);
} else {
digitalWrite(statusLed1, LOW);
}
if (digitalRead(interruptPinFinish) == LOW) {
digitalWrite(statusLed2, HIGH);
} else {
digitalWrite(statusLed2, LOW);
}
}
void startTrigger() {
startTimeMicros = micros();
startTimeMillis = millis();
volatile int diff1 = startTimeMicros - startTimeMillis;
volatile int diff2 = startTimeMillis - stopTimeMillis;
if (diff2 > 200) {
if (started == false || diff1 > 1000) {
started = true;
triggerDone = false;
}
}
}
void stopTrigger() {
stopTimeMicros = micros();
stopTimeMillis = millis();
microsDifference = stopTimeMicros - startTimeMicros;
millisDifference = stopTimeMillis - startTimeMillis;
if ((millisDifference > 0 && millisDifference < 800) && started) {
microsDifference = stopTimeMicros - startTimeMicros;
millisDifference = stopTimeMillis - startTimeMillis;
started = false;
triggerDone = true;
}
}
I'm currently doing a project on an Arduino Uno. The project is based on receiving an IR Signal from an IR Remote and then based on the signal received, perform other operations.
The problem is that the signal gets reset every time. I want to store the value received from the IR Remote and then resets it if detects another pulse.
Here is my code :
int brojac = 0;
int pinData = 10;
unsigned long lengthHeader;
unsigned long bit;
int byteValue;
int vrime = 1000 ;
int storeValue = 0;
void setup()
{
Serial.begin(9600);
pinMode(pinData, INPUT);
}
void loop() {
lengthHeader = pulseIn(pinData, LOW);
if (lengthHeader > 1500)
{
for (int i = 1; i <= 32; i++) {
bit = pulseIn(pinData, HIGH);
if (i > 16 && i <= 24)
if (bit > 1000)
byteValue = byteValue + (1 << (i - 17));
}
}
Serial.print("byteValue = ");
Serial.println(byteValue);
if(byteValue == 66){
digitalWrite(11,HIGH);
}
else{
digitalWrite(11,LOW);
}
delay(vrime);
byteValue = 0;
delay(250);
}
I got the answer by storing the value in a variable until a new variable is detected.
int pinData = 10;
int led = 11;
unsigned long lengthHeader;
unsigned long bit;
int byteValue;
int storeValue = 0;
int previousValue = 0;
void setup()
{
Serial.begin(9600);
pinMode(pinData, INPUT);
pinMode(led, LOW);
}
void loop() {
lengthHeader = pulseIn(pinData, LOW);
if (lengthHeader > 1500)
{
for (int i = 1; i <= 32; i++) {
bit = pulseIn(pinData, HIGH);
if (i > 16 && i <= 24)
if (bit > 1000)
byteValue = byteValue + (1 << (i - 17));
}
}
Serial.print("byteValue = ");
Serial.println(byteValue);
**storeValue = byteValue;
if (storeValue != 0){
previousValue = storeValue;
}
Serial.print("Previous value = ");
Serial.println(previousValue);**
byteValue = 0;
delay(500);
}
I have an Arduino mega with an SD Shield and a GSM shield. I'm trying to send one sms to 200 numbers from a text file on the SD card, but the Arduino reboots every time I try to send to over 100 numbers. It doesn't crash when I try to send to 70 numbers. I only read one number at a time so I don't understand the problem. I'm pretty new to Arduino programming.
Please help me this is for a tournament. Here's the code:
#include <avr/pgmspace.h>
#include <SPI.h>
#include <SD.h>
#include <GSM.h>
#define PINNUMBER ""
GSM gsmAccess;
GSM_SMS sms;
// GSM
boolean notConnected;
//char input;
//byte input2;
//char txtContent[200];
byte i = 1;
byte f = 0;
boolean sendit;
//char senderNumber[11];
const String stopp PROGMEM = "Stopp";
//SD
char numbers[11];
//char nmbr;
int l = 0;
//Optimizing
const char q PROGMEM = '\xe5'; // å
const char w PROGMEM = '\xe4'; // ä
const char e PROGMEM = '\xf6'; // ö
const char r PROGMEM = '\xc5'; // Å
const char t PROGMEM = '\xc4'; // Ä
const char y PROGMEM = '\xd6'; // Ö
void setup() {
// txtContent[0] = '\0';
i = 0;
pinMode(53, OUTPUT);
Serial.begin(115200);
// Serial.begin(4800);
Serial.println(F("Connecting to GSM..."));
notConnected = true;
while (notConnected) {
if (gsmAccess.begin(PINNUMBER) == GSM_READY) {
notConnected = false;
}
else {
Serial.println(F("Not Connected"));
delay(1000);
}
}
Serial.println(F("GSM Ready"));
if (!SD.begin(4)) {
Serial.println(F("Error with SD card"));
return;
}
Serial.println(F("SD Ready"));
delay(1000);
Serial.println(F("Write your sms and end it with * and press Send"));
Serial.flush();
}
void loop() {
char txtContent[300];
if (Serial.available() > 0 && !sendit) {
byte input2;
input2 = (int)Serial.read();
txtContent[i] = (char)input2;
if (txtContent[i] == '{') {
txtContent[i] = q;
}
else if (txtContent[i] == '}') {
txtContent[i] = w;
}
else if (txtContent[i] == '|') {
txtContent[i] = e;
}
else if (txtContent[i] == '[') {
txtContent[i] = r;
}
else if (txtContent[i] == ']') {
txtContent[i] = t;
}
else if (txtContent[i] == ';') {
txtContent[i] = y;
}
i++;
if (input2 == '*') {
// Remove the * from text.
for (int j = 0; j < sizeof(txtContent); j++) {
if (txtContent[j] == '*') {
txtContent[j] = '\0';
//Serial.println(txtContent);
}
}
sendit = true;
Serial.flush();
}
else {
sendit = false;
Serial.flush();
}
}
else if (sendit && txtContent[0] != '\0') {
int txtCount = 0;
// else if(sendit){
Serial.println(F("Sending please wait..."));
// Serial.flush();
File myFile;
myFile = SD.open("numbers.txt");
char input;
if (myFile) {
// if (myFile.available()) {
while(myFile.available()){
input = (char)myFile.read();
if (input == ',') {
sms.beginSMS(numbers);
sms.print(txtContent);
// sms.beginSMS("0704941025");
// sms.print("yo");
delay(30);
sms.endSMS();
delay(30);
Serial.println(numbers);
Serial.flush();
// Serial.flush();
for (int j = 0; j < sizeof(numbers); j++) {
if (numbers[i] != '\0') {
numbers[j] = '\0';
}
}
f = 0;
}
else {
numbers[f] = input;
f++;
}
}
myFile.close();
Serial.println(F("All texts have been sent."));
Serial.flush();
} else {
Serial.println(F("error opening numbers.txt"));
}
for (int j = 0; j < sizeof(txtContent); j++) { // Clear text
txtContent[j] = '\0';
}
i = 0;
sendit = false;
}
else {
// delay(1000);
if (sms.available()) {
char senderNumber[11];
sms.remoteNumber(senderNumber, 11);
if (sms.peek() == 'S') {
Serial.print(F("Detta nummer har skickat Stopp: "));
Serial.println(senderNumber);
}
sms.flush();
Serial.flush();
// sendit = false;
}
}
}
Arduino is a strange ground for me but if that is anything like C, then i risk saying sizeof(numbers) will likely return 44, because you're asking for the size of an array in bytes, this probably means your for loop will iterate up to numbers[43] when numbers[] length is 11. Consider this instead:
for (int j = 0; j < sizeof(numbers)/sizeof(numbers[0]); j++) {
Same goes for all the other times you check for the size of an array in this code.
Also, do double check your textfile to ensure its really written in your expected format: 11 numbers then a comma, with no exception. You should maybe try to figure out if f went past 11 digits before hitting a comma and "Fail gracefully" with an error message.
I've built an arduino sketch that attempts to do a couple of different lengths of windowing and some simple calculations (mean/variance) on the analog values from a couple of sensors. Previously I had the same code for 1 sensor working as intended but the code below has been expanded with a bunch of little for loops so that everything should run for both sensors now.
I simply can't get anything at all to print to serial - even the two serial prints i put in setup and start of loop just to debug - yet the code compiles and uploads without any errors or warnings.
I apologise for including the whole sketch, I couldn't think how to break it apart to show.
long int currentTime = 0;
long int stopTime[2] = {0,0};
long int shortWindowTime = 0;
int shortVal[2][40];
int reflexWindowStart = 0;
int reflexWindowTime = 0;
int reflexVal[2][500];
int mean[2] = {0,0};
unsigned int variance[2] = {0,0};
int lowVal[2] = {0,0};
int peakVal[2] = {0,0};
int lowIndex[2] = {0,0};
int peakIndex[2] = {0,0};
int stopIndex[2] = {0,0};
boolean stopped[2] = {false,false};
void setup(){
Serial.begin(9600);
Serial.println("wtf?");
for(int i=0;i<2;i++){
for(int j=0;j<40;j++){
shortVal[i][j] = 0;
}
for(int j=0;j<500;j++){
reflexVal[i][j] = 1023;
}
}
}
void loop() {
Serial.println("wtf?");
currentTime = micros();
if(currentTime - shortWindowTime > 500){
shortWindowTime = currentTime;
writeShortWindow();
meanVariance();
if(reflexWindowStart == 0){
reflexWindow();
}
reflexWindowStart++;
if(reflexWindowStart > 9){
reflexWindowStart = 0;
}
}
}
void writeShortWindow(){
for(int i=0;i<2;i++){
for(int j=39; j>0; j--){
shortVal[i][j] = shortVal[i][j-1];
}
int ground = analogRead(A5);
shortVal[0][0] = analogRead(A1);
analogRead(A5);
shortVal[i][0] = analogRead(A2);
}
}
void meanVariance(){
for(int i=0;i<2;i++){
for(int j=0; j<39; j++){
mean[i] = mean[i] + shortVal[i][j];
}
mean[i] = mean[i] / 40;
for(int j=0; j<39; j++){
variance[i] = variance[i] + sq(mean[i] - shortVal[i][j]) ;
}
variance[i] = variance[i] / 40;
}
}
void reflexWindow(){
for(int i=0;i<2;i++){
if(stopped[i] == true){
if((millis() - stopTime[i] > 20) && (peakVal[i] - shortVal[i][0] > 20) && (variance[i] <= 1)){
stopped[i] = false;
stopIndex[i] = 0;
Serial.println("................................NOTstopped");
}
}
}
for(int i=0;i<2;i++){
if(stopped[i] == false){
lowVal[i] = 1023;
peakVal[i] = 0;
for(int j=stopIndex[i]; j>0; j--){
reflexVal[i][j] = reflexVal[i][j-1];
if(reflexVal[i][j] < lowVal[i]){
lowVal[i] = reflexVal[i][j];
lowIndex[i] = j;
}
}
reflexVal[i][0] = shortVal[i][0];
for(int j=lowIndex[i]; j>=0; j--){
if(reflexVal[i][j] > peakVal[i]){
peakVal[i] = reflexVal[i][j];
}
}
}
}
for(int i=0;i<2;i++){
if(stopped[i] == false){
if(peakVal[i] - lowVal[i] >= 50){
Serial.print(i);
Serial.println("...................................stopped");
stopTime[i] = millis();
stopped[i] = true;
}
}
}
for(int i=0;i<2;i++){
if(stopIndex[i] < 499){
stopIndex[i]++;
}
}
Serial.print(shortVal[0][0]);
Serial.print(" ... ");
Serial.print(lowVal[0]);
Serial.print(" ... ");
Serial.print(peakVal[0]);
Serial.print(" ........ ");
Serial.print(shortVal[1][0]);
Serial.print(" ... ");
Serial.print(lowVal[1]);
Serial.print(" ... ");
Serial.println(peakVal[1]);
}
If you have a Leonardo board you will most likely not see the Serial.print in the setup function.
Try changing your setup to this (notice the extra while loop waiting for the Serial)
void setup(){
Serial.begin(9600);
while (!Serial);
Serial.println("wtf?");
for(int i=0;i<2;i++){
for(int j=0;j<40;j++){
shortVal[i][j] = 0;
}
for(int j=0;j<500;j++){
reflexVal[i][j] = 1023;
}
}
}
The reason behind this you can read in the Arduino docs for Leonardo http://arduino.cc/en/Guide/ArduinoLeonardo#toc3 but in short is that Leonardo doesnt resets the serial port when opening the serial stream.
Have you checked your BAUD rate in serial monitor, because if it is different, it will not show anything.
be sure the one in serial monitor and in Serial.begin(<BAUD rate here>) is the same