simpele waarde naar mysql database

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 27
Geregistreerd: 29 Jun 2014, 20:30

simpele waarde naar mysql database

Berichtdoor barbarossa » 16 Sep 2015, 21:33

Beste,
ik zit hier al een tijde mee te "sukkelen" en ik heb al veel informatie gelezen.
iedereen doet het een beetje anders, maar ik krijg het op geen enkele manier aan de praat.
Graag zou ik een temperatuur waarde uitlezen met een arduino uno en die via wifishield Adafruit_CC3000 naar een mysql database sturen.

momenteel heb ik dit:
arduino code ( delen geleend van andere projecten ):
as3 code
#include <Adafruit_CC3000.h>
#include <ccspi.h>
#include <SPI.h>
#include <string.h>
#include "utility/debug.h"
#include <Ethernet.h>
#include <mysql.h>
// These are the interrupt and control pins
#define ADAFRUIT_CC3000_IRQ 3 // MUST be an interrupt pin!
// These can be any two pins
#define ADAFRUIT_CC3000_VBAT 5
#define ADAFRUIT_CC3000_CS 10
// Use hardware SPI for the remaining pins
// On an UNO, SCK = 13, MISO = 12, and MOSI = 11
Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS, ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT,
SPI_CLOCK_DIVIDER);

#define WLAN_SSID "Wifiiii"
#define WLAN_PASS "***"
#define WLAN_SECURITY WLAN_SEC_WPA2
const int TempPin = A0;
void setup(void)
{
Serial.begin(115200);
Serial.println(F("Hello, CC3000!\n"));


Serial.print("Free RAM: "); Serial.println(getFreeRam(), DEC);

/* Initialise the module */
Serial.println(F("\nInitialising the CC3000 ..."));
if (!cc3000.begin())
{
Serial.println(F("Unable to initialise the CC3000! Check your wiring?"));
while(1);
}

/* Optional: Get the SSID list (not available in 'tiny' mode) */
#ifndef CC3000_TINY_DRIVER

#endif

/* Delete any old connection data on the module */
Serial.println(F("\nDeleting old connection profiles"));
if (!cc3000.deleteProfiles()) {
Serial.println(F("Failed!")) ;
while(1);
}

uint32_t ipAddress = cc3000.IP2U32(192, 168, 0, 100);
uint32_t netMask = cc3000.IP2U32(255, 255, 255, 0);
uint32_t defaultGateway = cc3000.IP2U32(192, 168, 0, 1);
uint32_t dns = cc3000.IP2U32(8, 8, 4, 4);
if (!cc3000.setStaticIPAddress(ipAddress, netMask, defaultGateway, dns)) {
Serial.println(F("Failed to set static IP!"));
while(1);
}

char *ssid = WLAN_SSID; /* Max 32 chars */
Serial.print(F("\nAttempting to connect to ")); Serial.println(ssid);

if (!cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY)) {
Serial.println(F("Failed!"));
while(1);
}

Serial.println(F("Connected!"));

/* Wait for DHCP to complete */
/* Serial.println(F("Request DHCP"));
/* while (!cc3000.checkDHCP())
{
delay(100); // ToDo: Insert a DHCP timeout!
}

/* Display the IP address DNS, Gateway, etc. */
while (! displayConnectionDetails()) {
delay(1000);
}

#ifndef CC3000_TINY_DRIVER
uint32_t ip = 0;
Serial.print(F("www.google.com -> "));
while (ip == 0) {
if (! cc3000.getHostByName("www.google.com", &ip)) {
Serial.println(F("Couldn't resolve!"));
}
delay(500);
}
cc3000.printIPdotsRev(ip);

/* Do a quick ping test on adafruit.com */
Serial.print(F("\n\rPinging ")); cc3000.printIPdotsRev(ip); Serial.print("...");
uint8_t replies = cc3000.ping(ip, 5);
Serial.print(replies); Serial.println(F(" replies"));
if (replies)
Serial.println(F("Ping successful!"));
#endif
}

void loop(void)
{
tempMeten();
DataToMySQL();
delay(1000);
}
bool displayConnectionDetails(void)
{
uint32_t ipAddress, netmask, gateway, dhcpserv, dnsserv;

if(!cc3000.getIPAddress(&ipAddress, &netmask, &gateway, &dhcpserv, &dnsserv))
{
Serial.println(F("Unable to retrieve the IP Address!\r\n"));
return false;
}
else
{
Serial.print(F("\nIP Addr: ")); cc3000.printIPdotsRev(ipAddress);
Serial.print(F("\nNetmask: ")); cc3000.printIPdotsRev(netmask);
Serial.print(F("\nGateway: ")); cc3000.printIPdotsRev(gateway);
Serial.print(F("\nDHCPsrv: ")); cc3000.printIPdotsRev(dhcpserv);
Serial.print(F("\nDNSserv: ")); cc3000.printIPdotsRev(dnsserv);
Serial.println();
return true;
}
}

void tempMeten(){
int sensorVal = analogRead(TempPin);
float voltage =(sensorVal/1024.0) * 5.0;
float temp = (voltage - .5 ) * 100;
Serial.println(temp);
}

void DataToMySQL(){
String txData ="";
txData = "ID="+ (String (1)) + "&stamp=" + (String("nu")) + "&temp="+(String("temp"));

EthernetClient client;

if (client.connect("192.168.0.240", 80))
{
Serial.print("Connected to MySQL server. Sending data...");

client.print("POST /add_data.php HTTP/1.1\n");
client.print("Host: 192.168.0.240\n");
client.print("Connection: close\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(txData.length());
client.print("\n\n");
client.print(txData);
Serial.println("Successfull");
}

else{
Serial.println("Connection failed");
Serial.println();

}
}


De wifi connectie is succesvol. hij doet een ping naar google en ik kan daarna lokaal de wifi shield pingen.

verder heb ik nog 2 php bestanden die op de root van de server staan
add_data.php:
php code
<?php
// Connect to MySQL
include("dbconnect.php");

// Prepare the SQL statement
$query = "INSERT INTO temperatuur.temp (ID, stamp, temp)
VALUES ('$_POST[ID]', '$_POST[stamp]', '$_POST[temp]')";

// Go to the review_data.php (optional)
header("Location: review_data.php");

if(!@mysql_query($query))
{
echo "&Answer; SQL Error - ".mysql_error();
return;

mysql_close();
}
?>


en dbconnect.php

php code
<?php
$Username = "***"; // enter your username for mysql
$Password = "***"; // enter your password for mysql
$Hostname = "localhost"; // this is usually "localhost" unless your database resides on a different server
$Database = "temperatuur"; //database name

$dbh = mysql_connect($Hostname , $Username, $Password) or die (mysql_error());;
@mysql_select_db($Database) or die (mysql_error());
?>


verder heb ik 1 database temperatuur met 1 tabel temp met 3 kolommen ID,stamp,temp
het is de bedoeling dat in stamp een datum/tijd notatie komt en in temp de temperatuur.

maar ik krijg er gewoon nog niets in.

als ik de arduino start dan maakt hij de wifi connectie hij laat 1 maal een temp waarde zien en dan zit hij precies vast.
kunnen jullie mij nog tips geven?
alvast bedankt
grtn Bart

Advertisement

Berichten: 97
Geregistreerd: 05 Nov 2014, 22:04

Re: simpele waarde naar mysql database

Berichtdoor MarcelK » 16 Sep 2015, 22:50

Heb je via een browser al getracht een post te doen naar de database ?
Om te testen kun je dat beter doen, zie je gelijk of je errors hebt.
Het lijkt me dat je query niet goed is

Je stuurt vanaf de Arduino ook een ID mee, echter in je database zet je al een ID in een autoincrement-veld neem ik aan ?

Verder gebruik ik geen POST maar GET
voor de stamp zou ik zeggen:

<?php
setlocale(LC_ALL, 'nl_NL'); // Nederlandse tijd !!

$datum = date("Y-m-d H:i:s");

en insert $datum in een datetime veld

?>

Ik gebruik zelf Mysqli, mysql is achterhaald tegenwoordig.

Ik verstuur zelf als volgt vanuit arduino:
Code: Alles selecteren
void upload_sensor(long pressure,float tbmp,float t1,float t2,float t3,int wtype,int lichtsterkte, int zonwering )
{
    // send the HTTP PUT request:
    char buf[64];
    memset(buf,0,64);
    int ret;
    // string die verstuurd moet worden:
    // GET /meteo/meteo_add.php?p1=1001&tbmp=22.0&t1=6.0&t2=6.0&t3=21.0&wtype=5&light=85&zonwering=1
    ret=sprintf(buf,"GET /meteo/meteo_add.php?p1=%i", pressure);
    Serial.print(buf);

    Serial.print("&tbmp=");
    dtostrf(tbmp,2, 2, outstr);
    ret=sprintf(buf,outstr);
    Serial.print(buf);

    Serial.print("&t1=");
    dtostrf(t1,2, 2, outstr);
    ret=sprintf(buf,outstr);
    Serial.print(buf);

    Serial.print("&t2=");
    dtostrf(t2,2, 2, outstr);
    ret=sprintf(buf,outstr);
    Serial.print(buf);

    Serial.print("&t3=");
    dtostrf(t3,2, 2, outstr);
    ret=sprintf(buf,outstr);
    Serial.print(buf);

    ret=sprintf(buf,"&wtype=%i", voorspelling);
    Serial.print(buf);
   
    //Serial.print("&light=");
    ret=sprintf(buf,"&light=%i", lichtsterkte);
    Serial.print(buf);
   
    //Serial.print("&nodstat=");
    ret=sprintf(buf,"&zonwering=%i", NodStatus);
    Serial.print(buf);

    Serial.println(" HTTP/1.1");

    Serial.println("Host: www.mijnwebsite.nl" ); //the remote server
    Serial.println("Connection: close");
    Serial.println();
}

Berichten: 27
Geregistreerd: 29 Jun 2014, 20:30

Re: simpele waarde naar mysql database

Berichtdoor barbarossa » 18 Sep 2015, 08:04

Hoi,
merci voor de tip!
ik had al even geen php database connectie meer gemaakt goeie tip om het zo te proberen.
bij het opzoeken naar enkele dingen kwam ik tegen dat PDO de nieuwe standaard is.
dus ik heb even de add_data en de connectie aangepast en data toevoegen via url is nu mogelijk.

je hebt inderdaad gelijk ik moet enkel de temperatuur mee geven als ik de datum in php genereer en id is AI.

nu moet ik enkel nog de arduino de add_data correct laten aanspreken. maar daar had ik gistere avond geen tijd meer voor.

wat doe je met :
char buf[64];
memset(buf,0,64);
int ret;

vriendelijke groeten
Bart

Berichten: 97
Geregistreerd: 05 Nov 2014, 22:04

Re: simpele waarde naar mysql database

Berichtdoor MarcelK » 18 Sep 2015, 13:34

Daar reserveer je een stukje geheugen mee.

idd, PDO is tegenwoordig het nieuwste, heb ik me (nog?) niet mee bezig gehouden, mysqli voldoet prima en kan nog jharen mee.
Mysql gaat straks verdwijnen dacht ik vanaf php 6

Ben benieuwd naar je resultaten.
Ga je ook e.e.a. zichtbaar maken op een webserver ?
Heb je gehoste webserver of lokaal ?

Berichten: 27
Geregistreerd: 29 Jun 2014, 20:30

Re: simpele waarde naar mysql database

Berichtdoor barbarossa » 18 Sep 2015, 17:35

hoi,
zit al even te testen maar ik geraak er gewoon ni aan uit,
als ik dit in de browser in geef dan komt de data goed in de database "http://localhost/add_data.php?temp=10"
maar ik krijg de arduino niet aan de praat hij toont in de serial monitor de temperatuur maar hij zegt niet connected of failed.
precies of hij zit vast.

het is de bedoeling om achteraf nog via IR sensors de tellers uit te meten maar ik zal het al heel leuk vinden als de temperatuur op zich al werkt.
vanaf dat de database begint te vullen met data zou ik deze dan zichtbaar willen maken met behulp van google api charts
momenteel werk ik lokaal op laptop maar ik heb een synology bestelt waar ik dan mijn database en website op kan "hosten" en natuurlijk ook mijn foto's etc op kan opslaan

cpp code
void DataToMySQL(){
EthernetClient client;
byte server[] = { 192, 168, 0, 180 };
if (client.connect(server, 80)) {
Serial.println("-> Connected");
// Make a HTTP request:
client.print( "GET /add_data.php?");
client.print("temp=");
client.print( String(temp) );
client.println( " HTTP/1.1");
client.println( "Connection: close" );
client.println();
client.println();
client.stop();
}
else {
// you didn't get a connection to the server:
Serial.println("--> connection failed/n");
}

}

Berichten: 97
Geregistreerd: 05 Nov 2014, 22:04

Re: simpele waarde naar mysql database

Berichtdoor MarcelK » 19 Sep 2015, 19:35

Hoi Barbarossa,
Ik werk zelf niet met een ethernetshield, heb ik wel geprobeerd maar had ik problemen mee.
Ik moest de verbinding konstant openhouden, ik wilde dus niet konstant data naar mijn gehoste server sturen ivm dataverkeer.
Wachtte ik langer dan 1 minuut dan kon ik dus geen verbinding meer maken maar had net als jou ook geen melding van connected of connection failed.
Ben toen overgestapt op een wifi-shield en daar kan ik alles mee.

Verder in jouw sketch staat:
Code: Alles selecteren
client.print( String(temp) );

Ik weet niet of dat korrekt is, dat kunnen de deskundigen onder ons (b.v. Nico Verduin, Shooter ?) beter vertellen.
Ik zet de temperatuur (=een double) om naar een string en verstuur als volgt:
Code: Alles selecteren
// onderstaande 3 regels bovenin je functie void DataToMySQL()
char buf[64];
memset(buf,0,64);
int ret;

Serial.print("&tbmp=");
dtostrf(tbmp,2, 2, outstr);
ret=sprintf(buf,outstr);
Serial.print(buf);

We horen er wel weer van, grt Marcel

Berichten: 27
Geregistreerd: 29 Jun 2014, 20:30

Re: simpele waarde naar mysql database

Berichtdoor barbarossa » 19 Sep 2015, 23:06

Hoi,
ik heb ook een wifi shield cc3300.

nu ik was een beetje stom ( niet veel ervaring ) maar als ik bijvoorbeeld met mijn gsm surfte naar het host ip van de wamp server kon ik er niet in.
ik moest dus eerst nog in de wamp server instellen dat hij vanuit het lokaal netwerk beschikbaar moet zijn.
ik heb dit nu aangepast ( weer een klein stapje dichterbij )
dus momenteel via de wifi shield hangt de arduino op het netwerk
het importeren van data via localhost\add_data.php?temp="waarde" werkt ook
ik kan de database van op afstand aanspreken.

volgens mij het laatste wat nu dus nog moet werken is het schrijven vanuit arduino naar het add_data bestand.
echter na het open zetten van de database op afstand krijg ik nog steeds geen reactie of de connectie ok is of niet..

ik test nog wat verder
grtn Bart

Berichten: 27
Geregistreerd: 29 Jun 2014, 20:30

Re: simpele waarde naar mysql database

Berichtdoor barbarossa » 20 Sep 2015, 09:48

ok ik moest dus blijkbaar met Adafruit_CC3000_Client client werken in plaats van met ethernetclient client.
nu komt er connected op jeuj maar nog geen data in de DB dus waarschijnlijk nog een probleem met men client print

csharp code
void DataToMySQL(){
uint32_t server = cc3000.IP2U32(192, 168, 0, 240);
Adafruit_CC3000_Client client = cc3000.connectTCP(server, 80);
if (client.connected()) {
Serial.println("-> Connected");
// Make a HTTP request:
client.print( "GET /add_data.php?");
client.print("temp=");
client.print(temp);
client.println( " HTTP/1.1");
client.println( "Connection: close" );
client.println();
client.println();
client.stop();
}
else {
// you didn't get a connection to the server:
Serial.println("--> connection failed/n");
}

}

Berichten: 27
Geregistreerd: 29 Jun 2014, 20:30

Re: simpele waarde naar mysql database

Berichtdoor barbarossa » 20 Sep 2015, 09:58

ok als ik de regel " client.print(temp);" weg laat en van client.print("temp="); dit maak client.print("temp=50"); krijg ik allemaal 50 in mijn DB dat is goed:)
nu de temp er nog in krijgen

Berichten: 97
Geregistreerd: 05 Nov 2014, 22:04

Re: simpele waarde naar mysql database

Berichtdoor MarcelK » 20 Sep 2015, 17:22

barbarossa schreef:ok als ik de regel " client.print(temp);" weg laat en van client.print("temp="); dit maak client.print("temp=50"); krijg ik allemaal 50 in mijn DB dat is goed:)
nu de temp er nog in krijgen

Goed bezig !
Gaat je vast lukken Bart, kijk even terug naar mijn post hierboven, het stukje omzetten met dtostrf.
is maar paar regeltjes erbij, kan geen kwaad om te proberen nietwaar ?

grt, Marcel

Volgende

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 36 gasten