ตามหัวข้อกระทู้เลยครับ คือผมได้ทำระบบหนึ่งที่เกี่ยวกับการเพิ่มคะแนนใน arduino และผมได้ทำระบบพื้นฐานเพื่อไว้ใช้ต่อยอด แต่ปัญหาก็คือทุกที่ผมกดปุ่มรับค่าคะแนนมาเก็บไว้ในตัวแปรหนึ่งและหลังจากนั้นผมก็กดปุ่มบวกค่าคะแนนและส่งค่าคะแนนขึ้น thingspeak และพอผมมากดปุ่มรับค่าอีกที ผมก็ได้รับค่าเดิมที่ก่อนหน้านี้ผมได้ส่งไป ประมาณว่า ผมรับค่าจาก thingspeak มา เสร็จปุป ก็ทำการเพิ่มคะแนนและก็ส่งขึ้นไปบน thingspeak ใหม่ และนำค่าคะแนนที่บวกแล้วมาอ่านอีกทีแต่ดันได้ค่าเดิมที่ยังไม่ได้บวกคะแนนมา
ตัวอย่างโค้ด
#include <SoftwareSerial.h>
#include <string.h>
#include <stdlib.h>
#define esp8266 Serial1
#define SSID "test" // put here the name of your wifi network
#define PASS "lolman123"
#define IP "184.106.153.149"
int counter = 100;
int resetpoint = 100;
String keep;
String valuetosend;
const int resetPin = 3;
const int resetPoint = 3;
String GET = "GET /update?key=FYPW04TOYR3FX2QH&"; // put here your thingspeak key
String GET1 = "field1=";
const byte numChars = 32;
char receivedChars[numChars];
boolean newData = false;
String readGET1 = "GET
https://api.thingspeak.com/channels/864152/fields/1/last";
int ex_int = 10;
int ex_int_keep;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
esp8266.begin(115200);
Serial.println("Resetting...");
esp8266.println("AT");
delay(2000);
if(esp8266.find("OK")){
connectWiFi();
Serial.println("WIFI CONNECTED");
}
pinMode(7, INPUT_PULLUP);
pinMode(8, INPUT_PULLUP);
pinMode(resetPoint, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
int readBtn = digitalRead(7);
int readSend = digitalRead(8);
int readResetPoint = digitalRead(resetPoint);
if (readBtn == 0)
{
ReadLastEntryThingSpeak();
}
if (readSend == 0)
{
WriteThingSpeak();
}
}
boolean connectWiFi(){
esp8266.println("AT+CWMODE=3");
delay(2000);
String cmd="AT+CWJAP=\"";
cmd+=SSID;
cmd+="\",\"";
cmd+=PASS;
cmd+="\"";
esp8266.println(cmd);
delay(5000);
if(esp8266.find("OK")){
Serial.println("OK");
return true;
}else{
Serial.println("KO");
return false;
}
}
void updateFunction(String valuetosend){
String cmd = "AT+CIPSTART=\"TCP\",\"";
cmd += IP;
cmd += "\",80";
esp8266.println(cmd);
delay(2000);
if(esp8266.find("Error")){
Serial.print("Error1");
return;
}
cmd = GET + GET1;
cmd += valuetosend;
cmd += "\r\n";
Serial.print(cmd);
esp8266.print("AT+CIPSEND=");
esp8266.println(cmd.length());
esp8266.print("\r\n");
if(esp8266.find(">")){
esp8266.print(cmd);
}else{
esp8266.println("AT+CIPCLOSE");
}
delay(2000);
ResetEverything ();
}
void ReadLastEntryThingSpeak()
{
String cmd = "AT+CIPSTART=\"TCP\",\"";
cmd += IP;
cmd += "\",80";
esp8266.println(cmd);
delay(2000);
if(esp8266.find("Error")){
Serial.print("Error1");
return;
}
cmd = readGET1;
cmd += "\r\n";
Serial.print(cmd);
esp8266.print("AT+CIPSEND=");
esp8266.println(cmd.length());
esp8266.print("\r\n");
if(esp8266.find(">")){
esp8266.print(cmd);
}else{
esp8266.println("AT+CIPCLOSE");
}
delay(5000);
if (esp8266.find("+IPD,"))
{
recvWithStartEndMarkers();
if (!newData) Serial.println("No new Data Received");
Serial.print("The last value of field 1 is ");
Serial.println(receivedChars);
ex_int_keep = (receivedChars[0] - '0') * 100; //Convert char to int
ex_int_keep += (receivedChars[1] - '0') * 10;
ex_int_keep += receivedChars[2] - '0';
Serial.print("The value of ex_int_keep is ");
Serial.println(ex_int_keep);
}
}
void WriteThingSpeak ()
{
int sum = counter + ex_int_keep;
String valuetosend = String(sum);
updateFunction(valuetosend);
}
void ResetEverything ()
{
esp8266.println("AT+RST");
delay(2000);
ex_int_keep = 0;
Serial.println("Ready to use!");
}
void recvWithStartEndMarkers() {
static boolean recvInProgress = false;
static byte ndx = 0;
char startMarker = ':';
char endMarker = 'C';
char rc;
while (esp8266.available() > 0 && newData == false) {
rc = esp8266.read();
if (recvInProgress == true) {
if (rc != endMarker) {
receivedChars[ndx] = rc;
ndx++;
if (ndx >= numChars) {
ndx = numChars - 1;
}
}
else {
receivedChars[ndx] = '\0'; // terminate the string
recvInProgress = false;
ndx = 0;
newData = true;
}
}
else if (rc == startMarker) {
recvInProgress = true;
}
}
}
คือแบบว่าผมต้องล้างค่าในตัวแปรก่อนหรือเปล่าผมถึงจะสามารถรับค่าใหม่มาได้ในตัวแปร
ผลจาก Serial Monitor
Resetting...
OK
WIFI CONNECTED
GET
https://api.thingspeak.com/channels/864152/fields/1/last
The last value of field 1 is 800 //ค่าที่ผมได้รับมาล่าสุด
The value of ex_int_keep is 800
GET /update?key=FYPW04TOYR3FX2QH&field1=900 //ค่าที่ผมได้รับมาล่าสุดและบวกด้วย 100 แล้วส่งขึ้นไป
Ready to use!
GET
https://api.thingspeak.com/channels/864152/fields/1/last
The last value of field 1 is 800 //ค่าที่ผมควรจะได้คือ 900 ซึ่งเป็นค่าล่าสุด
The value of ex_int_keep is 800
ถ้าผมเขียนโค้ดใน function ของ resetEverything ให้ล้างค่าเป็น
void ResetEverything ()
{
esp8266.println("AT+RST");
delay(2000);
ex_int_keep = 0;
receivedChars[0] = '\0';
const byte numChars = 32;
char receivedChars[numChars];
Serial.println("Ready to use!");
}
ค่าที่ผมได้หลังจากที่ผมกดปุ่มส่งค่าไปก็กลายเป็นติดลบและว่างเปล่าดังตัวอย่างข้างล่างครับ
Resetting...
OK
WIFI CONNECTED
GET
https://api.thingspeak.com/channels/864152/fields/1/last
The last value of field 1 is 100 //อ่านค่าล่าสุด
The value of ex_int_keep is 100
GET /update?key=FYPW04TOYR3FX2QH&field1=200 //ค่าล่าสุดที่บวก 100 แล้วส่งขึ้นไป
Ready to use!
GET
https://api.thingspeak.com/channels/864152/fields/1/last
GET
https://api.thingspeak.com/channels/864152/fields/1/last
The last value of field 1 is //ผลลัพธ์ที่ออกควรจะเป็น 200 ครับ
The value of ex_int_keep is -4800
ผมควรจะเขียนโค้ดยังไงดีครับให้ได้รับค่าล่าสุดมาได้โดยไม่มีปัญหา
ทำไมผมยังได้ค่าเดิมที่ผมใส่ไปแทนที่จะเป็นค่าใหม่ครับ Arduino
ตัวอย่างโค้ด
#include <SoftwareSerial.h>
#include <string.h>
#include <stdlib.h>
#define esp8266 Serial1
#define SSID "test" // put here the name of your wifi network
#define PASS "lolman123"
#define IP "184.106.153.149"
int counter = 100;
int resetpoint = 100;
String keep;
String valuetosend;
const int resetPin = 3;
const int resetPoint = 3;
String GET = "GET /update?key=FYPW04TOYR3FX2QH&"; // put here your thingspeak key
String GET1 = "field1=";
const byte numChars = 32;
char receivedChars[numChars];
boolean newData = false;
String readGET1 = "GET https://api.thingspeak.com/channels/864152/fields/1/last";
int ex_int = 10;
int ex_int_keep;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
esp8266.begin(115200);
Serial.println("Resetting...");
esp8266.println("AT");
delay(2000);
if(esp8266.find("OK")){
connectWiFi();
Serial.println("WIFI CONNECTED");
}
pinMode(7, INPUT_PULLUP);
pinMode(8, INPUT_PULLUP);
pinMode(resetPoint, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
int readBtn = digitalRead(7);
int readSend = digitalRead(8);
int readResetPoint = digitalRead(resetPoint);
if (readBtn == 0)
{
ReadLastEntryThingSpeak();
}
if (readSend == 0)
{
WriteThingSpeak();
}
}
boolean connectWiFi(){
esp8266.println("AT+CWMODE=3");
delay(2000);
String cmd="AT+CWJAP=\"";
cmd+=SSID;
cmd+="\",\"";
cmd+=PASS;
cmd+="\"";
esp8266.println(cmd);
delay(5000);
if(esp8266.find("OK")){
Serial.println("OK");
return true;
}else{
Serial.println("KO");
return false;
}
}
void updateFunction(String valuetosend){
String cmd = "AT+CIPSTART=\"TCP\",\"";
cmd += IP;
cmd += "\",80";
esp8266.println(cmd);
delay(2000);
if(esp8266.find("Error")){
Serial.print("Error1");
return;
}
cmd = GET + GET1;
cmd += valuetosend;
cmd += "\r\n";
Serial.print(cmd);
esp8266.print("AT+CIPSEND=");
esp8266.println(cmd.length());
esp8266.print("\r\n");
if(esp8266.find(">")){
esp8266.print(cmd);
}else{
esp8266.println("AT+CIPCLOSE");
}
delay(2000);
ResetEverything ();
}
void ReadLastEntryThingSpeak()
{
String cmd = "AT+CIPSTART=\"TCP\",\"";
cmd += IP;
cmd += "\",80";
esp8266.println(cmd);
delay(2000);
if(esp8266.find("Error")){
Serial.print("Error1");
return;
}
cmd = readGET1;
cmd += "\r\n";
Serial.print(cmd);
esp8266.print("AT+CIPSEND=");
esp8266.println(cmd.length());
esp8266.print("\r\n");
if(esp8266.find(">")){
esp8266.print(cmd);
}else{
esp8266.println("AT+CIPCLOSE");
}
delay(5000);
if (esp8266.find("+IPD,"))
{
recvWithStartEndMarkers();
if (!newData) Serial.println("No new Data Received");
Serial.print("The last value of field 1 is ");
Serial.println(receivedChars);
ex_int_keep = (receivedChars[0] - '0') * 100; //Convert char to int
ex_int_keep += (receivedChars[1] - '0') * 10;
ex_int_keep += receivedChars[2] - '0';
Serial.print("The value of ex_int_keep is ");
Serial.println(ex_int_keep);
}
}
void WriteThingSpeak ()
{
int sum = counter + ex_int_keep;
String valuetosend = String(sum);
updateFunction(valuetosend);
}
void ResetEverything ()
{
esp8266.println("AT+RST");
delay(2000);
ex_int_keep = 0;
Serial.println("Ready to use!");
}
void recvWithStartEndMarkers() {
static boolean recvInProgress = false;
static byte ndx = 0;
char startMarker = ':';
char endMarker = 'C';
char rc;
while (esp8266.available() > 0 && newData == false) {
rc = esp8266.read();
if (recvInProgress == true) {
if (rc != endMarker) {
receivedChars[ndx] = rc;
ndx++;
if (ndx >= numChars) {
ndx = numChars - 1;
}
}
else {
receivedChars[ndx] = '\0'; // terminate the string
recvInProgress = false;
ndx = 0;
newData = true;
}
}
else if (rc == startMarker) {
recvInProgress = true;
}
}
}
คือแบบว่าผมต้องล้างค่าในตัวแปรก่อนหรือเปล่าผมถึงจะสามารถรับค่าใหม่มาได้ในตัวแปร
ผลจาก Serial Monitor
Resetting...
OK
WIFI CONNECTED
GET https://api.thingspeak.com/channels/864152/fields/1/last
The last value of field 1 is 800 //ค่าที่ผมได้รับมาล่าสุด
The value of ex_int_keep is 800
GET /update?key=FYPW04TOYR3FX2QH&field1=900 //ค่าที่ผมได้รับมาล่าสุดและบวกด้วย 100 แล้วส่งขึ้นไป
Ready to use!
GET https://api.thingspeak.com/channels/864152/fields/1/last
The last value of field 1 is 800 //ค่าที่ผมควรจะได้คือ 900 ซึ่งเป็นค่าล่าสุด
The value of ex_int_keep is 800
ถ้าผมเขียนโค้ดใน function ของ resetEverything ให้ล้างค่าเป็น
void ResetEverything ()
{
esp8266.println("AT+RST");
delay(2000);
ex_int_keep = 0;
receivedChars[0] = '\0';
const byte numChars = 32;
char receivedChars[numChars];
Serial.println("Ready to use!");
}
ค่าที่ผมได้หลังจากที่ผมกดปุ่มส่งค่าไปก็กลายเป็นติดลบและว่างเปล่าดังตัวอย่างข้างล่างครับ
Resetting...
OK
WIFI CONNECTED
GET https://api.thingspeak.com/channels/864152/fields/1/last
The last value of field 1 is 100 //อ่านค่าล่าสุด
The value of ex_int_keep is 100
GET /update?key=FYPW04TOYR3FX2QH&field1=200 //ค่าล่าสุดที่บวก 100 แล้วส่งขึ้นไป
Ready to use!
GET https://api.thingspeak.com/channels/864152/fields/1/last
GET https://api.thingspeak.com/channels/864152/fields/1/last
The last value of field 1 is //ผลลัพธ์ที่ออกควรจะเป็น 200 ครับ
The value of ex_int_keep is -4800
ผมควรจะเขียนโค้ดยังไงดีครับให้ได้รับค่าล่าสุดมาได้โดยไม่มีปัญหา