hello, i'm developing a vending machine that uses sim 800l as the payment gateway. i need to extract a number/value, which is the amount sent by the cutomer from the text i receive and multiply this value by 0.75 which is a rate . the product i get from this represents the time for which my relay should be ON eg 20 *0.75=15 , relay ON for 15 seconds. the amount is determined from text so relay on time always change.
somebody please help
Welcome to the forum
Which data type is the text in ?
Is it a String (an object of the String library) or a C-string (a zero terminated array of chars) ?
Please post your full sketch or a smaller but complete sketch that illustrates what you want to do. An example of the text received would be helpful too
Hello, do yourself a favour and please read How to get the best out of this forum and post accordingly (including necessary documentation for your ask).
I assume that by "Text" @onyango-1 means an "SMS" (a text message)?
which arduino are you using? do you have an SIM800L library that you use?
I'm new to this forum and it does not allow me to attach sketches , new to programming too but i think i'll make the best out of it.
Here is an example of the text i receive and from it i should extraxt the "528" only .
" PLT2TZ4YUK Confirmed you have received ksh528 from lydia on 29/12/21 at3:08pm new MPESA balance is ksh1000 .for mpesa dial *334# "
CODE FOR RECEIVING SMS
#include <SoftwareSerial.h>
//Create software serial object to communicate with SIM800L
SoftwareSerial mySerial(3, 2); //SIM800L Tx & Rx is connected to Arduino #3 & #2
void setup()
{
//Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
Serial.begin(9600);
//Begin serial communication with Arduino and SIM800L
mySerial.begin(9600);
Serial.println("Initializing...");
delay(1000);
mySerial.println("AT"); //Once the handshake test is successful, it will back to OK
updateSerial();
mySerial.println("AT+CMGF=1"); // Configuring TEXT mode
updateSerial();
mySerial.println("AT+CNMI=1,2,0,0,0"); // Decides how newly arrived SMS messages should be handled
updateSerial();
}
void loop()
{
updateSerial();
}
void updateSerial()
{
delay(500);
while (Serial.available())
{
mySerial.write(Serial.read());//Forward what Serial received to Software Serial Port
}
while(mySerial.available())
{
Serial.write(mySerial.read());//Forward what Software Serial received to Serial Port
}
}
It is much easier for everyone if you post your sketches here directly by please, when you do that, use code tags
Please follow the advice given in the link below when posting code, in particular the section entitled 'Posting code and common code problems'
Use code tags (the </> icon above the compose window) to make it easier to read and copy for examination
As to your question :
Serial.write(mySerial.read());//Forward what Software Serial received to Serial Port
You need to save each received character in an array of chars and then parse it
See Serial input basics - updated for examples of the technique
yeah by "text" i mean sms ...I'm using arduino uno and i have the library .
thank you everyone , i think am gonna learn more and get back later.
is ksh ALWAYS the identifier? If so, you do not need to buffer the entire message; a state machine can capture "ksh" and buffer only the characters afterward until a chr(32) space character is received - then convert the characters in the buffer into numeric value.
Example from Dark Ages ... needs to be updated to modern thinking; but shows the parsing trick:
/*
GPS serial read and sentence detection
Derrived from work by M. Ray Burnette on the PSoC code published on Hackster.io/RayBurne
Compiler board: Nano
Arduino 1.7.3 & 1..7.8 // 6/09/2015 & 1/17/2016
Sketch uses 504 bytes (1%) of program storage space. Maximum is 30,720 bytes.
Global variables use 16 bytes (0%) of dynamic memory, leaving 2,032 bytes for local variables. Maximum is 2,048 bytes
*/
#include <stdlib.h> // for function atoi()
// Global variables
uint8_t hour, minute, seconds; //, year, month, day;
uint8_t day, month, year;
char buffer[9];
char nmea[120];
// double atof(const char *str); // elimited Limor's float implementation
boolean DayLightSavings; // Pin 3.4
uint8_t GMToffset = 4;
uint8_t Flag = 1;
uint32_t c = '\0';
int8_t k = 0 ;
boolean DSTime_Read(void) {
return true;
}
void GLCD_WRITE( char *x ) {
}
void glcd_write(void) {
}
void glcd_clear(void) {
}
void glcd_tiny_draw_string(int x, int y, char* c) {
}
char UART_UartGetChar() {
char i = '\0';
return i;
}
void LED_Write( boolean PinState) {
}
boolean LED_Read(void) {
return ~true;
}
void setup(void)
{
DayLightSavings = DSTime_Read(); // Pin# Normally true (HIGH)
if(! DayLightSavings) GMToffset += 1;
}
void loop(void)
{
if (Flag == 1)
{
GLCD_WRITE("Waiting on GPS") ;
// Flag = 0;
c = UART_UartGetChar(); // Get received character or null
if (c)
{
if(c == '$') // $ start of NMEA sentences
{
for(k=0; k<5; k++) // need 5 characters for sentence type
{
LED_Write( ~LED_Read() ); // flicker LED for activity
do {
c = UART_UartGetChar();
}
while (! (c));
nmea[k] = c; // G + P + R + M + C
// sprintf(buffer + k, "%c", c) ; // only for debug
}
LED_Write( LOW ); // LED off
if (strstr(nmea, "GPRMC"))
{
do {
do {
c = UART_UartGetChar();
LED_Write( ~LED_Read() ); // flicker LED
} while (!(c));
nmea[k] = c;
++k;
} while ( !( c == '*' ) && k < 120) ; // marker
LED_Write( LOW ); // LED off
// Inspiration: Limor Fried's Arduino GPS lib
char *p = nmea;
p = strchr(p, ',') + 1; // position after 1st comma
// float timef = atof(p);
// uint32_t time = timef;
uint32_t time = atoi(p);
hour = time / 10000;
minute = (time % 10000) / 100;
seconds = (time % 100);
// output to GLCD
sprintf(buffer, " %s",""); // clearbuffer
// this corrects time to the West but not the date!!!
if( hour > GMToffset) {
hour = hour - GMToffset;
} else {
hour = (hour + 24) - GMToffset; }
// correct midnight to follow standard format
if (hour == 24) hour = 0;
if (hour < 10) {
if (DayLightSavings) {
sprintf(buffer, "EDT: %d", hour);
} else {
sprintf(buffer, "EST: %d", hour);
}
} else {
if (DayLightSavings) {
sprintf(buffer, "EDT: %d%d", hour);
} else {
sprintf(buffer, "EST: %d%d", hour); }
}
if (minute < 10) {
sprintf(buffer + 7, ":0%d", minute);
} else {
sprintf(buffer + 7, ":%d%d", minute); }
if (seconds < 10) {
sprintf(buffer + 10,":0%d%s", seconds);
} else {
sprintf(buffer + 10, ":%d%d%s", seconds); }
sprintf(buffer + 13, "%s", "\0");
if(Flag == 1)
{
Flag = 0;
glcd_clear() ;
delay(250) ;
}
// OUTPUT the TIME on GLCD
glcd_tiny_draw_string(0, 4, buffer);
glcd_write() ;
// Parse to integer date field
p = strchr(p, ',') +1; // A/V?
p = strchr(p, ',') +1; // lat
p = strchr(p, ',') +1; // N/S?
p = strchr(p, ',') +1; // lon
p = strchr(p, ',') +1; // E/W?
p = strchr(p, ',') +1; // speed
p = strchr(p, ',') +1; // angle
p = strchr(p, ',') +1; // move pass for date DDMMYY
// nmea date field looks like: 090914 (European)
uint32_t fulldate = atoi(p);
day = (fulldate / 10000);
month = (fulldate % 10000) / 100;
year = (fulldate % 100);
sprintf(buffer, " %s",""); // clearbuffer
if (day < 10) {
sprintf(buffer, "0%d", day);
} else {
sprintf(buffer, "%d%d", day); }
if (month < 10) {
sprintf(buffer + 2,"-0%d", month);
} else {
sprintf(buffer + 2,"-%d%d", month); }
sprintf(buffer + 5, "-20%d%d%s", year);
sprintf(buffer + 10,"%s",'\0');
// OUTPUT the DATE on GLCD
glcd_tiny_draw_string(0, 2, buffer);
glcd_write() ;
} // if (strstr(nmea, "GPRMC"))
} // if(c == '$')
} // if(c)
} // flag
} // loop()
/* [] END OF FILE */
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.